vue cli升级webapck4总结


Posted in Javascript onApril 04, 2018

webpack4 released 已经有一段时间了,插件系统趋于平稳,适逢对webpack3的打包速度很不满意,因此决定将当前在做的项目进行升级,正好也实践一下webpack4。

新特性

0配置

应该是parcel出来以后,webpack团队意识到其配置确实有点复杂,不太容易上手。so, webapck4 开始支持0配置启动。不过,万变不离其宗,webpack4的0配置也只是支持了默认entry 和 output而已,即默认entry为./src,默认output为/dist。

模式选择mode

mode有两个可选项,production & development。作为必选项,mode是不可缺省的。在production模式下,会默认做一些必要的优化,如代码压缩和作用域提升,还会默认指定process.env.NODE_ENV 为 production。在development模式下,优化了增量构建,支持注释和提示,并且支持 eval 下的 source maps,同时默认指定process.env.NODE_ENV 为 development。

sideEffects

通过该配置可以大幅度减小打包体积。当模块的 package.json 配置sideEffects:false表明该模块没有副作用,也就意味着 webpack 可以安全地清除被用于重复导出(re-exports)的代码。

模块类型

webpack4提供了5种模块类型。

  1. json: 可通过 require 和 import 导入的 JSON 格式的数据(默认为 .json 的文件)
  2. webassembly: WebAssembly 模块,(目前是 .wasm 文件的默认类型)
  3. javascript/auto: (webpack 3中的默认类型)支持所有的JS模块系统:CommonJS、AMD。
  4. javascript/esm: EcmaScript模块(默认 .mjs 文件)。
  5. javascript/dynamic: 仅支持 CommonJS & AMD。

JSON

webpack 4 不仅支持本地处理 JSON,还支持对 JSON 的 Tree Shaking。当使用 ESM 语法 import json 时,webpack 会消除掉JSON Module 中未使用的导出。此外,如果要用 loader 转换 json 为 js,需要设置 type 为 javascript/auto。

optimization

Webpack 4 删除了 CommonsChunkPlugin,并默认启用了它的许多功能。因此webpack4可以实现很好的默认优化。但是,对于那些需要自定义的缓存策略,增加了 optimization.splitChunks 和 optimization.runtimeChunk。具体解释可参考这篇文章,解释得很详细。RIP CommonsChunkPlugin点击预览

手把手升级

我是把原来vue cli的项目做了一下升级,总体来说,升级还算是比较顺利步骤,这里我们分成两步走,首先升级相关依赖的插件,然后优化webapck配置文件。

升级插件

首先要把下面列表的插件升级到对应版本或者最新版本

webpack@4.4.1
css-loader@0.28.10,
extract-text-webpack-plugin@4.0.0-beta.0,
file-loader@1.1.11,
html-webpack-plugin@3.1.0,
optimize-css-assets-webpack-plugin@4.0.0,
url-loader@1.0.1,
vue-loader@14.2.2,
vue-style-loader@4.1.0,
vue-template-compiler@2.5.16,
webpack-bundle-analyzer@2.11.1,
webpack-dev-middleware@3.1.0,
webpack-dev-server@3.1.1,
webpack-hot-middleware@2.21.2

如果遇到其他包报错,应该是升级到最新的就可以解决了。

更新配置文件

webpack.dev.conf.js

dev环境变化不大,毕竟webpack4很大一部分的优化都是针对生产环境的,该文件我们只需要删除一些不再需要的插件既可以。例如:webpack.NamedModulesPlugin、webpack.NoEmitOnErrorsPlugin,其功能webpack4已经默认配置。同时,要设置

mode: 'development'
webpack.production.conf.js

webvpack4中改动最大,影响也最大的就是webpack4使用optimization.splitChunks替代了CommonsChunkPlugin。以前的CommonsChunkPlugin主要用来抽取代码中的共用部分,webpack runtime之类的代码,结合chunkhash,实现最好的缓存策略。而optimization.splitChunks则实现了相同的功能,并且配置更加灵活,具体解释可参考这篇文章,解释得很详细。

mode: 'production',
optimization: {
splitChunks: {
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
chunks: 'initial',
name: 'vendors',
},
'async-vendors': {
test: /[\\/]node_modules[\\/]/,
minChunks: 2,
chunks: 'async',
name: 'async-vendors'
}
}
},
runtimeChunk: { name: 'runtime' }
}

总结

总体来说本次升级还算顺利,不到一天搞定,目前感觉,打包速度大约优化了70%左右,同时打包后的代码体积也有了很大的优化,带来的效果很显著的。

Javascript 相关文章推荐
JavaScript面向对象之Prototypes和继承
Jul 12 Javascript
jQuery提示插件alertify使用指南
Apr 21 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
Oct 09 Javascript
AngularJS 工作原理详解
Aug 18 Javascript
微信小程序 五星评价功能的实现
Mar 09 Javascript
jQuery简易时光轴实现方法示例
Mar 13 Javascript
详解angularjs利用ui-route异步加载组件
May 21 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
Aug 17 Javascript
tangram.js库实现js类的方式实例分析
Jan 06 Javascript
JS处理一些简单计算题
Feb 24 Javascript
Vue引入sass并配置全局变量的方法
Jun 27 Javascript
vue 兄弟组件的信息传递的方法实例详解
Aug 30 Javascript
JavaScript实现短暂提示框功能
Apr 04 #Javascript
Vue filter介绍及详细使用
Apr 04 #Javascript
在Vue项目中引入腾讯验证码服务的教程
Apr 03 #Javascript
详解如何用babel转换es6的class语法
Apr 03 #Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
Apr 03 #Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
Apr 03 #Javascript
使用react实现手机号的数据同步显示功能的示例代码
Apr 03 #Javascript
You might like
PHP连接access数据库
2008/03/27 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
filemanage功能中用到的common.js
2007/04/08 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
javascript制作的简单注册模块表单验证
2015/04/13 Javascript
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
js实现九宫格的随机颜色跳转
2017/02/19 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
Angular 封装并发布组件的方法示例
2018/04/19 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
[43:35]TI4 循环赛第二日Liquid vs Fnatic
2014/07/11 DOTA
Python 字典dict使用介绍
2014/11/30 Python
python检测远程udp端口是否打开的方法
2015/03/14 Python
Python做简单的字符串匹配详解
2017/03/21 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
椰子猫砂:CatSpot
2018/08/27 全球购物
公司薪酬管理制度
2014/01/31 职场文书
新护士岗前培训制度
2014/02/02 职场文书
2016年春节慰问信息
2015/03/25 职场文书
《颐和园》教学反思
2016/02/19 职场文书
CSS 圆形进度栏
2021/04/06 HTML / CSS
学会Python数据可视化必须尝试这7个库
2021/06/16 Python
了解Kubernetes中的Service和Endpoint
2022/04/01 Servers