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中字符串拼接需注意的问题
Jul 13 Javascript
js函数排序的实例代码
Jul 01 Javascript
Seajs的学习笔记
Mar 04 Javascript
快速学习jQuery插件 Form表单插件使用方法
Dec 01 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
Dec 15 Javascript
简易的JS计算器实现代码
Oct 18 Javascript
jQuery布局组件EasyUI Layout使用方法详解
Feb 28 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
Apr 28 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
Mar 28 jQuery
JavaScript数组基于交换的排序示例【冒泡排序】
Jul 21 Javascript
vue操作动画的记录animate.css实例代码
Apr 26 Javascript
微信小程序保持session会话的方法
Mar 20 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
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
xml在joomla表单中的应用详解分享
2012/07/19 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
Element Input组件分析小结
2018/10/11 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
javascript中闭包closure的深入讲解
2021/03/03 Javascript
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
Python 连连看连接算法
2008/11/22 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
暑期培训随笔感言
2014/03/10 职场文书
个人担保书格式范文
2014/05/12 职场文书
鼓舞士气的口号
2014/06/16 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
行政处罚告知书
2015/07/01 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android