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 函数调用规则
Aug 26 Javascript
两个select之间option的互相添加操作(jquery实现)
Nov 12 Javascript
JQueryEasyUI datagrid框架的进阶使用
Apr 08 Javascript
深入理解JavaScript中的箭头函数
Jul 28 Javascript
jQuery通过写入cookie实现更换网页背景的方法
Apr 15 Javascript
ajax图片上传,图片异步上传,更新实例
Dec 30 Javascript
JavaScript如何一次性展示几万条数据
Mar 30 Javascript
node.js中grunt和gulp的区别详解
Jul 17 Javascript
JS沙箱模式实例分析
Sep 04 Javascript
vue-cli3.0 特性解读
Apr 22 Javascript
vue树形结构获取键值的方法示例
Jun 21 Javascript
react使用antd表单赋值,用于修改弹框的操作
Oct 29 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
再次研究下cache_lite
2007/02/14 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
phpStorm2020 注册码
2020/09/17 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
javascript作用域容易记错的两个地方分析
2012/06/22 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
jQuery简单实现title提示效果示例
2016/08/01 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
JavaScrip关于创建常量的知识点
2017/12/07 Javascript
Vue 进入/离开动画效果
2017/12/26 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
Python实现快速计算词频功能示例
2018/06/25 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
python3字符串操作总结
2019/07/24 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
Python txt文件常用读写操作代码实例
2020/08/03 Python
美国电视购物HSN官网:HSN
2016/09/07 全球购物
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
大学生活动策划方案
2014/02/10 职场文书
骨干教师培训方案
2014/05/06 职场文书
小学教师读书活动总结
2014/07/08 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS