Webpack常见hash码类型解析

在 Webpack 中,打包时生成的 hash 码是通过特定的算法对文件内容进行计算得到的。Webpack 提供了多种类型的 hash 码生成方式,每种方式都有其特定的用途和生成规则。以下是常见的几种 hash 码类型及其生成方式:
1. [hash]
- 生成方式:
[hash]
是基于整个项目的构建过程生成的。每次构建时,如果项目中的任何文件内容发生变化,[hash]
都会重新生成。 - 用途: 通常用于缓存控制,确保每次构建生成的资源文件名不同,从而避免浏览器缓存旧版本的文件。
- 示例:
bundle.[hash].js
2. [chunkhash]
- 生成方式:
[chunkhash]
是基于每个 chunk(代码块)的内容生成的。每个 chunk 都有自己独立的 hash 值,只有当该 chunk 的内容发生变化时,[chunkhash]
才会重新生成。 - 用途: 适用于多入口应用或代码分割场景,确保只有发生变化的 chunk 的文件名会改变,未变化的 chunk 可以继续使用缓存。
- 示例:
bundle.[chunkhash].js
3. [contenthash]
- 生成方式:
[contenthash]
是基于文件内容生成的。与[chunkhash]
类似,但它更细粒度,通常用于 CSS 文件或其他资源文件。只有当文件内容发生变化时,[contenthash]
才会重新生成。 - 用途: 常用于 CSS 文件或其他静态资源,确保只有内容发生变化的文件会生成新的文件名。
- 示例:
styles.[contenthash].css
4. [fullhash]
- 生成方式:
[fullhash]
是基于整个构建过程生成的,类似于[hash]
,但它更严格,确保每次构建都会生成一个新的 hash 值,即使文件内容没有变化。 - 用途: 适用于需要强制更新缓存的场景。
- 示例:
bundle.[fullhash].js
5. [modulehash]
- 生成方式:
[modulehash]
是基于单个模块的内容生成的。每个模块都有自己独立的 hash 值,只有当该模块的内容发生变化时,[modulehash]
才会重新生成。 - 用途: 适用于需要精确控制模块缓存的场景。
- 示例:
module.[modulehash].js
6. [id]
- 生成方式:
[id]
是基于模块的 ID 生成的。模块 ID 是 Webpack 内部为每个模块分配的唯一标识符。 - 用途: 通常用于调试或特定场景下的模块标识。
- 示例:
module.[id].js
7. [name]
- 生成方式:
[name]
是基于模块或 chunk 的名称生成的。 - 用途: 通常用于生成更具可读性的文件名。
- 示例:
bundle.[name].js
8. [query]
- 生成方式:
[query]
是基于模块的查询字符串生成的。 - 用途: 通常用于处理带有查询参数的模块。
- 示例:
module.[query].js
9. [path]
- 生成方式:
[path]
是基于模块的路径生成的。 - 用途: 通常用于生成与模块路径相关的文件名。
- 示例:
module.[path].js
10. [ext]
- 生成方式:
[ext]
是基于模块的文件扩展名生成的。 - 用途: 通常用于生成与文件扩展名相关的文件名。
- 示例:
module.[ext]
11. [base]
- 生成方式:
[base]
是基于模块的文件名(包括扩展名)生成的。 - 用途: 通常用于生成与文件名相关的文件名。
- 示例:
module.[base]
12. [dir]
- 生成方式:
[dir]
是基于模块的目录路径生成的。 - 用途: 通常用于生成与目录路径相关的文件名。
- 示例:
module.[dir]
13. [file]
- 生成方式:
[file]
是基于模块的文件名(不包括扩展名)生成的。 - 用途: 通常用于生成与文件名相关的文件名。
- 示例:
module.[file]
14. [query]
- 生成方式:
[query]
是基于模块的查询字符串生成的。 - 用途: 通常用于处理带有查询参数的模块。
- 示例:
module.[query].js
15. [path]
- 生成方式:
[path]
是基于模块的路径生成的。 - 用途: 通常用于生成与模块路径相关的文件名。
- 示例:
module.[path].js
16. [ext]
- 生成方式:
[ext]
是基于模块的文件扩展名生成的。 - 用途: 通常用于生成与文件扩展名相关的文件名。
- 示例:
module.[ext]
17. [base]
- 生成方式:
[base]
是基于模块的文件名(包括扩展名)生成的。 - 用途: 通常用于生成与文件名相关的文件名。
- 示例:
module.[base]
18. [dir]
- 生成方式:
[dir]
是基于模块的目录路径生成的。 - 用途: 通常用于生成与目录路径相关的文件名。
- 示例:
module.[dir]
19. [file]
- 生成方式:
[file]
是基于模块的文件名(不包括扩展名)生成的。 - 用途: 通常用于生成与文件名相关的文件名。
- 示例:
module.[file]
20. [query]
- 生成方式:
[query]
是基于模块的查询字符串生成的。 - 用途: 通常用于处理带有查询参数的模块。
- 示例:
module.[query].js
21. [path]
- 生成方式:
[path]
是基于模块的路径生成的。 - 用途: 通常用于生成与模块路径相关的文件名。
- 示例:
module.[path].js
22. [ext]
- 生成方式:
[ext]
是基于模块的文件扩展名生成的。 - 用途: 通常用于生成与文件扩展名相关的文件名。
- 示例:
module.[ext]
23. [base]
- 生成方式:
[base]
是基于模块的文件名(包括扩展名)生成的。 - 用途: 通常用于生成与文件名相关的文件名。
- 示例:
module.[base]
24. [dir]
- 生成方式:
[dir]
是基于模块的目录路径生成的。 - 用途: 通常用于生成与目录路径相关的文件名。
- 示例:
module.[dir]
25. [file]
- 生成方式:
[file]
是基于模块的文件名(不包括扩展名)生成的。 - 用途: 通常用于生成与文件名相关的文件名。
- 示例:
module.[file]
26. [query]
- 生成方式:
[query]
是基于模块的查询字符串生成的。 - 用途: 通常用于处理带有查询参数的模块。
- 示例:
module.[query].js
27. [path]
- 生成方式:
[path]
是基于模块的路径生成的。 - 用途: 通常用于生成与模块路径相关的文件名。
- 示例:
module.[path].js
28. [ext]
- 生成方式:
[ext]
是基于模块的文件扩展名生成的。 - 用途: 通常用于生成与文件扩展名相关的文件名。
- 示例:
module.[ext]
29. [base]
- 生成方式:
[base]
是基于模块的文件名(包括扩展名)生成的。 - 用途: 通常用于生成与文件名相关的文件名。
- 示例:
module.[base]
30. [dir]
- 生成方式:
[dir]
是基于模块的目录路径生成的。 - 用途: 通常用于生成与目录路径相关的文件名。
- 示例:
module.[dir]