Skip to content

优化打包构建速度与应用工程优化

TIP

同一个文件类型有多个loader时,执行顺序从右到左

原因是某个loader可能会依赖上一个loader的结果,必须等到上一个loader执行完,比如处理less,要先less-loader,然后再是style-loader

babel 缓存

js
// 优化第二次打包速度
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
          presets: [
          // 开启 babel 缓存
          // 第二次构建时,会读取之前的缓存
          cacheDirectory: true
        }
      }
    ]
  }
}

多进程打包

webpack4官方提供的thread-loader,或者第三方插件happyPack

前者配置更简单, 两者构建速度相差不大。

配置不需要打包的库,使用CDN引入 externals

js
设置拒绝打包的库
module.exports = {
  externals: {
    // 忽略库名 --> npm包名
    jquery: 'jQuery'
  }
}
在入口 index.html 引入 CDN
<script src="xxx"></script>

DLL打包

对代码进行单独打包(jQuery, react, vue ...),第二次以后打包时不再打包第三方库

单独写一个配置文件,生成映射文件与打包文件,在webpack.config.js中配置后即可。详见


优化代码运行的性能

output的filename配置contenthash缓存(hash -> chunkhash -> contenthash)

  • hash:每次 webpack 构建时会生成一个唯一的 hash 值 问题:因为 js 和 css 是同时使用一个 hash 值(如果重新打包会导致所有文件缓存都失效)
  • chunkhash:根据 chunk 生成 hash 值。如果打包来源于同一个 chunk,那么 hash 值就一样问题:js 和 css 的 hash 值还是一样的, 因为 css 是在 js 文件中被引入的,所以同属于一个 chunk
  • contenthash:根据文件的内容生成 hash 值。不同文件的 hash 值移动不一样

Tree shaking 去除无用的代码

前提 :

    1. 必须使用 ES6 模块化
    1. 开启 production 环境

注意 :

  • 在 package.json 中配置忽略文件:sideEffects: [".css", ".less"],防止@import的文件被Tree shaking

code split 代码分割

当mode: 'production'时自动启用

js
自定义配置参数:  
optimization: {
    splitChunks: {
      chunks: 'async' // 默认来自node_modules或import异步引入的模块
    }
  }

懒加载/预加载

懒加载:当文件需要时才加载 预加载:网页空闲时自动加载

js
// webpackChunkName 此处的注释可以命名打包后文件名,webpackPrefetch 预加载
import(/* webpackChunkName: 'test', webpackPrefetch: true */'./test.js') // // import动态导入, 单独打包成一个 chunk

PWA

使用插件workbox-webpack-plugin生成PWA应用