WarpPrism / Blog

Do Epic Things
51 stars 8 forks source link

vue项目 webpack4升级实践 #40

Open WarpPrism opened 5 years ago

WarpPrism commented 5 years ago

vue项目 webpack4升级实践

最近将vue项目的打包工具webpack升级到了V4,原有配置是基于Vue-CLI 2生成的,其中部分过程做了微调。方便起见,就直接在原有基础上通过安装新依赖,调整配置,最后也顺利完成了升级。

webpack4 新特性

webpack4发布

据官方发布消息称,webpack4有以下几个特点:

1. webpack 4 速度提升98%

其实,实测下来,提示性能普遍在50% ~ 60%之间,如果项目本身就比较小,速度提升则更不明显。Anyway,有提升就好。

2. 引入mode,包含默认配置

mode有两个值 development和production 即开发模式和生产模式 当你设置不同的mode时,会默认开启以下特性:

development

production

3. 插件变化:移除CommonsChunkPlugin等,使用新的配置项optimization代替

webpack新增optimization选项,主要用于构建过程中的代码优化,常用配置如下所示:

// webpack4 新增优化选项 提供minify splitChunks等功能
optimization: {
  minimize: true, // 默认开启压缩
  minimizer: [
    // ES 压缩
    new TerserPlugin({
      cache: true,
      parallel: true,
      sourceMap: config.build.productionSourceMap,
      terserOptions: {
        // https://github.com/webpack-contrib/terser-webpack-plugin#terseroptions
        warnings: false,
        compress: {
          drop_console: true
        }
      }
    }),
    // CSS 压缩 去重
    // Compress extracted CSS. We are using this plugin so that possible duplicated CSS from different components can be deduped.
    new OptimizeCSSPlugin({
      cssProcessorOptions: config.build.productionSourceMap
        ? { safe: true, map: { inline: false } }
        : { safe: true }
    })
  ],
  // 提取webpack运行时的代码
  runtimeChunk: {
    name: 'manifest'
  },
  // 提取公共模块,防止模块重复打包 代替CommonsChunkPlugin
  splitChunks: {
    chunks: 'async',
    minSize: 30000, // 形成一个新代码块最小的体积
    minChunks: 1,
    maxAsyncRequests: 5, // 按需加载时候最大的并行请求数
    maxInitialRequests: 3, // 一个入口最大的并行请求数
    automaticNameDelimiter: '~',   // 打包分割符
    name: true,
    cacheGroups: {
      // 拆分样式
      styles: {
        name: 'styles',
        test: /\.css$/,
        chunks: 'all',
        enforce: true,
        priority: 1000
      },
      // 单独拆分vue框架
      vueFramework: {
        name: 'vueFramework',
        test: (module) => {
          return /vue|vue-router|vuex/.test(module.context);
        },
        chunks: 'initial',
        priority: 200,
      },
      // 拆分其他vendor
      vendor: {
        test: /[\\/]node_modules[\\/]/,
        name: 'vendor',
        chunks: 'initial',
        priority: 100
      }
    }
    }
}

4. 增加webAssembly支持

5. 支持多种模块类型

6. 推崇0配置

webpack受parcel rollup等打包工具启发,从v4版本不再强制需要webpack.config.js,以做到开箱即用。通过命令行 webpack --mode development 即可对小型项目打包

如何升级

  1. 更新node版本 >=8.9.4 (recommend version)
  2. 安装最新的 webpack4 webpack-dev-server webpack-cli(命令行工具)
  3. 将webpack loader、plugin升级至最新版本,包括但不限于html-webpack-plugin、 friendly-errors-webpack-plugin、terser-webpack-plugin、file-loader、url-loader等。其中extract-text-webpack-plugin直接删掉,因为不兼容webpack4,替换为mini-css-extract-plugin,即新的css抽离插件。还需引入vue-loader插件
  4. 去掉这些插件:NoEmitOnErrorsPlugin、ModuleConcatenationPlugin、NamedModulesPlugin、CommonsChunkPlugin,因为这些都将升级为optimization配置项,而不是以插件形式继续存在。分别变成 optimization.noEmitOnErrors、optimization.concatenateModules、optimization.namedModules和optimization.splitChunks
plugins: [
  // 引入vue-loader插件
  new VueLoaderPlugin(),
  new MiniCssExtractPlugin({
    filename: utils.assetsPath('css/[name].[contenthash].css')
    })
]
  1. 引入mode模式之后,会自动设置process.env.NODE_ENV,所以需要去除多余的环境变量设置
  2. 升级后试运行,运行过程中如遇插件或loader报错,则将其升级至最新版本,如仍有问题再进一步解决。

Vue CLI 3.0 +

如果嫌手动配置webpack4麻烦,(毕竟不是人人都是webpack配置工程师。。。) 那可以直接采用vue cli3重新搭建一套脚手架。

vue cli 官网

安装运行

npm install -g @vue/cli
或者
yarn global add @vue/cli

vue ui

然后,一切都是你熟悉的图形化配置了,vuex? vue-router? babel? eslint? typescript? unit test?等等,统统一键加入你的项目中,相当方便。

最后,期待webpack5