webpack中hash,chunkhash,contenthash有什么区别

问答webpack中hash,chunkhash,contenthash有什么区别
王利头 管理员 asked 2 年 ago
3 个回答
Mark Owen 管理员 answered 2 年 ago

作为一名开发者,在使用 Webpack 时,经常会遇到三种哈希值:hash、chunkhash 和 contenthash。它们虽然都与构建过程中的哈希值有关,但用途和计算方式却截然不同。

hash

Hash 是 Webpack 为整个编译后的输出文件(包括所有 chunk)生成的哈希值。它是基于文件内容的,如果任何内容发生改变,都会导致哈希值发生改变。Hash 的主要目的是确保文件在浏览器中缓存的准确性。

当一个文件被浏览器缓存后,如果该文件的内容发生改变,浏览器将不会重新下载该文件。相反,它会检查文件的新哈希值是否与缓存的哈希值相同。如果哈希值相同,浏览器将继续使用缓存的文件,从而避免不必要的下载。

chunkhash

Chunkhash 是 Webpack 为每个 chunk 生成的哈希值。Chunk 是一个包含多个模块的代码块。与 hash 类似,chunkhash 也是基于 chunk 内容的,如果 chunk 中的任何模块发生改变,都会导致 chunkhash 发生改变。

Chunkhash 主要用于对独立部署的代码块进行缓存。例如,当一个 Web 应用程序由多个 chunk 组成时,每个 chunk 可以独立缓存。当更改只影响其中一个 chunk 时,只有该 chunk 的哈希值会发生改变,而其他 chunk 的哈希值保持不变。这可以减少应用程序的重新下载量,提高性能。

contenthash

Contenthash 是 Webpack 为单个文件生成的内容哈希值。它与 hash 和 chunkhash 不同,contenthash 仅考虑文件的内容,而不考虑其他因素,如文件名或路径。

Contenthash 主要用于确保内容的完整性,例如图像、视频或其他静态资产。通过将 contenthash 添加到这些资产的 URL 中,可以确保浏览器仅从正确的来源加载这些资产。这可以防止攻击者通过修改资产或将其指向恶意来源来劫持应用程序。

总结

以下是 hash、chunkhash 和 contenthash 之间的主要区别:

| 特征 | hash | chunkhash | contenthash |
|—|—|—|—|
| 作用 | 整个输出文件 | 每个 chunk | 单个文件 |
| 计算方式 | 基于整个输出文件 | 基于每个 chunk | 基于单个文件内容 |
| 用途 | 缓存整个输出文件 | 缓存独立部署的代码块 | 确保内容完整性 |

在使用 Webpack 时,选择正确的哈希类型取决于应用程序的特定需求。根据具体场景,合理使用 hash、chunkhash 和 contenthash,可以优化应用程序的性能、安全性,以及缓存策略。

seoer788 管理员 answered 2 年 ago

在 webpack 的世界中,哈希值是用来唯一标识文件的一种重要技术。它可以确保每次构建时生成的代码都是唯一的,从而提高缓存命中率,加快构建速度。webpack 提供了三种不同的哈希算法:hash、chunkhash 和 contenthash。让我们深入了解它们的差异。

hash

hash 是 webpack 默认使用的哈希算法。它生成的是一个基于整个编译结果的哈希值。这意味着,只要编译结果发生任何变化,无论文件内容如何,hash 都会改变。

优点:

  • 唯一性:它可以生成唯一的哈希值,即使文件内容发生细微变化。
  • 快速:与其他哈希算法相比,它相对较快。

缺点:

  • 稳定性:它不适合于频繁更新的文件,因为每次更新都会导致哈希值改变。
  • 缓存无效:对任何资源的任何更改都会使所有依赖于它的资源的缓存无效,这可能会导致性能问题。

chunkhash

chunkhash 与 hash 类似,但它是基于单个 chunk 生成的。这意味着,只有当一个 chunk 的内容发生变化时,chunkhash 才会改变。

优点:

  • 更稳定的哈希:它提供了比 hash 更好的稳定性,因为只有当 chunk 内容更改时它才会更改。
  • 更有效的缓存:由于它仅影响受影响的 chunk,它可以实现更有效的缓存。

缺点:

  • 较慢:与 hash 相比,它需要更多的计算时间。
  • 哈希冲突:在某些情况下,不同的 chunk 可能会产生相同的 chunkhash,导致缓存问题。

contenthash

contenthash 是基于文件内容生成的哈希值。这意味着,只有当文件的内容发生变化时,contenthash 才会改变。

优点:

  • 最稳定的哈希:它是所有哈希算法中最稳定的,因为它只受文件内容的影响。
  • 有效的缓存:它允许对仅修改内容的文件进行有效的缓存。

缺点:

  • 最慢:它是所有哈希算法中最慢的。
  • 哈希冲突:在某些情况下,不同的文件可能会产生相同的 contenthash,导致缓存问题。

最佳实践

对于大多数情况,chunkhash 是一个不错的选择,因为它提供了合理的稳定性和缓存效率。对于频繁更新的文件,contenthash 可以提供更好的稳定性。

以下是一些最佳实践:

  • 对于不经常更改的 vendor 库,使用 hash
  • 对于经常更改的代码,使用 chunkhash
  • 对于以内容为中心的文件(如图像、字体),使用 contenthash

通过明智地选择哈希算法,你可以优化 webpack 构建,提高缓存命中率,并最终加快构建速度。

ismydata 管理员 answered 2 年 ago

在 webpack 的构建过程中,使用哈希可以为输出文件生成唯一且不可预测的标识符。这对于缓存、版本控制和安全至关重要。webpack 提供了三种不同的哈希类型:

1. Hash

hash 是 webpack 中最通用的哈希类型。它考虑了输入文件的所有内容,包括模块、加载器和插件的依赖项。每次构建时,只要输入发生任何变化,hash 就会更新。

示例:


[hash].bundle.js

使用此哈希,如果模块 A 发生了更改,即使模块 B 没有更改,[hash].bundle.js 的名称也会更新。

2. ChunkHash

chunkHash 考虑了每个块的内容,但不考虑所有依赖项。对于多入口点或代码拆分应用程序,这很有用。当某个块的内容发生更改时,chunkHash 会更新,而其他块的 chunkHash 保持不变。

示例:


[chunkhash].main.js

使用此哈希,如果模块 A 属于 main 块,并且模块 A 发生了更改,那么 [chunkhash].main.js 的名称将更新,但 [chunkhash].vendor.js 的名称将保持不变。

3. ContentHash

contentHash 仅考虑模块本身的内容。这对于只有少部分模块发生更改的项目非常有用,因为不需要重新构建整个应用程序。当模块的内容发生更改时,contentHash 会更新,而其他模块的 contentHash 保持不变。

示例:


[contenthash].moduleA.js

使用此哈希,如果模块 A 发生了更改,即使模块 B 没有更改,[contenthash].moduleA.js 的名称也会更新,但 [contenthash].moduleB.js 的名称将保持不变。

选择哪种哈希

选择哪种哈希类型取决于你的具体需求:

  • 使用 hash 当需要一个整体的不可预测的哈希时。
  • 使用 chunkHash 当需要为每个块生成一个不可预测的哈希时。
  • 使用 contentHash 当仅在模块的内容发生更改时需要生成一个不可预测的哈希时。

此外,还可以配置哈希的长度。默认情况下,hashchunkHash 的长度为 20 个字符,contentHash 的长度为 32 个字符。可以通过在 webpack 配置中设置 hashDigest 选项来更改。

理解这三种哈希类型之间的差异至关重要,以便在 webpack 构建过程中做出明智的决定。通过选择正确的哈希类型,你可以优化构建性能、提高缓存效率并增强应用程序的安全性。

公众号