# 缓存

# 1. 输出文件的文件名

# - 项目架构

webpack-demo
|- package.json
|- webpack.config.js
|- /dist
|- /src
  |- index.js
|- /node_modules
1
2
3
4
5
6
7

# - webpack.config.js














 




const path = require('path')
const CleanWebpackPlugin = require('clean-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: './src/index.js',
  plugins: [
    new CleanWebpackPlugin(['dist']),
    new HtmlWebpackPlugin({
      title: 'Caching'
    })
  ],
  output: {
    filename: '[name].[chunkhash].js',
    path: path.resolve(__dirname, 'dist')
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

WARNING

如果不做修改,文件名可能会变,也可能不会

# 2. 提取模板/模块标识符

将第三方库(library)(例如 lodash 或 react)提取到单独的 vendor chunk 文件中,是比较推荐的做法 这是因为,它们很少像本地的源代码那样频繁修改 因此通过实现以上步骤,利用客户端的长效缓存机制,可以通过命中缓存来消除请求,并减少向服务器获取资源,同时还能保证客户端代码和服务器端代码版本一致。 这可以通过使用新的 entry(入口) 起点,以及再额外配置一个 CommonsChunkPlugin 实例的组合方式来实现

# - webpack.config.js

module.exports = {
  entry: {
    main: './src/index.js',
    vendor: ['lodash']
  },
  plugins: [
    new CleanWebpackPlugin(),
    new ExtractTextPlugin({
      filename: getPath => {
        return getPath('css/[name]-[id].css').replace('css/js', 'css')
      },
      allChunks: true
    }),
    new HtmlWebpackPlugin({
      title: '输出页面'
    }),
    new webpack.HashedModuleIdsPlugin(), // 解决vendor 文件后面的hash的 变化
    // new webpack.NamedModulesPlugin(), // 这个在打包的时候不要传  不然 vendors后面的hash值会同步,而不是缓存
    // new webpack.HotModuleReplacementPlugin()
  ],
  output: {
    filename: '[name].[chunkhash].js',
    path: path.resolve(__dirname, 'dist')
  },
  optimization: {
    splitChunks: {
      // chunks: 'all', // 这表示将选择哪些块进行优化。当提供一个字符串,有效值为
      // all,async和initial。提供all可以特别强大,因为这意味着即使在异步和非异步块之间也可以共享块。
      minSize: 30000, // 要生成的块的最小大小(以字节为单位)
      maxSize: 0,
      minChunks: 1, // 分割前必须共享模块的最小块数
      maxAsyncRequests: 5, // 按需加载时的最大并行请求数
      maxInitialRequests: 3, // 入口点处的最大并行请求数
      automaticNameDelimiter: '~', // 允许您指定用于生成的名称的分隔符
      name: true, // 拆分块的名称。提供true将根据块和缓存组密钥自动生成名称。
      cacheGroups: {
        // 缓存组可以继承和/或覆盖任何选项splitChunks
        // default: {
        //   chunks: 'initial',
        //   minChunks: 2
        // },
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          chunks: 'initial',
          name: 'vendor',
          // filename: '[name].bundle.js',  // 写死文件名
          priority: 10,
          enforce: true // 讲述的WebPack忽略splitChunks.minSize,splitChunks.minChunks,
          // splitChunks.maxAsyncRequests和splitChunks.maxInitialRequests选项,只为这个高速缓存组创建块。
        }
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

WARNING

  1. 缓存打包的时候 new webpack.NamedModulesPlugin() 不用使用
  2. vendor后面的hash每次打包都会变化, 使用 webpack.HashedModuleIdsPlugin() 解决
Last Updated: 9/1/2021, 2:33:08 PM