这个对我来说有一段时间不明显,所以我认为它值得更详细的解释。
官方文档是怎么说的:
来自官方documentation的简要说明他们的目的:
确保浏览器拾取更改文件的一种简单方法是使用
output.filename 替换。 [hash] 替换可用于
在文件名中包含特定于构建的哈希,但它甚至是
最好使用 [contenthash] 替换,它是
文件的内容,每个资产都不同。
另一个解释来自output.filename的documentation:
-
[hash] 是“为每个构建生成的唯一哈希”
-
[chunkhash] 是“基于每个块的内容”
-
[contenthash] 是“为提取的内容生成的”
让我们通过示例使其更易于理解:
我的src 目录中有 3 个文件:index.js、index.css、vendors.js
我的示例 Webpack 配置中的相关部分:
(不是完整的工作配置!)
entry: {
index: ["./src/index.js", "./src/index.css"],
vendors: ["./src/vendors.js"]
},
output: {
filename: "[name].[hash].js"
}
plugins: [
new MiniCssExtractPlugin({
filename: "[name].[hash].css"
})
]
所以我有 2 个块名称,index 和 vendors,但请注意 index 块也将具有 css 内容,因为它在数组中导入了一个 css 文件。构建时,css 部分将使用 MiniCssExtractPlugin (在我的情况下)导出到单独的文件,但 Webpack 知道 index.js 和 index.css 属于同一个块。
现在让我们尝试使用不同的散列类型来构建它。 (同样更改两个filename 选项)
使用 [hash]:
每个文件都有相同的哈希值,因为[hash] 是根据我们所有使用过的源文件生成的。如果我在不更改任何内容的情况下重新运行构建,生成的哈希将保持不变。如果我只编辑一个文件,那么哈希值将会改变,并且我生成的所有捆绑包的名称中都会包含这个新的哈希值。
使用 [chunkhash]:
如您所见,第一个和第二个文件来自同一个 index 块,因此它们的名称中具有相同的哈希值。这是因为[chunkhash] 是根据给定块的全部内容生成的。因此,如果我编辑index.css 并重新构建,来自index 块的文件将有一个新的哈希值,但来自vendors 块的文件将保持与以前相同。
使用 [contenthash]:
这个很明显。每个生成的文件在其名称中都有一个唯一的哈希值,该哈希值是根据该文件的内容计算得出的。如果我改变假设index.css 重新构建,则只有生成的index.css 会有新的哈希。