使用DllPlugin优化
- 在使用webpack进行打包时候,对于依赖的第三方库,如react,react-dom等这些不会修改的依赖,可以让它和业务代码分开打包;
- 只要不升级依赖库版本,之后webpack就只需要打包项目业务代码,遇到需要导入的模块在某个动态链接库中时,就直接去其中获取;而不用再去编译第三方库,这样第三方库就只需要打包一次。
- 接入需要完成的事:
1. 将依赖的第三方模块抽离,打包到一个个单独的动态链接库中
2. 当需要导入的模块存在动态链接库中时,让其直接从链接库中获取
3. 项目依赖的所有动态链接库都需要被加载
1. DllPlugin插件:用于打包出一个个单独的动态链接库文件;
2. DllReferencePlugin:用于在主要的配置文件中引入DllPlugin插件打包好的动态链接库文件
- 配置webpack_dll.config.js构建动态链接库
- const path = require('path');
- const DllPlugin = require('webpack/lib/DllPlugin');
- module.exports = {
- mode: 'production',
- entry: {
- // 将React相关模块放入一个动态链接库
- react: ['react','react-dom','react-router-dom','react-loadable'],
- librarys: ['wangeditor'],
- utils: ['axios','js-cookie']
- },
- output: {
- filename: '[name]-dll.js',
- path: path.resolve(__dirname, 'dll'),
- // 存放动态链接库的全局变量名,加上_dll_防止全局变量冲突
- library: '_dll_[name]'
- },
- // 动态链接库的全局变量名称,需要可output.library中保持一致,也是输出的manifest.json文件中name的字段值
- // 如react.manifest.json字段中存在"name":"_dll_react"
- plugins: [
- new DllPlugin({
- name: '_dll_[name]',
- path: path.join(__dirname, 'dll', '[name].manifest.json')
- })
- ]
- }
- const DllReferencePlugin = require('webpack/lib/DllReferencePlugin');
- ...
- plugins: [
- // 告诉webpack使用了哪些动态链接库
- new DllReferencePlugin({
- manifest: require('./dll/react.manifest.json')
- }),
- new DllReferencePlugin({
- manifest: require('./dll/librarys.manifest.json')
- }),
- new DllReferencePlugin({
- manifest: require('./dll/utils.manifest.json')
- }),
- ]
- 注意:在webpack_dll.config.js文件中,DllPlugin中的name参数必须和output.library中的一致;因为DllPlugin的name参数影响输出的manifest.json的name;而webpack.pro.config.js中的DllReferencePlugin会读取manifest.json的name,将值作为从全局变量中获取动态链接库内容时的全局变量名
1. webpack --progress --colors --config ./webpack.dll.config.js
2. webpack --progress --colors --config ./webpack.prod.js
- html中引入dll.js文件
- 构建时间对比:["11593ms","10654ms","8334ms"]
(编辑:西双版纳站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|