【八股系列】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-1或MD5)来得到的,确保内容的任何变化都会导致生成不同的哈希值 。这样做的目的是确保每次文件内容有变动 时,输出的文件名也会相应改变 ,从而强制浏览器重新下载更新的资源。

2. 避免Hash码一致

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

2.1 确保文件内容唯一:

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

2.2 使用chunkhash:

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

2.3 增加文件名前缀:

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

2.4 优化哈希算法:

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

2.5 使用Module IDs:

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

2.6 配置webpack输出选项:

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

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

3. 配置生成Hash的规则

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

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是更好的选择,因为它只在相关代码更改时才更新,减少了不必要的文件重命名。

相关推荐
卸任2 小时前
Vibe coding工具使用心得
前端·ai编程
brien93 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance3 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M3 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写3 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李3 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易3 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
清晨Coding4 小时前
删了 Cookie 还能自动登录?Google系网站登录态自动恢复的原理分析
javascript
风骏时光牛马4 小时前
前沿视界
前端
kyriewen4 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员