React 组件按需加载方案对比
在前端开发中,代码分割和按需加载是提升应用性能的重要手段。本文将对几种React组件按需加载的方案进行分析,并给出每种方案的示例代码。
方案对比
方案 | Weekly Downloads(npm) | Unpacked Size(npm) | Stars(github) | 使用难易度 | 使用后产物体积变化 | 特点 |
---|---|---|---|---|---|---|
import() + @babel/plugin-syntax-dynamic-import | - | - | - | 需要稍微封装一下 | 有限制 | 适用于非组件资源、父组件引入子组件 |
React.lazy | - | - | - | 容易上手 | +0 | 官方提供,容易上手 |
react-loadable | 287,296 | 47.5 kB | 16.6k | 容易上手 | +17.2 KB | 容易上手 |
@loadable/component | 441,718 | 95 kB | 7.6k | 容易上手 | +15.79 KB | 容易上手 |
以上数据截止于 20240716
方案说明
1. import()
+ @babel/plugin-syntax-dynamic-import
import()
是 JavaScript 原生的动态引入语法,可以用于按需加载模块。结合 Babel 插件 @babel/plugin-syntax-dynamic-import,可以在 React 项目中使用这种语法。
特点
- 不适用于
router
包裹的组件 - 可用于父组件引入子组件
- 适用于按需加载某些非组件资源
2. React.lazy + Suspense
React.lazy 是 React 官方提供的用于动态加载组件的 API,结合 Suspense 组件可以实现组件的按需加载。
特点
- 容易上手
- 无需引入额外的依赖包
示例代码
import React, { Suspense } from 'react';
const LazyComponent = React.lazy(() => import('./LazyComponent'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<LazyComponent />
</Suspense>
);
}
3. react-loadable
react-loadable 是一个轻量级的代码分割组件库,允许在需要的时候加载组件,适用于在 React 应用中进行代码分割。
特点
- 容易上手
- 未压缩前仅有 17.2 KB,对代码总体积影响不大
示例代码
import Loadable from 'react-loadable';
const LoadableComponent = Loadable({
loader: () => import('./LazyComponent'),
loading: () => <div>Loading...</div>,
});
function App() {
return <LoadableComponent />;
}
4. @loadable/component
@loadable/component 是一个用于按需加载 React 组件的库,支持配置和丰富的功能。
特点
- 容易上手
- 未压缩前仅有 15.79 KB,对代码总体积影响不大
示例代码
import loadable from '@loadable/component';
const LoadableComponent = loadable(() => import('./LazyComponent'));
function App() {
return <LoadableComponent />;
}
服务端渲染
对于服务端渲染的项目,React.lazy 和 Suspense 目前还不支持服务端渲染,可以选择使用 react-loadable 或 @loadable/component,这两个库都支持服务端渲染。
示例代码(@loadable/component + 服务端渲染)
// 服务端入口文件
import { ChunkExtractor } from '@loadable/server';
import express from 'express';
import path from 'path';
import React from 'react';
import { renderToString } from 'react-dom/server';
import App from './App';
const statsFile = path.resolve('./build/loadable-stats.json');
const extractor = new ChunkExtractor({ statsFile });
const app = express();
app.use(express.static('build'));
app.get('*', (req, res) => {
const jsx = extractor.collectChunks(<App />);
const html = renderToString(jsx);
res.send(`
<!doctype html>
<html>
<head>${extractor.getLinkTags()}</head>
<body>
<div id="root">${html}</div>
${extractor.getScriptTags()}
</body>
</html>
`);
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
以上内容为对React组件按需加载方案的分析与示例代码
小结
综合来看,项目中可以使用 React.lazy,即官方提供的方案,容易上手且不需要引入额外的依赖包。如果是服务端渲染,还需要分析各方案是否支持以及使用成本。根据项目需求选择合适的方案,可以有效提升应用性能并优化用户体验。
转载自:https://juejin.cn/post/7392070976093913151