tags: [组件]
categories: 前端工程化


Node.js

Node.js >= V6

Cli

webpack-cli 需要单独安装

插件

许多插件需要更新到最新的可兼容版本

mode

新特性用来区分环境

  1. module.exports = {
  2. // ...
  3. mode: 'production',
  4. }

或者通过命令行Cli命令:--mode production/--mode development

已移除|分离的插件

prod 模式移除的插件

  1. module.exports = {
  2. // ...
  3. plugins: [
  4. - new NoEmitOnErrorsPlugin(),
  5. - new ModuleConcatenationPlugin(),
  6. - new DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("production") })
  7. - new UglifyJsPlugin()
  8. ],
  9. }

dev 模式移除的插件

  1. module.exports = {
  2. // ...
  3. plugins: [
  4. - new NamedModulesPlugin()
  5. ],
  6. }

已经分离的插件

  1. module.exports = {
  2. // ...
  3. plugins: [
  4. - new NoErrorsPlugin(),
  5. - new NewWatchingPlugin()
  6. ],
  7. }

再见 CommonsChunkPlugin

webpack 4 Code Splitting 的 splitChunks 配置探索
提取公共代码 webpack4.0 不再使用CommonsChunkPlugin,取而代之的是内置的 optimization.splitChunks ,默认的配置或许可以完全满足你的需求

1、commonchunk配置项被彻底去掉,之前需要通过配置两次 new webpack.optimize.CommonsChunkPlugin 来分别获取 vendor 和 manifest 的通用chunk方式已经做了整合, 直接在optimization中配置 runtimeChunk 和 splitChunks 即可 ,提取功能也更为强大 2、runtimeChunk 可以配置成 true,single 或者对象,用自动计算当前构建的一些基础chunk信息,类似之前版本中的 manifest 信息获取方式。 3、webpack.optimize.UglifyJsPlugin 现在也不需要了,只需要使用 optimization.minimize 为 true 就行,production mode下面自动为 true,当然如果想使用第三方的压缩插件也可以在 optimization.minimizer 的数组列表中进行配置

  1. module.exports = {
  2. //...
  3. optimization: {
  4. splitChunks: {
  5. chunks: 'async',
  6. minSize: 30000,
  7. maxSize: 0,
  8. minChunks: 1,
  9. maxAsyncRequests: 5,
  10. maxInitialRequests: 3,
  11. automaticNameDelimiter: '~',
  12. name: true,
  13. cacheGroups: {
  14. vendors: {
  15. test: /[\\/]node_modules[\\/]/,
  16. priority: -10
  17. },
  18. default: {
  19. minChunks: 2,
  20. priority: -20,
  21. reuseExistingChunk: true
  22. }
  23. }
  24. }
  25. }
  26. };

再见 extract-text-webpack-plugin

提取 JS 中的 CSS 代码到单独的文件中 webpack4.0 不再使用 extract-text-webpack-plugin,取而代之的是mini-css-extract-plugin

  1. // webpack.dev.js
  2. const MiniCssExtractPlugin = require("mini-css-extract-plugin");
  3. const devMode = process.env.NODE_ENV !== 'production'
  4. module.exports = {
  5. plugins: [
  6. new MiniCssExtractPlugin({
  7. // Options similar to the same options in webpackOptions.output
  8. // both options are optional
  9. filename: devMode ? '[name].css' : '[name].[hash].css',
  10. chunkFilename: devMode ? '[id].css' : '[id].[hash].css',
  11. })
  12. ],
  13. module: {
  14. rules: [
  15. {
  16. test: /\.(le|c)ss$/,
  17. use: [
  18. devMode ? 'style-loader' : MiniCssExtractPlugin.loader,
  19. 'css-loader',
  20. 'postcss-loader',
  21. 'less-loader',
  22. ],
  23. }
  24. ]
  25. }
  26. }
  1. // webpack.prod.js
  2. const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
  3. const MiniCssExtractPlugin = require("mini-css-extract-plugin");
  4. const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
  5. module.exports = {
  6. optimization: {
  7. minimizer: [
  8. // we specify a custom UglifyJsPlugin here to get source maps in production
  9. new UglifyJsPlugin({
  10. cache: true,
  11. parallel: true, // 多线程
  12. sourceMap: true // set to true if you want JS source maps
  13. }),
  14. new OptimizeCSSAssetsPlugin({
  15. assetNameRegExp: /.css$/g,
  16. cssProcessor: require('cssnano'),
  17. cssProcessorOptions: { safe: true, discardComments: { removeAll: true } },
  18. canPrint: false
  19. })
  20. ]
  21. },
  22. plugins: [
  23. new MiniCssExtractPlugin({
  24. filename: "[name].css",
  25. chunkFilename: "[id].css"
  26. })
  27. ],
  28. module: {
  29. rules: [
  30. {
  31. test: /\.(sa|sc|c)ss$/,
  32. use: [
  33. MiniCssExtractPlugin.loader,
  34. 'css-loader',
  35. 'postcss-loader',
  36. 'less-loader',
  37. ],
  38. }
  39. ]
  40. }
  41. }

import() and CommonJS

当通过 import() 导入 non-esm.js 的结果时,现在你需要通过 default 属性来获取 module.exports 的值

  1. # non-esm.js
  2. module.exports = {
  3. sayHello: () => {
  4. console.log('hello world');
  5. }
  6. };
  1. # example.jsc
  2. function sayHello() {
  3. import('./non-esm.js').then(module => {
  4. module.default.sayHello();
  5. });
  6. }

json and loaders

当用自定义的loader来转换 .json 文件时,需要添加 module.rules.type

  1. module.exports = {
  2. // ...
  3. rules: [
  4. {
  5. test: /config\.json$/,
  6. loader: 'special-loader',
  7. + type: 'javascript/auto',
  8. options: {...}
  9. }
  10. ]
  11. };

如果使用 json-loader ,可以移除

  1. module.exports = {
  2. // ...
  3. rules: [
  4. {
  5. - test: /\.json$/,
  6. - loader: 'json-loader'
  7. }
  8. ]
  9. };

module.loaders

module.loaders 已移除,被 module.rules 取代

参考资源

更多插件请见 https://webpack.js.org/plugins/
你拆分JS代码的方法可能是错的!

其他升级

  1. NoEmitOnErrorsPlugin- > optimization.noEmitOnErrors(默认情况下处于生产模式)

  2. ModuleConcatenationPlugin- > optimization.concatenateModules(默认情况下处于生产模式)

  3. NamedModulesPlugin- > optimization.namedModules(在开发模式下默认开启)

  4. webpack命令优化 -> 发布了独立的 webpack-cli 命令行工具包

  5. webpack-dev-server -> 建议升级到最新版本

  6. html-webpack-plugin -> 建议升级到最新版本

  7. file-loader -> 建议升级到最新版本

  8. url-loader -> 建议升级到最新版本

报错信息

webpack To V4 from V3 - 图1

webpack To V4 from V3 - 图2
webpack To V4 from V3 - 图3