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 相关文章推荐
jquery 常用操作整理 基础入门篇
Oct 14 Javascript
在jquery中处理带有命名空间的XML数据
Jun 13 Javascript
图片Slider 带左右按钮的js示例
Aug 30 Javascript
IE与FireFox的JavaScript兼容问题解决办法
Dec 31 Javascript
js实现下拉框选择要显示图片的方法
Feb 16 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
Feb 10 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
Nov 15 Javascript
详解nvm管理多版本node踩坑
Jul 26 Javascript
基于javascript canvas实现五子棋游戏
Jul 08 Javascript
javascript利用canvas实现鼠标拖拽功能
Jul 23 Javascript
Vue使用v-viewer实现图片预览
Oct 21 Javascript
JavaScript实现网页留言板功能
Nov 23 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
PHP 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
php调整服务器时间的方法
2015/04/03 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
jQuery 获取对象 定位子对象
2010/05/31 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
jquery $.each() 使用小探
2013/08/23 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
vue.js删除动态绑定的radio的指定项
2017/06/02 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
javascript实现雪花飘落效果
2020/08/19 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
python判断端口是否打开的实现代码
2013/02/10 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
如何使用Python抓取网页tag操作
2020/02/14 Python
python如何保存文本文件
2020/06/07 Python
Python configparser模块操作代码实例
2020/06/08 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
JavaScript实现页面动态验证码的实现示例
2021/03/23 Javascript
大学生求职自我评价
2014/01/16 职场文书
《分一分》教学反思
2014/04/13 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python