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 相关文章推荐
Javascript 更新 JavaScript 数组的 uniq 方法
Jan 23 Javascript
JS实现字体选色板实例代码
Nov 20 Javascript
js图片自动轮播代码分享(js图片轮播)
May 06 Javascript
AngularJS内置指令
Feb 04 Javascript
js游戏人物上下左右跑步效果代码分享
Aug 28 Javascript
JavaScript_object基础入门(必看篇)
Jun 13 Javascript
微信小程序 图片绝对定位(背景图片)
Apr 05 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
Apr 22 Javascript
浅谈vux之x-input使用以及源码解读
Nov 04 Javascript
Node.js动手撸一个静态资源服务器的方法
Mar 09 Javascript
通过js示例讲解时间复杂度与空间复杂度
Aug 06 Javascript
JS/CSS实现字符串单词首字母大写功能
Sep 03 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
无线电广播与收音机发展的历史回眸
2021/03/02 无线电
php实现的简单压缩英文字符串的代码
2008/04/24 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
2015/10/23 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
js仿微博动态栏功能
2017/02/22 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
[00:32]2018DOTA2亚洲邀请赛iG出场
2018/04/03 DOTA
使用Python3编写抓取网页和只抓网页图片的脚本
2015/08/20 Python
python在不同层级目录import模块的方法
2016/01/31 Python
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
客服服务心得体会
2013/12/30 职场文书
医科大学毕业生自荐信
2014/02/03 职场文书
一年级学生期末评语
2014/04/21 职场文书
社团活动总结范文
2014/04/26 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
一份文言文检讨书
2014/09/13 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
python中的plt.cm.Paired用法说明
2021/05/31 Python