Vite 8.3.6 修了「哈希漂移」:chunk 的 import map 签名改用稳定模块 id,构建产物终于可复现
四条硬修复:import map 哈希改用稳定模块 id,产物可复现;带 query 的动态 import 能正确收集 CSS;重叠的插件容器 close 会互相等待。
11 月 5 日,Vite 发了 8.3.6。四个 bug 修复,其中一条我看了很久:chunk 的 import map 哈希签名改用稳定模块 id。

「哈希漂移」为什么让人难受
做过前端部署的人都遇到过这种事:代码一行没改,重新构建一次,产物的文件名全变了。于是 CDN 缓存全失效,用户重新下载一遍,构建机的缓存也白攒。
原因通常不是「内容变了」,而是参与哈希计算的东西不稳定 —— 绝对路径、遍历顺序、模块 id 的生成方式,任何一个不稳定,哈希就抖。
这次修的是后者:import map 的哈希签名以前会用模块 id 的某种不稳定形态,现在换成稳定的 id。对 CI 的直接影响是:同一份源码连续构建两次,产物应该字节一致。

带 query 的动态 import,CSS 依赖收集漏了
第二条:import('./foo.css?inline') 这种带 query 的动态 import,在「收集 CSS 依赖」时以前会被解析错。后果是 CSS 顺序错乱,或者样式根本没被收集进去 —— 这类问题在开发时看着正常,构建后才炸,最难查。
第三条偏内部但很实在:重叠的插件容器 close() 调用现在会互相等待。插件容器在并发关闭时没有等待,会出现「A 的清理还没结束,B 已经开始」的竞态,表现是偶发的文件锁、删不掉的临时目录。

bundled dev 的补一条
第四条:bundled-dev 模式现在允许有名字地从 Node 内置模块导入(import { readFile } from 'node:fs/promises')。以前这种写法在打包开发模式下会报错,只有默认导入能过。
这条跟 Vite 8 引入的 bundled dev(用打包器跑 dev server)路线有关。新路线省下的是冷启动和 HMR 的极限速度,代价就是这类「以前能过、现在过不去」的边角。
我的做法
前端构建工具的小版本,我现在的策略是「跟随但不合并发布」:先在自己项目的 CI 里升一次,看两件事 ——
- 连续两次构建的产物哈希是否一致(这次修的正是这个)
- CSS 顺序是否变化(第二、三条修复都在这个区域附近)

如果两件事都过,就跟。这套流程花了十分钟,省过我最少三次「上线之后某处样式悄悄变了」的排查。
顺带一句:8.x 这条线现在最大的红利是 bundled dev,最大的风险也是它。补丁版本的价值就在于把这些边角一条条磨平。要不要现在就上?如果 8.3.x 已经在你项目里跑得好,那 8.3.6 没有理由不升。

评论
…