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 代码集(学习js的朋友可以看下)
Jul 22 Javascript
Javascript 实现复制(Copy)动作方法大全
Jun 20 Javascript
JavaScript的类型、值和变量小结
Jul 09 Javascript
JavaScript实现点击按钮切换网页背景色的方法
Oct 17 Javascript
javascript显示上周、上个月日期的处理方法
Feb 03 Javascript
Javascript的无new构建实例详解
May 15 Javascript
vue项目实战总结篇
Feb 11 Javascript
微信小程序上传图片实例
May 28 Javascript
vscode下vue项目中eslint的使用方法
Jan 13 Javascript
Node.js系列之安装配置与基本使用(1)
Aug 30 Javascript
在Chrome DevTools中调试JavaScript的实现
Apr 07 Javascript
如何在vue中使用HTML 5 拖放API
Jan 14 Vue.js
最后说说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的安全策略
2006/10/09 PHP
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
js滚动条回到顶部的代码
2011/12/06 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
javascript学习笔记之函数定义
2015/06/25 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
详解jQuery的Cookie插件
2016/11/23 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
python中的sort方法使用详解
2014/07/25 Python
浅谈django中的认证与登录
2016/10/31 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
python 实现敏感词过滤的方法
2019/01/21 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
基于python的selenium两种文件上传操作实现详解
2019/09/19 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
介绍一下linux的文件权限
2012/02/15 面试题
手机业务员岗位职责
2013/12/13 职场文书
迟到检讨书400字
2014/01/13 职场文书
保安岗位职责
2014/02/21 职场文书
质量安全标语
2014/06/07 职场文书
小英雄雨来观后感
2015/06/09 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
使用Mysql计算地址的经纬度距离和实时位置信息
2022/04/29 MySQL
python如何为list实现find方法
2022/05/30 Python