总结篇主要是梳理了一下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"] }] */
6. 在package.json中添加指令就可以。下方指令一个用来手动检测,一个用来手动修复。注意:不添加/** 无法检测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
未完待续。。。。。。。。。。。