经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » webpack » 查看文章
webpack@v4升级踩坑(小结)
来源:jb51  时间:2018/10/10 8:46:19  对本文有异议

之前看到各大公众号都在狂推 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 配置。

爬坑

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

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

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

  1. /* webpack.config.js */
  2. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  3.  
  4. module.exports = () => {
  5. const config = {
  6. module: {
  7. rules: [
  8. {
  9. test: /\.css$/,
  10. use: [
  11. MiniCssExtractPlugin.loader,
  12. 'css-loader?importLoaders=1',
  13. 'postcss-loader'
  14. ]
  15. },
  16. {
  17. test: /\.less$/,
  18. use: [
  19. MiniCssExtractPlugin.loader,
  20. 'css-loader?importLoaders=1',
  21. 'postcss-loader',
  22. 'less-loader'
  23. ]
  24. }
  25. ]
  26. },
  27. resolve: {
  28. extensions: ['.js', '.jsx', '.less']
  29. }
  30. };
  31. if (process.env.NODE_ENV === 'development') {
  32. config.module.rules[0].use = [
  33. 'css-hot-loader',
  34. MiniCssExtractPlugin.loader,
  35. 'css-loader?importLoaders=1',
  36. 'postcss-loader'
  37. ];
  38. config.module.rules[1].use = [
  39. 'css-hot-loader',
  40. MiniCssExtractPlugin.loader,
  41. 'css-loader?importLoaders=1',
  42. 'postcss-loader',
  43. {
  44. loader: 'less-loader',
  45. options: {
  46. modifyVars: theme
  47. }
  48. }
  49. ];
  50. }
  51.  
  52. return config;
  53. };
  54.  
  55. /* webpack.config.prod.js */
  56. const merge = require('webpack-merge');
  57. const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
  58. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  59. const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
  60. const webpackBaseConfig = require('./webpack.config')();
  61.  
  62. module.exports = merge(webpackBaseConfig, {
  63. mode: 'production',
  64. optimization: {
  65. minimizer: [
  66. new UglifyJsPlugin({
  67. cache: true,
  68. parallel: true,
  69. uglifyOptions: {
  70. compress: {
  71. warnings: false,
  72. drop_debugger: true,
  73. drop_console: false
  74. }
  75. }
  76. }),
  77. new OptimizeCSSAssetsPlugin({})
  78. ]
  79. },
  80. plugins: [
  81. new MiniCssExtractPlugin({
  82. filename: 'css/[name].css'
  83. })
  84. ]
  85. });

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 触发事件,嗯,最后的这部分广告真硬!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号