hash => chunkhash => contenthash
从前往后,效率越来越低,但是精度越来越高
存在即合理,三种方式主要是看是注重效率,还是注重精度,一般选择 chunkhash

hash

hash 是 webpack 单次打包生成的唯一值,所有文件共用一个 hash,当打包之后没有更改文件的前提下,再次进行打包,不会生成新的 hash

hash 使用的局限性

比如一个 chunk 改变,但是其他 chunk 的 hash 值会一起改变导致缓存失效

chunkhash

chunk 是什么?

入口模块以及它所依赖的模块组成的代码块,称为 chunk
chunkhash 指代入口模块以及它所依赖的模块组成的代码块所对应的 hash 值,此代码块所有模块共用一个 chunkhash,当有文件改动之后生成新的 chunkhash

contenthash

contenthash 即模块所对应的 hash
contenthash 可以避免使用 contenthash 的模块被其他模块改变而影响
比如场景:一条 chunk 上的 js 发生了改变,此时 css 不想缓存失效,那么 css 可以使用 contenthash

最好的方式是:chunkhash + contenthash

比如:

  1. output: {
  2. filename: '[name].[chunkhash:8].js'
  3. },
  4. module: {
  5. rules: [
  6. {
  7. test: /\.css$/i,
  8. use: [
  9. MiniCssExtractPlugin.loader,
  10. 'css-loader'
  11. ]
  12. }
  13. ]
  14. },
  15. plugins: [
  16. new MiniCssExtractPlugin({
  17. filename: '[name].[contenthash:8].js'
  18. })
  19. ]