webpack hash哈希值
# webpack hash 哈希值
在 webpack 中有三种 hash 可以配置,hash,chunkhash,contenthash
# hash
hash:每次构建会生成一个 hash。和整个项目有关,只要有项目文件更改,就会改变 hash
hash 会更据每次工程的内容进行计算,很容易造成不必要的 hash 变更,不利于版本管理。
# chunkhash
chunkhash:和 webpack 打包生成的 chunk 相关。每一个 entry,都会有不同的 hash。
# contenthash
contenthash:根据资源内容创建出唯一 hash,也就是说文件内容不变,hash 就不变。
# webpack hash 原理
webpack 的 hash 是通过 crypto 加密和哈希算法实现的,webpack 提供了 hashDigest(在生成 hash 时使用的编码方式,默认为 'hex')、hashDigestLength(散列摘要的前缀长度,默认为 20)、hashFunction(散列算法,默认为 'md5')、hashSalt(一个可选的加盐值)等参数来实现自定义
hash 和 chunkhash 的生成过程:
下面主要讲一下 hash 的生成过程,其中 chunkhash 的生成过程包含在其中。webpack 生成 hash 的第一步是获取 Compilation 下面的所有 modules,把所有的 module 在 build 阶段生成的_buildHash 作为内容生成一个新的 hash 值;然后获取到所有的代码块(chunks),分别把代码块(chunk)中包含的 module 的 hash 作为内容生成代码块(chunk)的 hash,该 hash 就是配置 chunkhash 时需要使用的 hash 值;最后把所有代码块(chunks)的 hash 作为内容生成一个 hash 就是最终的 hash
contenthash 生成过程:
contenthash 生成跟前两种 hash 生成不一样,它是通过 mini-css-extract-plugin 和 JavascriptModulesPlugin 插件生成的 hash;mini-css-extract-plugin 是 webpack 打包构建时把 css 类型的 module 单独分类出来的插件,使用该插件时会为 css 类型的文件单独生成 hash;它会把代码块(chunk)中所有类型为 css/mini-extract 的 module 的 hash 作为内容生成 chunkhash。
避免相同随机值:
webpack 在计算 hash 后分割 chunk。产生相同随机值可能是因为这些文件属于同一个 chunk,可以将某一个文件提到独立的 chunk,放入 entry