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 Event学习第六章 事件的访问
Feb 07 Javascript
javascript闭包的理解和实例
Aug 12 Javascript
js 单击式的下拉菜单效果实例
Aug 13 Javascript
moment.js轻松实现获取当前日期是当年的第几周
Feb 05 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
Oct 09 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
Mar 15 Javascript
实现单层json按照key字母顺序排序的示例
Dec 06 Javascript
AngularJS 事件发布机制
Aug 28 Javascript
小程序使用wxs解决wxml保留2位小数问题
Dec 13 Javascript
阿望教你用vue写扫雷小游戏
Jan 20 Javascript
如何使用vue slot创建一个模态框的实例代码
May 24 Javascript
利用js实现简单开关灯代码
Nov 23 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/12/16 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
2018/05/24 PHP
用javascript操作xml
2006/11/04 Javascript
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
js倒计时小程序
2013/11/05 Javascript
HTML页面登录时的JS验证方法
2014/05/28 Javascript
javascript中传统事件与现代事件
2015/06/23 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
jQuery为DOM动态追加事件的方法
2017/02/16 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
js实现星星打分效果
2020/07/05 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
Django框架封装外部函数示例
2019/05/28 Python
python如何把字符串类型list转换成list
2020/02/18 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
函数指针的定义是什么
2016/08/14 面试题
特色冷饮店创业计划书
2014/01/28 职场文书
应届毕业生个人求职信范文
2014/01/29 职场文书
小学数学课后反思
2014/04/23 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
群众路线个人整改方案
2014/10/25 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
python机器学习Github已达8.9Kstars模型解释器LIME
2021/11/23 Python
如何利用React实现图片识别App
2022/02/18 Javascript
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python
服务器SVN搭建图文安装过程
2022/06/21 Servers