webpack4的迁移的使用方法


Posted in Javascript onMay 25, 2018

感觉是突然之间,webpack4的消息就满天飞了,听说打包速度提高了很多,还有最大的噱头是实现了零配置,leader有一天就吩咐我说,有时间把我们的项目也升个级呗。好嘞。

1.x到2.x

这次升级跨度比较大,我们是从webpack1.x升级到4.x,因为1.x与2.x相差挺大,所以第一件事,就是先升到2.x,比较大的改动就是loader的配置方式

// 1.x
preLoaders: [
 {
  test: /\.vue$/,
  loader: 'eslint',
  exclude: /node_modules/
  }, {
  test: /\.js$/,
  loader: 'eslint',
  exclude: /node_modules/
  }
],
loaders: [
 { test: /\.vue$/, loader: 'vue' },
 { test: /\.json$/, loader: 'json' },
 { test: /\.html$/, loader: 'html' },
...
]
//2.x
module: {
  rules: [
  {
   test: /.vue$/,
   use: 'eslint-loader',
   enforce: 'pre', // 对应1.x的preLoaders
   exclude: /node_modules/
   }, {
   test: /.js$/,
   use: 'eslint-loader',
   enforce: 'pre',
   exclude: /node_modules/
   },
   { test: /\.vue$/, use: 'vue-loader' },
   { test: /\.json$/, use: 'json-loader' },
   { test: /\.html$/, use: 'html-loader' },
  ...
  ]
},

而且loader一定要写完整,vue-loader如果只写vue会报错。loader还可以通过options进行配置。

{
 loader: 'css-loader',
 options: {
  autoprefixer: false
 }
}

旧版的链式调用也用数组替代。

1.x

style!postcss!less

2.x

use: [
  "style-loader",
  "css-loader",
  "less-loader"
 ]

webpack2.x默认支持es6的模块,所以在编译时候没有必要将它们先转换CommonJS模块再处理,babel-preset-es2015-webpack已经支持不转换模块中的importexport,只需要设置.babelrc

"presets": [
 ["es2015", { "modules": false }]
]

另外就是插件的升级,运行时哪个插件报错就升级哪个插件,屡试不爽。

2.x到4.x

第一步:版本升级

  1. 不再支持node 4,可以直接升级到8.x版本
  2. webpack升级
npm install webpack@4 --save

npm install webpack-cli --save // 不要忘记这一点,用来启动webpack的

插件升级,同理,哪个报错就升级哪个,除了html-webpack-plugin用下面的方法升级,原因是作者还未来得及升级

npm i webpack-contrib/html-webpack-plugin --save-dev

extract-text-webpack-plugin只有最新的beta版本才支持,所以npm install extract-text-webpack-plugin@next --save-dev

第二步 运行命令中添加 --mode development--mode production

PS:虽然说webpack 4是零配置,入口默认是src/index.js,出口是dist/,但由于项目是多页面的,所以这一步并没有省略,根据实际情况来。

第三步 移除CommonsChunkPlugin

//替代方案
module: {
 rules: [
 ...
 ]
},
optimization: {
 splitChunks: {
 chunks: "all",   // 必须三选一:'initial' | 'all' | 'async'
 minSize: 0,    
 minChunks: 1,
 maxAsyncRequests: 1,
 maxInitialRequests: 1,
 name: () => {},
 cacheGroups: {
  vendor: {
   chunks: 'all',
   test: /node_modules/,  // 正则规则验证,如果符合就提取chunks
   name: "vendor"   // 要缓存的分割出来的chunk名称
  },
  default: {
   chunks: 'all',
   name: 'commons',
   reuseExistingChunks: true
  }
 }
 }
}

因为多个页面,所以结合了html-webpack-plugin

new HtmlWebpackPlugin({
 template: 'index.html',
 chunks: ['vendor', 'commons', 'index']
 })

刚开始一直出错,是因为我没有复写default,也没有default:false,所以其实默认配置有将所有的模块的公共部分分离到某个文件中,但我在HtmlWebpackPlugin中的chunks中又没有添加,所以要么覆写原来的默认配置,要么就关闭默认配置。

第四步:配置postcss autoprefixer

在根目录下创建一个文件`postcss.config.js`

module.exports = {
 plugins: [
  require('postcss-inline-svg')({
   removeFill: false
  }),
  require('postcss-pxtorem')({
   replace: process.env.NODE_ENV === 'production',
   rootValue: 750 / 16,
   minPixelValue: 1.1,
   propWhiteList: [],
   unitPrecision: 5
  }),
  require('autoprefixer')({browsers: ['iOS>7', 'Android>4']})
 ]
};

...
 {
  test: /\.(css|less)$/,
  use: ExtractTextPlugin.extract({
   fallback: 'style-loader',
   use:[{
   loader: 'css-loader',
   options: {
    autoprefixer: false
   }
   },
   {
   loader: 'postcss-loader',
   options: {
    sourceMap: true
   }
   },
   {
   loader: 'less-loader',
   options: {
    relativeUrls: true
   }
   }]
  })
 },
...

第五步:不需要UglifyJsPlugin插件

只需要设置optimization.minimize: true就行,production mode下面自动为true

以上只是在原有项目的基础上对webpack 4的升级,还有一些特性并没有用到,所以没有提及,比如sideEffectsjavascript/auto javascript/esm javascript/dynamicwebassembly/experimental等等,有机会再去探索。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript日期对象的dateAdd与dateDiff方法
Nov 18 Javascript
仿JQuery输写高效JSLite代码的一些技巧
Jan 13 Javascript
js鼠标点击图片切换效果代码分享
Aug 26 Javascript
BootStrap 弹出层代码
Feb 09 Javascript
在bootstrap中实现轮播图实例代码
Jun 11 Javascript
JavaScript文件的同步和异步加载的实现代码
Aug 19 Javascript
15个顶级开源JavaScript框架和库
Oct 10 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
May 28 Javascript
通过实例了解JS执行上下文运行原理
Jun 17 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
Sep 14 Javascript
js实现自定义滚动条的示例
Oct 27 Javascript
js加减乘除精确运算方法实例代码
Jan 17 Javascript
最后说说Vue2 SSR 的 Cookies 问题
May 25 #Javascript
详解webpack4多入口、多页面项目构建案例
May 25 #Javascript
js中的 || 与 && 运算符详解
May 24 #Javascript
vue axios整合使用全攻略
May 24 #Javascript
vue路由拦截及页面跳转的设置方法
May 24 #Javascript
使用Vue自定义指令实现Select组件
May 24 #Javascript
详解Vue单元测试case写法
May 24 #Javascript
You might like
PHP写杨辉三角实例代码
2011/07/17 PHP
PHP中redis的用法深入解析
2014/02/20 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
php图片添加水印例子
2016/07/20 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
PHP crc32()函数讲解
2019/02/14 PHP
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
javascript实现给定半径求出圆的面积
2015/06/26 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
详解angular2封装material2对话框组件
2017/03/03 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
python实现俄罗斯方块游戏
2020/03/25 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
Pyqt5实现英文学习词典
2019/06/24 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
python+requests接口自动化框架的实现
2020/08/31 Python
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
美国最大的旗帜经销商:Carrot-Top
2018/02/26 全球购物
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
关于Java finally的面试题
2016/04/27 面试题
大学生求职信范文应怎么写
2014/01/01 职场文书
实践单位评语
2014/04/26 职场文书
趣味运动会策划方案
2014/06/02 职场文书
个人四风问题整改措施
2014/10/24 职场文书
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript