DllPlugin 和 DLLReferencePlugin
一、认识
有些时候,如果所有的JS
文件都打成一个JS
文件,会导致最终生成的JS
文件很大,这个时候,我们就要考虑拆分 bundles
。
DllPlugin
和 DLLReferencePlugin
可以实现拆分 bundles
,并且可以大大提升构建速度,DllPlugin
和 DLLReferencePlugin
都是 webpack
的内置模块。
我们使用 DllPlugin
将不会频繁更新的库进行编译,当这些依赖的版本没有变化时,就不需要重新编译。
二、语法
-
新建一个
webpack
的配置文件,来专门用于编译动态链接库,例如名为:webpack.config.dll.js
//webpack.config.dll.js
const webpack = require('webpack');
const path = require('path');
module.exports = {
entry: {
react: ['react', 'react-dom']
},
mode: 'production',
output: {
filename: '[name].dll.[hash:6].js',
path: path.resolve(__dirname, 'dist', 'dll'),
library: '[name]_dll' //暴露给外部使用
//libraryTarget 指定如何暴露内容,缺省时就是 var
},
plugins: [
new webpack.DllPlugin({
//name和library一致
name: '[name]_dll',
path: path.resolve(__dirname, 'dist', 'dll', 'manifest.json') //manifest.json的生成路径
})
]
} -
在
package.json
的scripts
中增加:{
"scripts": {
"dev": "NODE_ENV=development webpack-dev-server",
"build": "NODE_ENV=production webpack",
"build:dll": "webpack --config webpack.config.dll.js"
},
}执行
npm run build:all
,可以看到dist
目录如下,之所以将动态链接库单独放在dll
目录下,主要是为了使用CleanWebpackPlugin
更为方便的过滤掉动态链接库。 -
修改
webpack
的主配置文件:webpack.config.js
的配置//webpack.config.js
const webpack = require('webpack');
const path = require('path');
module.exports = {
//...
devServer: {
contentBase: path.resolve(__dirname, 'dist')
},
plugins: [
new webpack.DllReferencePlugin({
manifest: path.resolve(__dirname, 'dist', 'dll', 'manifest.json')
}),
new CleanWebpackPlugin({
cleanOnceBeforeBuildPatterns: ['**/*', '!dll', '!dll/**'] //不删除dll目录
}),
//...
]
} -
修改
public/index.html
文件,在其中引入react.dll.js
<script src="/dll/react.dll.9dcd9d.js"></script>