美文网首页
webpack-DllPlugin优化打包性能(基于vue-cl

webpack-DllPlugin优化打包性能(基于vue-cl

作者: 薄荷味奶糖 | 来源:发表于2019-06-27 11:45 被阅读0次

    未进行打包优化的痛点:

      随着项目的不断扩大,引入的第三方库会越来越多,我们每次build的时候会对所有的文件进行打包,耗时必定很长,不利于日常开发。

    解决思路:

      第三方库我们只是引入到项目里来,一般不会经常性的去修改源码,一般都是在src目录下编写业务代码,因此可以把第三方依赖和src分开打包。

      每次build的时候我们只需要把之前build好的第三方依赖文件引入到项目中即可,避免了我们每次build的时候都会build第三方依赖。

      当第三方依赖发生改变的时候我们只需要把第三方依赖再build一次就行。

    步骤一:构建项目 引入第三方依赖

    ## 初始化项目

    vue init webpack test

    cd test

    npm run dev

    ##安装依赖模块(静态资源)

    npm i element-ui -S

    ##在main.js引入element-ui

    import Vue from 'vue'

    import ElementUI from 'element-ui'

    import 'element-ui/lib/theme-chalk/index.css'

    import App from './App'

    import router from './router'

    Vue.use(ElementUI)

    Vue.config.productionTip = false

    /* eslint-disable no-new */

    new Vue({

      el: '#app',

      router,

      components: { App },

      template: '<App/>'

    })

    ##编译打包

    npm run build

    可以看见Time:15850ms,打包花费了近16秒,如果以后还要加上各种包及其他行为,打包时间难以想象。这也就是我们为什么要引入dllPlugin的原因!

    步骤二:使用DllPlugin插件把第三方依赖抽离出来

    ##在build文件夹下创建webpack.dll.conf.js

    内容如下:

    'use strict'

    const path = require("path");

    const webpack = require("webpack");

    module.exports = {

    // 你想要打包的模块的数组

      entry: {

        vendor: ['vue', 'vue-router', 'element-ui']

      },

      output: {

        path: path.join(__dirname, '../static/js'),    // 打包后文件输出的位置

        filename: '[name].dll.js',

        library: '[name]_library'

    // vendor.dll.js中暴露出的全局变量名。

     // 主要是给DllPlugin中的name使用,

     // 故这里需要和webpack.DllPlugin中的`name: '[name]_library',`保持一致。

      },

      plugins: [

        new webpack.DllPlugin({

          path: path.join(__dirname, '../static', '[name]-manifest.json'),

          name: '[name]_library',

          context: __dirname

        })

      ]

    };

    ##修改webpack.prod.conf.js文件

    在plugins中添加

    //打包优化

        new webpack.DllReferencePlugin({

          context: __dirname,

          manifest: require('../static/vendor-manifest.json')

        }),

    ##package.json中scripts下加入该命令"dll": "webpack --config build/webpack.dll.conf.js"

    "scripts": {

        "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",

        "start": "npm run dev",

        "lint": "eslint --ext .js,.vue src",

        "build": "node build/build.js",

        "dll": "webpack --config ./build/webpack.dll.conf.js"

      }

    ##执行下npm run dll 命令将第三方依赖进行打包

    static文件下生成vendor-manifest.json文件和js/vendor.dll.js文件

    ##再执行npm run build打包文件

    打包时间为8s,快了一倍

    步骤三:进一步优化

    ##找到webpack.base.conf.js文件发现

    resolve: {

        extensions: ['.js', '.vue', '.json'],

        alias: {

          'vue$': 'vue/dist/vue.esm.js',

          '@': resolve('src'),

        }

      }

    这就代表main.js中的import Vue from 'vue' 其实是引用的'vue/dist/vue.esm.js',而webpack.dll.config.js并不知道vue指代的是'vue/dist/vue.esm.js',所以我们需要修改webpack.dll.config.js配置:

    entry: {

        vendor: ['vue', 'vue-router', 'element-ui']

      }

    改为:

    entry: {

        vendor: ['vue/dist/vue.esm.js', 'vue-router', 'element-ui']

      },

    ##并且在plugins中添加如下内容(压缩打包后的文件)

    //压缩打包文件

        new webpack.optimize.UglifyJsPlugin({

          compress: {

            warnings: false

          }

        })

    ##修改webpack.base.conf.js文件,build打包时引入dll库。

    cnpm i html-webpack-include-assets-plugin -S

    添加

    const IncludeAssetsPlugin = require('html-webpack-include-assets-plugin')

    在module.exports下添加plugins

    plugins:[

        new IncludeAssetsPlugin({

          assets: [`${config.build.assetsSubDirectory}/js/vendor.dll.js`],

          append: false

        }),

      ]

    ##由于我们修改了webpack.dll.config.js,所以我们需要重新打包:

    ## 重新打包npm run dll

    ## 重新打包源文件npm run build

    不到6s

    欧凯,这只是一种优化的方式,还有其他可优化的部分,后续继续添加。

    赶紧去解决打包时间过长的烦恼吧。

    相关文章

      网友评论

          本文标题:webpack-DllPlugin优化打包性能(基于vue-cl

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