【八股系列】webpack打包时Hash码是怎样生成的?随机值存在一样的情况,如何避免?

文章目录

  • [1. Hash码的生成](#1. Hash码的生成)
  • [2. 避免Hash码一致](#2. 避免Hash码一致)
    • [2.1 确保文件内容唯一:](#2.1 确保文件内容唯一:)
    • [2.2 使用chunkhash:](#2.2 使用chunkhash:)
    • [2.3 增加文件名前缀:](#2.3 增加文件名前缀:)
    • [2.4 优化哈希算法:](#2.4 优化哈希算法:)
    • [2.5 使用Module IDs:](#2.5 使用Module IDs:)
    • [2.6 配置webpack输出选项:](#2.6 配置webpack输出选项:)
  • [3. 配置生成Hash的规则](#3. 配置生成Hash的规则)

1. Hash码的生成

webpack打包过程中,hash码并不是随机生成的,而是基于文件内容 的哈希值。这个哈希值是通过对文件内容进行哈希运算 (通常是SHA-1MD5)来得到的,确保内容的任何变化都会导致生成不同的哈希值 。这样做的目的是确保每次文件内容有变动 时,输出的文件名也会相应改变 ,从而强制浏览器重新下载更新的资源

2. 避免Hash码一致

当两个不同的文件意外地生成相同的hash值时,这通常是因为它们的内容实际上是相同的,或者在哈希算法的极小概率事件下出现了碰撞。为了减少这种可能性并确保每个文件的hash码是唯一的,可以采取以下策略:

2.1 确保文件内容唯一:

  • 确保每个模块或文件都有其独特的标识,避免重复的代码或资源。
  • 如果是动态生成的文件,确保每次生成的内容都有微小差异。

2.2 使用chunkhash:

  • 除了hash之外,webpack还提供了chunkhashchunkhash是基于整个chunk(也就是按需加载的模块组合)的哈希,而不是单个文件。这更适用于代码分割,因为它只会在chunk内容改变时更新。

2.3 增加文件名前缀:

  • 可以在webpack配置中添加一个前缀或者时间戳,这将确保即使哈希碰撞,文件名也是唯一的。

2.4 优化哈希算法:

  • 可以考虑调整webpack使用的哈希算法,选择一个更不容易出现碰撞的算法。如:SHA-256SHA-3,它们的碰撞概率更低。

2.5 使用Module IDs:

  • Webpack 4引入了contenthash,它是基于模块内容的哈希,可以用于避免因为模块ID相同而导致的哈希冲突。

2.6 配置webpack输出选项:

  • 确保webpack的输出配置output.filenameoutput.chunkFilename正确设置了哈希模式,例如[name].[chunkhash].js

通过以上方法,可以有效地降低hash码重复的可能性,确保webpack打包后的文件名能够准确反映文件内容的变化。

3. 配置生成Hash的规则

webpack配置文件(通常为webpack.config.js)中,你可以通过设置output对象的filenamechunkFilename属性来控制输出文件的命名方式,包括使用hashchunkhash。下面是一个例子:

javascript 复制代码
const path = require('path');

module.exports = {
  // 其他配置...
  
  output: {
    path: path.resolve(__dirname, 'dist'), // 输出目录
    filename: '[name].[contenthash].js', // 普通文件的命名,使用contenthash
    chunkFilename: '[name].[contenthash].chunk.js', // chunk文件的命名,也使用contenthash
  },
  
  // 其他配置...
};

在这个配置中,[name]代表每个chunk的名称,而[contenthash]则是基于chunk内容生成的哈希值。每次你的代码发生变化,这些哈希值就会更新,确保浏览器会获取到最新的文件。

如果想要使用hash而不是contenthash,只需要将上面的[contenthash]替换为[hash]即可:

javascript 复制代码
filename: '[name].[hash].js',
chunkFilename: '[name].[hash].chunk.js',

hash是基于整个项目的哈希,而contenthash是基于每个单独chunk的哈希。在大多数情况下,contenthash是更好的选择,因为它只在相关代码更改时才更新,减少了不必要的文件重命名。

相关推荐
小满zs几秒前
Next.js精通SEO第三章(TDK + OG)
前端·seo
张风捷特烈1 小时前
状态管理大乱斗#03 | Provider 源码全面评析
android·前端·flutter
灵感__idea7 小时前
Hello 算法:“走一步看一步”的智慧
前端·javascript·算法
吴文周8 小时前
告别重复劳动:一套插件让 AI 替你写代码、修Bug、做测试、上生产
前端·后端·ai编程
Mh9 小时前
我决定写一个 3D 地球仪来记录下我要去的地方
前端·javascript·动效
yaoxin5211239 小时前
390. Java IO API - WatchDir 示例
java·前端·python
懒狗小前端9 小时前
做了一个 codex 的中文文档网站,做的不好可以随便喷
前端·后端
. . . . .10 小时前
ref、useRef 和 forwardRef
前端·javascript·react.js
energy_DT11 小时前
2026年海上钻井平台数字孪生平台:引领海洋能源数字化转型
前端
Eric_见嘉11 小时前
在职前端 Agent 配置分享
前端·后端·agent