最近参加一些面试,经常被问道几个问题,所以回来研究了一下webpack打包优化之:DllPlugin和DllReferencePlugin。 相信很多同学在做项目的时候,随着项目越来越大,执行npm run build的速度也慢慢变慢。那DllPlugin和DllReferencePlugin的作用就是将第三方库的代码跟业务代码抽离,只有当第三方库发生改变的时候才会重新生成,否则每次只需打包业务代码即可,话不多说,开撸吧。(此处默认已经有下载vue-cli项目)
1、准备工作:将默认的webpack.config.js抽离出来
安装vue-cli的同学,webpack.congfig.js一般都是在根目录下面的
2、生成依赖文件manifest.json
const path = require('path')
const webpack = require('webpack');
module.exports = {
entry: {
vendor: [
'axios',
'vue',
'vue-router',
'vuex',
'qs'
]
},
output: {
filename: 'dll/[name].dll.js',
path: path.resolve(__dirname, '../static/js/'),
library: '[name]', // 当前Dll的所有内容都会存放在这个参数指定变量名的一个全局变量下,注意与DllPlugin的name参数保持一致
},
plugins: [
new webpack.DllPlugin({
path: path.resolve(__dirname, './manifest.json'), // 本Dll文件中各模块的索引,供DllReferencePlugin读取使用
name: '[name]',
}),
//压缩 只是为了包更小一点
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false,
drop_console:true,
drop_debugger:true
},
output:{
// 去掉注释内容
comments: false,
},
sourceMap: true
})
],
}
执行该配置文件的package.json配置:
"scripts": {
"dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot --config build/webpack.config.js",
"dll": "webpack -p --progress --config build/webpack.dll.conf.js",
"build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
}
在执行命令之前,需要在项目中建立static/js文件夹,用于存放打包生成的第三方库的js,执行命令:npm run dll,随后就在static/js中生成vendor.dll.js啦,同时在build文件夹中也生成manifest.json文件啦:
3、最后一步!
最后一步,当然是我们的业务代码打包了,回归到第一个问题,其实webpack.config.js一般都是用于业务代码打包,不同的是,之前默认是将所有的程序打包在一起, 但是在第二步已经将第三方库进行打包了,接下来业务代码就无需打包了,就用到了 manifest.json和DllReferencePlugin。 其实很简单,只需要在webpack.config.js中加入如下配置:
plugins: [
new webpack.DllReferencePlugin({
// context: path.resolve(__dirname, '..'),
manifest: require('./manifest.json')
})
]
就可以啦,执行npm run dev就可以打包出业务代码,速度明显比之前快很多!
4、注意事项
第二步打包生成的vendor.dll.js需要在页面中引入,引入的顺序需要在业务代码的前面,否则会报vendor undefined的错误。
结束语
每天进步一点点,笔芯。 若是喜欢,欢迎点赞。