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 相关文章推荐
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
Dec 28 Javascript
jquery的index方法实现tab效果
Feb 16 Javascript
JavaScript中扩展Array contains方法实例
Aug 23 Javascript
JS实现图片剪裁并预览效果
Aug 12 Javascript
EditPlus 正则表达式 实战(3)
Dec 15 Javascript
BootStrap整体框架之基础布局组件
Dec 15 Javascript
JavaScript表单验证完美代码
Mar 02 Javascript
jQuery 表单序列化实例代码
Jun 11 jQuery
vue 虚拟dom的patch源码分析
Mar 01 Javascript
JavaScript模拟实现自由落体效果
Aug 28 Javascript
JavaScript动态添加数据到表单并提交的几种方式
Jun 26 Javascript
Vue实现手机扫描二维码预览页面效果
May 28 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
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
PHP Class&Object -- 解析PHP实现二叉树
2013/06/25 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
数组方法解决JS字符串连接性能问题有争议
2011/01/12 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
用js简单提供增删改查接口
2019/05/12 Javascript
JS实现网页端猜数字小游戏
2020/03/06 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
Python 字符串中的字符倒转
2008/09/06 Python
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
python基础教程之匿名函数lambda
2017/01/17 Python
Python基于回溯法解决01背包问题实例
2017/12/06 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
2020/03/30 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
献爱心倡议书
2014/04/14 职场文书
大学生在校表现评语
2014/12/31 职场文书
初三语文教学计划
2015/01/22 职场文书
爱心募捐通知范文
2015/04/27 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
go语言中fallthrough的用法说明
2021/05/06 Golang
解决Python字典查找报Keyerror的问题
2021/05/26 Python
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android