1、splitChunks
使用SplitChunksPlugin
插件可以将公共的依赖模块提取到已有的 entry chunk 中,或者提取到一个新生成的 chunk。
optimization: {
splitChunks: {
chunks: "all"
}
}
2、动态导入
btn.onclick = e => import(/* webpackChunkName: "print" */ "./print").then(module => {
var print = module.default;
print();
})
推荐使用import() 实现动态引入。
使用动态引入时,不需要在entry设置bundle入口,在output中设置chunkFilename,它决定了非入口chunk名称。
output: {
chunkFilename: '[name].lazybundle.js',
}
我们在import中使用了注释,注释中提供了webpackChunkName,这样会拆分出来命名为print.lazybundle.js的bundle。import() 会返回一个promise,所以需要.then()进行后续操作。这里也可使使用async、await来实现同步效果。
当调用import()方法引用模块时,必须指向模块的.default值,因为它才是promise被处理后返回的实际的module对象。
3、预取、预加载模块(prefetch、preload)
预取(prefetch)
:表示用户在接下来的浏览中可能会用到对应的资源,提示浏览器在空闲的时候获取对应资源。获取资源后不解析。
会生成以下代码并追加到头部,告诉浏览器在闲置时间加载...bundle.js
<link rel="prefetch" href="...bundle.js" />
预加载(preload)
: 下载资源后解析文件。
预取与预加载区别
prefetch | preload | |
---|---|---|
与父chunk执行顺序 | 父chunk加载完成后才进行加载 | 在父chunk加载时进行加载 |
在浏览器中执行时间 | 浏览器闲置时加载 | 在父chunk加载时立即执行 |
4、懒加载
将后续执行的代码从源代码中分离出来,在需要触发时再引入执行。具体见上述动态引入的例子。