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 相关文章推荐
修改发贴的编辑功能
Mar 07 Javascript
jquery文字上下滚动的实现方法
Mar 22 Javascript
JavaScript删除数组元素的方法
Mar 20 Javascript
jQuery实现首页顶部可伸缩广告特效代码
Apr 15 Javascript
JavaScript实现强制重定向至HTTPS页面
Jun 10 Javascript
基于Javascript实现弹出页面效果
Jan 01 Javascript
关于JavaScript中事件绑定的方法总结
Oct 26 Javascript
jquery插入兄弟节点的操作方法
Dec 07 Javascript
JavaScript之underscore_动力节点Java学院整理
Jul 03 Javascript
解析vue路由异步组件和懒加载案例
Jun 08 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
Jul 12 Javascript
Node.js web 应用如何封装到Docker容器中
Sep 01 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
终于听上了直流胆调频
2021/03/02 无线电
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
2014/01/26 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
css+js实现部分区域高亮可编辑遮罩层
2014/03/04 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
angularjs实现table增加tr的方法
2018/02/27 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
python网络编程学习笔记(四):域名系统
2014/06/09 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
通过实例学习Python Excel操作
2020/01/06 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
英文版网络工程师求职信
2013/10/28 职场文书
给客户的道歉信
2014/01/13 职场文书
售后服务经理岗位职责范本
2014/02/22 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
高中社区服务活动报告
2015/02/05 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL
浅谈Node的内存泄露问题
2022/05/06 NodeJs