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 相关文章推荐
phpwind放自动注册方法
Dec 02 Javascript
javascript入门·图片对象(无刷新变换图片)\滚动图像
Oct 01 Javascript
jQuery初学:find()方法及children方法的区别分析
Jan 31 Javascript
使用简洁的jQuery方法实现隔行换色功能
Jan 02 Javascript
jquery实现图片上传前本地预览功能
May 10 Javascript
AngularJS通过$http和服务器通信详解
Sep 21 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
Feb 21 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
Sep 27 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
Oct 23 Javascript
javascript将非数值转换为数值
Sep 13 Javascript
详解node登录接口之密码错误限制次数(含代码)
Oct 25 Javascript
Vue toFixed保留两位小数的3种方式
Oct 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
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
标准PHP的AES加密算法类
2015/03/12 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
2017/04/13 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
2019/08/16 Javascript
基于Electron实现桌面应用开发代码实例
2020/07/07 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
python爬虫租房信息在地图上显示的方法
2019/05/13 Python
在python中用url_for构造URL的方法
2019/07/25 Python
Python队列、进程间通信、线程案例
2019/10/25 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
Java工程师面试集锦之Spring框架
2013/06/16 面试题
正规的求职信范文分享
2013/12/11 职场文书
大学校庆策划书
2014/01/31 职场文书
2014年纠风工作总结
2014/12/08 职场文书
晚会开幕词
2015/01/28 职场文书
生活委员竞选稿
2015/11/21 职场文书
2016年感恩节寄语
2015/12/07 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
Python基础之数据结构详解
2021/04/28 Python
Python中使用subprocess库创建附加进程
2021/05/11 Python
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis