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 利用闭包模拟对象的私有属性
Dec 29 Javascript
文档对象模型DOM通俗讲解
Nov 01 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
Nov 07 Javascript
Vue封装Swiper实现图片轮播效果
Feb 06 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
Jun 04 Javascript
原生js检测页面加载完毕的实例
Sep 11 Javascript
JS canvas绘制五子棋的棋盘
May 28 Javascript
微信小程序 组件的外部样式externalClasses使用详解
Sep 06 Javascript
JS设置自定义快捷键并实现图片上下左右移动
Oct 17 Javascript
JS图片预加载三种实现方法解析
May 08 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
Jul 19 Javascript
详解node.js 事件循环
Jul 22 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边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
PHP调用Twitter的RSS的实现代码
2010/03/10 PHP
基于PHP Socket配置以及实例的详细介绍
2013/06/13 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
PHP解析html类库simple_html_dom的转码bug
2014/05/22 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
在javascript中关于节点内容加强
2013/04/11 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
vue实现后台管理权限系统及顶栏三级菜单显示功能
2019/06/19 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
Python删除n行后的其他行方法
2019/01/28 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
Python字符串匹配之6种方法的使用详解
2019/04/08 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
python 基于opencv去除图片阴影
2021/01/26 Python
Tostadora意大利:定制T恤
2019/04/08 全球购物
关于读书的演讲稿600字
2014/08/27 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
公证委托书格式
2014/09/13 职场文书
房产分割协议书范文
2014/11/21 职场文书
2015年电教工作总结
2015/05/26 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang