代码分割策略
- 按路由分割:对于单页应用(SPA),可以按照路由进行代码分割。例如在使用 React Router 或 Vue Router 时,将每个路由对应的组件单独打包成一个 Chunk。这样,只有在用户访问到对应的路由时,才会加载相应的 Chunk 文件,减少初始加载的代码量。
// React Router 示例
const routes = [
{
path: '/home',
component: React.lazy(() => import('./Home'))
},
{
path: '/about',
component: React.lazy(() => import('./About'))
}
];
- 按功能模块分割:将功能相对独立的模块单独打包。比如一个电商应用中,将商品列表、购物车、用户登录等功能模块分别打包成不同的 Chunk。这样可以避免无关功能的代码在不必要的时候被加载。
// 按功能模块分割示例
const cart = React.lazy(() => import('./Cart'));
const productList = React.lazy(() => import('./ProductList'));
- 动态导入公共模块:对于多个 Chunk 可能都会用到的公共模块,不要重复打包在每个 Chunk 中。可以使用动态导入,将公共模块单独提取出来,在需要时加载。例如,多个页面都用到的
lodash
库,可以这样处理:
// 动态导入公共模块
const _ = React.lazy(() => import('lodash'));
命名规则
- 语义化命名:Chunk 文件的命名应该能够清晰地反映其内容。例如,以路由名称或功能模块名称命名。对于首页路由对应的 Chunk,可以命名为
home.chunk.js
,购物车功能模块对应的 Chunk 命名为 cart.chunk.js
。这样在调试和维护时,能够快速定位 Chunk 文件的用途。
- 添加哈希值:在 Chunk 文件名中添加哈希值,如
home.[contenthash].chunk.js
。哈希值是根据文件内容生成的,文件内容变化时哈希值也会改变。这样可以有效利用浏览器缓存,当 Chunk 文件内容未改变时,浏览器可以直接从缓存中加载,提高加载速度。
加载优先级
- 关键 Chunk 优先加载:对于首屏渲染所必需的 Chunk 文件,提高其加载优先级。例如,在 React 应用中,与首屏组件相关的 Chunk 可以使用
preload
或 prefetch
指令。preload
会告诉浏览器在页面加载阶段就开始加载指定资源,并且会优先加载。
<link rel="preload" href="home.chunk.js" as="script">
- 按需加载非关键 Chunk:对于非首屏必需的 Chunk 文件,采用按需加载的方式。在用户与页面进行交互或者特定条件满足时再加载。比如,一个页面的侧边栏功能,用户点击侧边栏按钮时才加载相关的 Chunk 文件。
// 点击按钮加载 Chunk
const sidebarButton = document.getElementById('sidebarButton');
sidebarButton.addEventListener('click', () => {
import('./sidebar.chunk.js').then(module => {
// 执行侧边栏相关逻辑
});
});