Webpack学习系列(十三)/优化vue项目构建速度/webpackchain(持续更新)

1,337 阅读5分钟

        总结篇主要是梳理了一下webpack整体的打包流程,对webpack有了更深的了解。在平常开发中,更多的是对webpack配置进行优化,以提高打包效率。

        公司的项目用的vue,因此对vue-cli4创建项目后的默认webpack进行一些优化。在vue-cli文档中推荐webpack-chain对vue进行配置。如果看过vue-cli的源码会发现,vue-cli在创建webpack配置的时候的确都是用webpack-chain的,没有写过config文件。因此只能通过vue inspect指定来窥见webpack的options,不能输出最终的options。

        惯例在根目录创建vue.config.js,在代码块内就可以利用chainWebpack对webpack的options进行配置了

module.exports = { 
    chainWebpack: config => {
        //...略
    }
}

        优化一:别名

        在开发中,我们可能会有自己写的公共库/公共组件,因此在引入的时候需写引入文件的路径,如果文件夹层级相差太多,就会导致出现很多的../影响体验。因此可以使用webpack的alias属性进行优化。

module.exports = {    chainWebpack: config => {        config.resolve.alias            .set("@", resolve("src"))            .set("assets", resolve("src/assets"))            .set("components", resolve("src/components"))            .set("public", resolve("public"))            .set("common", resolve("src/common"))            .set("network", resolve("src/network"))            .set("views", resolve("src/views"))            .set("router", resolve("src/router"))            .set("store", resolve("src/store"))            .set("mock", resolve("src/mock"))            .set("tests", resolve("tests"))    }}

        优化二:html-webpack-externals-plugin

        vue项目除了vue.js框架之外,最常用的就是element-ui,对于此类常用库,我们有两种方法:1. splitChunks;2. html-webpack-externals-plugin使webpack不打包此类库,再从外部cdn引入。

        第一种方法虽然可以提取出基础库,但是每次打包的时候还是会进行打包,影响构建速度,因此采用第二种方法既可以提取基础库,又可以加快打包速度。此外,对于这种不会经常变更的基础库,用户的浏览器在第一次加载后就会缓存基础库文件。在第二次加载的时候不会重复加载,只要读取浏览器缓存即可。这也利用缓存加快了网页速度。一举三得。

        

下图是课程中webpack.prod.js的html-webpack-externals-plugin插件配置


下方是vue项目中利用webpack-chain使用html-webpack-externals-plugin范例。

注:下方代码中调用了两次end()函数,每次调用end()就返回上级属性。如:第一次调用end方法回到resolve属性,再次调用end方法回到config属性。再在config层级调用plugin方法。user方法有两个参数:第一个是html-webpack-externals-plugin插件;第二个是插件的参数。注意这里参数要用[]包裹,否则会报错:TypeError: Found non-callable @@iterator。

module.exports = {    chainWebpack: config => {        config.resolve.alias            .set("@", resolve("src"))            .set("assets", resolve("src/assets"))            .set("components", resolve("src/components"))            .set("public", resolve("public"))            .set("common", resolve("src/common"))            .set("network", resolve("src/network"))            .set("views", resolve("src/views"))            .set("router", resolve("src/router"))            .set("store", resolve("src/store"))            .set("mock", resolve("src/mock"))            .set("tests", resolve("tests"))            .end()            .end()            .plugin('HtmlWebpackExternalsPlugin')            .use(require('html-webpack-externals-plugin'),                [{                    externals:[{                        module: 'vue',                        entry: 'https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.min.js',                        global: 'Vue'                    },{                        module: 'element-ui',                        entry:'https://cdnjs.cloudflare.com/ajax/libs/element-ui/2.13.2/index.js',                    }]                }])    }}

        通过提取常用的库如vue, elementui使得打包vender文件体积大幅减小。这里css没有缩小,是由于只提取了element-ui的js文件,它仍然有css文件要引入。



        注:在venders下方文件中存在了另一个500kb的构建文件,需要关闭丑化插件,来看看到底是什么?以缩小体积

        优化三:添加webpack打包效率插件

        优化四:添加ESLint插件,自动检测代码

        ESlint的基本使用:

        1. npm i eslint -D

        2. eslint --init 根据提示一步一步选择即可

        3. 根目录创建.eslintignore 其用法与gitignore相同。

        /src/assets/** 忽略所有的文件夹及文件

         4. 对于webpack优化中的别名,如果没有任何设置eslint会报错,因此要特殊设置,如下图所示

                                                  


         5. 对于VueX的报错处置:在store的js文件顶部添加下方两行注释即可

         /* eslint no-shadow: ["error",{ "allow": ["state"] }] */

         /* eslint no-param-reassign: ["error", { "props": false }] */

         6. 在package.json中添加指令就可以。下方指令一个用来手动检测,一个用来手动修复。注意:不添加/** 无法检测src文件夹下所有文件。

         "lint": "eslint ./src/**",
         "fix": "eslint --fix ./src/**"

         7. 配置webpack进行自动检查

          1) npm i eslint eslint-loader eslint-friendly-formatter -D

          2) vue.config.js配置,只在开发环境的时候要求开启eslint。

                   

        8. vscode 插件的配置 安装eslint和prettier

        1)修改settings.json文件

                 

        2)npm i eslint-config-prettier eslint-plugin-prettier -D

        3)修改eslint配置文件


       4)关闭vscode的vuetr插件对js代码的自动修改



在公司电脑上配置的时候碰到一些问题,ES6 import的时候识别不了alias,不知道是不是因为老版本的问题,公司的vscode是1.35.1,为了保险起见,按照以下步骤解决:

1.  npm i eslint-import-resolver-alias eslint-plugin-import -D

2. 在eslint的配置文件

       1)alias对象下添加 "extensions": [".js", ".vue"]。

       2)extends对象下添加 "plugin:import/errors", "plugin:import/warnings"

       3)"plugins"数组内添加import

未完待续。。。。。。。。。。。