webpack@v4升级踩坑(小结)


Posted in Javascript onOctober 08, 2018

之前看到各大公众号都在狂推 webpack 新版发布的相关内容,之前就尝试了升级,由于部分插件的原因,未能成功,现在想必过了这么久已经可以了,今天就来试一下在我的项目中升级会遇到哪些坑。

查阅更新日志

在安装更新之前,先大致浏览了一下更新日志,对大部分用户来说迁移上需要注意的应该就是这些点:

  • 在命令行界面运行打包指令需要安装 webpack-cli
  • 打包需要指定打包模式 production or development ,在不同模式下会添加不同的默认配置, webpack.DefinePlugin 插件的 process.env.NODE_ENV 的值不需要再定义,将根据模式自动添加;
  • 不再需要在 plugin 中设置 new webpack.optimize.UglifyJsPlugin ,只需要在配置中设置开关即可,并且 production 模式自动开启,可以通过 optimization.minimizer 指定其他压缩库;
  • 删除了 CommonsChunkPlugin ,功能已迁移至 optimization.splitChunks , optimization.runtimeChunk

迁移

  1. 安装最新的 webpackwebpack-cliwebpack-dev-server
  2. 为开发中和发布分别配置 mode ,删除 webpack.DefinePlugin 配置,并且去掉 package.json 中启动脚本的 NODE_ENV 区别环境变量定义;
  3. 去掉 new webpack.optimize.UglifyJsPluginModuleConcatenationPlugin 配置。

爬坑

webpack@v4升级踩坑(小结)

在这些配置好之后我遇到的第一个问题就是打包时 extract-text-webpack-plugin 插件炸了!这里提供了这里有两种解决方案:

  • 方法一:安装指定 extract-text-webpack-plugin 版本 @next
  • 方法二:使用 mini-css-extract-plugin 替代。

如果使用方法二注意在发布打包时需要指定 css 压缩库配置,并且需要同时写入 js 压缩库,因为你一旦指定了 optimization.minimizer 就会弃用内置的代码压缩:

/* webpack.config.js */
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = () => {
 const config = {
  module: {
   rules: [
    {
     test: /\.css$/,
     use: [
      MiniCssExtractPlugin.loader,
      'css-loader?importLoaders=1',
      'postcss-loader'
     ]
    },
    {
     test: /\.less$/,
     use: [
      MiniCssExtractPlugin.loader,
      'css-loader?importLoaders=1',
      'postcss-loader',
      'less-loader'
     ]
    }
   ]
  },
  resolve: {
   extensions: ['.js', '.jsx', '.less']
  }
 };
 
 if (process.env.NODE_ENV === 'development') {
  config.module.rules[0].use = [
   'css-hot-loader',
   MiniCssExtractPlugin.loader,
   'css-loader?importLoaders=1',
   'postcss-loader'
  ];
  config.module.rules[1].use = [
   'css-hot-loader',
   MiniCssExtractPlugin.loader,
   'css-loader?importLoaders=1',
   'postcss-loader',
   {
    loader: 'less-loader',
    options: {
     modifyVars: theme
    }
   }
  ];
 }

 return config;
};

/* webpack.config.prod.js */
const merge = require('webpack-merge');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const webpackBaseConfig = require('./webpack.config')();

module.exports = merge(webpackBaseConfig, {
 mode: 'production',
 optimization: {
  minimizer: [
   new UglifyJsPlugin({
    cache: true,
    parallel: true,
    uglifyOptions: {
     compress: {
      warnings: false,
      drop_debugger: true,
      drop_console: false
     }
    }
   }),
   new OptimizeCSSAssetsPlugin({})
  ]
 },
 plugins: [
  new MiniCssExtractPlugin({
   filename: 'css/[name].css'
  })
 ]
});

happypack 炸了,小场面,升级就好 @5.0.0-beta.3happypackextract-text-webpack-plugin 搭配使用更佳,mini-css-extract-plugin 未测试)。webpack-browser-plugin 炸了,小场面,弃用就好,然后在 devServer 中配置 openopenPage

上面的配置中可以看到我使用判断语句 process.env.NODE_ENV === 'development' 在开发配置中加入了 css-hot-loader ,但是这里实际上是获取到的是 undefined ,咦?这是什么鬼?查阅更新日志是怎么说的:

process.env.NODE_ENV are set to production or development (only in built code, not in config)

意思就是说我们在使用的工程项目代码中会获取到这个变量,但是打包配置中使用这个变量还是获取不到的,我也实际验证了这个结果,so,我在 package.json 的开发启动脚本中还是加上了 NODE_ENV='development'

最后

总体来说现在的升级时机已经成熟,大多需要用到的功能和插件都有平滑的升级或替代方案,建议在开始升级前安装最新发布的插件版本,也可以参考下我的项目配置react-with-mobx-template。

还有对插件的一些 API 也做了一些更改,如果你是插件开发者也可以尝试发布新的插件版本,我在使用自己的版本号提取插件webpack-version-plugin时发现 compiler.plugin 已经被提示过气了, webpack@v4 使用最新的 compiler.hooks.emit.tap 触发事件,嗯,最后的这部分广告真硬!

Javascript 相关文章推荐
js prototype 格式化数字 By shawl.qiu
Apr 02 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
Feb 24 Javascript
js获取url参数代码实例分享(JS操作URL)
Dec 13 Javascript
30个经典的jQuery代码开发技巧
Dec 15 Javascript
JavaScript数组的定义及数字操作技巧
Jun 06 Javascript
Jquery实时监听input value的实例
Jan 26 Javascript
ES6中Class类的静态方法实例小结
Oct 28 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
Feb 08 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
Oct 07 Javascript
jQuery选择器之基本选择器用法实例分析
Feb 19 jQuery
微信小程序设置滚动条过程详解
Jul 25 Javascript
JS实现盒子拖拽效果
Feb 06 Javascript
npm scripts 使用指南详解
Oct 08 #Javascript
webpack4.0 入门实践教程
Oct 08 #Javascript
vue实现一个炫酷的日历组件
Oct 08 #Javascript
angularJs利用$scope处理升降序的方法
Oct 08 #Javascript
Nuxt升级2.0.0时出现的问题(小结)
Oct 08 #Javascript
vue页面切换过渡transition效果
Oct 08 #Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
Oct 08 #Javascript
You might like
《魔兽世界》惊魂幻象将获得调整
2020/03/08 其他游戏
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
解决Laravel无法使用COOKIE和SESSION的问题
2019/10/16 PHP
图片完美缩放
2006/09/07 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
JavaScript 数组详解
2013/10/10 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
js实现蒙版效果
2020/01/11 Javascript
JS数组方法reduce的用法实例分析
2020/03/03 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
批处理与python代码混合编程的方法
2016/05/19 Python
Python实现优先级队列结构的方法详解
2016/06/02 Python
python计算日期之间的放假日期
2018/06/05 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
python实现批量文件重命名
2019/10/31 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
struct与class的区别
2014/02/03 面试题
简历中求职的个人自我评价
2013/12/03 职场文书
自我评价范文点评
2013/12/04 职场文书
财务总监管理职责范文
2014/03/09 职场文书
学校政风行风整改方案
2014/10/25 职场文书