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 相关文章推荐
jQuery基础语法实例入门
Dec 23 Javascript
JavaScript 经典实例日常收集整理(常用经典)
Mar 30 Javascript
jquery实现简单的banner轮播效果【实例】
Mar 30 Javascript
js显示动态时间的方法详解
Aug 20 Javascript
jQuery如何防止Ajax重复提交
Oct 14 Javascript
浅谈JavaScript的计时器对象
Dec 26 Javascript
Vuex 进阶之模块化组织详解
Jan 12 Javascript
Vue中render函数的使用方法
Jan 31 Javascript
解决使用vue.js路由后失效的问题
Mar 17 Javascript
webpack-url-loader 解决项目中图片打包路径问题
Feb 15 Javascript
jquery实现二级导航下拉菜单效果实例
May 14 jQuery
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
Nov 14 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/06/09 PHP
php array_walk() 数组函数
2011/07/12 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
Prototype中dom对象方法汇总
2008/09/17 Javascript
js function定义函数使用心得
2010/04/15 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
2013/11/25 Javascript
indexOf 和 lastIndexOf 使用示例介绍
2014/09/02 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
Node.js 使用流实现读写同步边读边写功能
2017/09/11 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
webpack搭建vue 项目的步骤
2017/12/27 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
js 实现在2d平面上画8的方法
2018/10/10 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
Python文件及目录操作实例详解
2015/06/04 Python
在Django框架中设置语言偏好的教程
2015/07/27 Python
python下读取公私钥做加解密实例详解
2017/03/29 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
Python中常见的异常总结
2018/02/20 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
解决Python二维数组赋值问题
2019/11/28 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
生日寄语大全
2014/04/08 职场文书
财务部绩效考核方案
2014/05/04 职场文书
防灾减灾活动总结
2014/08/30 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书