Skip to content

webpack 在打包时,给生成的文件名上添加的 hash 码,是如何生成的?

在 Webpack 中,打包时生成的文件名上添加的 hash 码是为了确保缓存的文件在内容发生变化时能更新,避免用户浏览器缓存旧版本文件。Webpack 生成的 hash 值通常是通过文件内容的哈希值来计算的,确保文件内容变化时,文件名也会变化。

Webpack 中有三种常用的 hash 方式,它们的生成依据不同:

[hash]

[hash] 是基于整个构建过程的内容生成的哈希值。它是 Webpack 打包过程中所有文件(包括代码、图片、资源等)内容的总体哈希。如果构建过程中任何文件内容发生变化,[hash] 就会变化。

缺点:如果构建过程中只是某一个文件的内容变化,其他文件的哈希值也会变化,因为 [hash] 是针对所有文件一起计算的。因此,它通常不适合缓存控制。

[chunkhash]

[chunkhash] 是基于 每个输出 chunk 内容生成的哈希值。每个代码块(或模块)都会有一个不同的哈希值,只有当该代码块的内容变化时,该代码块的哈希值才会发生变化。这个方法对缓存非常友好,因为即使项目中的某个模块发生变化,只有那个模块的哈希值会改变,其他模块依然保持不变。

[chunkhash] 通常用于 JavaScript、CSS 文件等资源的命名。

[contenthash]

[contenthash] 是基于文件内容生成的哈希值,通常用于生成静态资源文件(如图片、字体、CSS)。与 chunkhash 不同,[contenthash] 是针对单个文件内容生成的哈希值,确保只有当文件内容发生变化时,文件名才会变化。

[contenthash] 最适合用于 CSS 和图片等静态资源,它只会在资源内容发生变化时才改变哈希值,不会受到其他文件内容变动的影响。

题目要点:

  • [hash]:基于整个构建过程,适用于构建时所有文件的哈希值,但对缓存优化不友好。
  • [chunkhash]:基于每个代码块内容的哈希值,适合 JS 和 CSS 等文件,能够优化缓存。
  • [contenthash]:基于文件内容生成的哈希值,适合静态资源(如图片、CSS),能提供最好的缓存控制。

PS:在开发模式下,WebPack 通常会使用 dev-server 来支持热更新和快速编译,因此不使用哈希文件名(通常会使用 [name].js 这样的文件名),而是动态加载资源,减少了开发时的性能消耗。