美文网首页
减少 webpack 打包时间之 DllPlugin 预编译

减少 webpack 打包时间之 DllPlugin 预编译

作者: Axiba | 来源:发表于2020-03-30 16:18 被阅读0次

没错,接手的项目打包时间又是巨慢

DllPlugin 也是我们可以采用的有效方法之一

DllPlugin 可以将特定的类库提前打包然后引入。这种方式可以极大的减少打包类库的次数,只有当类库更新版本才有需要重新打包,并且也实现了将公共代码抽离成单独文件的优化方案

首先安装 webpack-cli

cnpm install webpack-cli --save-dev 

新建 webpack.dll.config.js 文件处理 dll 插件配置

const path = require('path')
const webpack = require("webpack");
var config = require('./config');

module.exports = {
    entry: config.library,
    output: {
        path: path.join(__dirname, "public/vendor"),
        filename: "[name].dll.js",
        library: "[name]_[hash]" // vendor.dll.js中暴露出的全局变量名
    },
    plugins: [
        new webpack.DllPlugin({
            // manifest缓存文件的请求上下文
            context: process.cwd(),

            // manifest.json文件的输出位置
            path: path.join(__dirname, 'public/vendor', '[name]-manifest.json'),

            // 定义打包的公共vendor文件对外暴露的函数名
            name: '[name]_[hash]'
        })
    ]
}

新建配置打包入口文件 config/index.js, 这里映射的是上面 dll.config.js 中 entry 入口的配置,在下面可以对入口文件做一些分组:

module.exports = {
  // 定义程序中打包公共文件的入口文件
  library: {
    vue: ['vue', 'vuex', 'vue-router', 'axios', 'crypto-js',
      'lodash.get', 'lodash.pick', 'lodash.remove', 'md5', 'dayjs', 'xml2js'],
    antvue: ['ant-design-vue'],
    viser: ['viser-vue'],
    tinymce: ['tinymce'],
    codemirror: ['codemirror'],
    antv: ['@antv/data-set'],
    bpm: ['bpmn-js', 'bpmn-moddle', 'camunda-bpmn-moddle']
  }
}

vue.config.js 文件中,需要在configureWebpack中配置忽略已编译的文件:

const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin')
const webpack = require('webpack')

.....

configureWebpack: config => { 

    if (process.env.NODE_ENV === 'production') {
      config.plugins = [
        ...config.plugins,
        ...Object.keys(dllConfig.library).map(name => {
          return new webpack.DllReferencePlugin({
            context: '.',
            manifest: require(`./public/vendor/${name}-manifest.json`),//引入打包后生生成的manifest文件
          })
        }),
        new AddAssetHtmlPlugin({
          // dll文件位置
          filepath: path.resolve(__dirname, './public/vendor/*.js'),
          // dll 引用路径
          // publicPath: process.env.VUE_APP_PUBLIC_PATH ? process.env.VUE_APP_PUBLIC_PATH + 'vendor' : '/vendor',
          publicPath: './vendor',
          // dll最终输出的目录
          outputPath: './vendor'
        })
      ]
    }
  },

package.json 增加操作命令:

"dll": "webpack -p --progress --config ./webpack.dll.config.js",

如果,每次更改了上诉预编译的文件,需要重新执行 npm run dll ,并且更新到运行环境上

其他还有像, 优化loader就是缩小范围、happypack多线程打包毕竟node 是单线程的、升级webpack毕竟越高级处理的东东越多、通过别名映射文件路径毕竟webpack可以更快找到文件等等

相关文章

网友评论

      本文标题:减少 webpack 打包时间之 DllPlugin 预编译

      本文链接:https://www.haomeiwen.com/subject/vxuvuhtx.html