Vite 8.3.5 的 21 条修复里有 8 条落在 bundled-dev:dev 也走打包之后,「dev-only」语义得重写一遍
Vite 8.3.5 于 2026-10-21 发布,包含 21 条修复,其中 8 条属于 bundled-dev,2 条属于 build 的 chunk import map,其余是 CSS、依赖与平台细节。同一天 6.x 线也发布了 6.4.5。
- Vite CHANGELOG:https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md
- 原文:https://www.moiu.cn/zh/blog/vite-835/
bundled-dev 是什么
bundled-dev 是 Vite 8 里在 dev 阶段也做打包的模式,替代原先逐请求的模块转换。出发点很直接:模块图大(上千个模块)时,浏览器要发上千个请求,冷启动慢;先打包能把请求数压到个位数。
代价是:一旦 dev 和 build 共用同一条打包流水线,每一条原本「只在 dev 生效」的语义都得重新实现一遍。8.3.5 里近一半修复集中在这里,正是这些语义缺口被陆续暴露出来的结果。
bundled-dev 的 8 条语义缺口
- HMR 传播在已不再被 import 的模块处停止(#23839):删掉某条 import 之后,再编辑相关文件仍会触发更新,页面闪烁。
- 转发的错误栈经过 bundle 的 source map 映射(#23741):不映射的话,dev 下报错的行号指的是打包产物,不是源码。
- server.origin 应用到资源 URL(#23683):反向代理或自定义 origin 场景下,资源会 404。
- fallback 页声明 utf-8 charset(#23846):fallback 路由下中文乱码。
- 忽略 build.chunkImportMap(#23685):仅用于 build 的配置漏进了 dev。
- 用户的
import.meta.env.*define 合并进import.meta.env对象(#23713):自定义变量在 dev 里读不到。 - 规范化对外提供的输出文件(#23684)。
- 处理 HMR server 未接管的 upgrade 请求上的 socket 错误(#23728)。
build 与 CSS
build 两条:处理缺失的 chunk import map(#23777);把 preload 依赖纳入 chunk import map 的哈希计算(#23793)。
CSS 一条:url() 里出现字面 % 时不再直接失败(#23676)。
其他修复
- optimizer 回退到
yarn.lock计算 lockfile hash(#23667) - 扫描
oxc.jsxInject的 import(#23758) yarn.lock回退时跳过 patches 目录检查;nub lockfile 跳过 patches 目录哈希- 解析含多个
#的 subpath imports(#23631) - 升级
resolve.exports2.0.4 - 只在路径匹配完整段时才剥离 base(#23641)
- SSR 内联 source map 提取不再用正则(#23775)
8.3.4(2026-10-08)顺带记录
- bundled-dev 支持
import.meta.hot.acceptExports - 修复 restart 期间发起的 restart 请求被丢弃
- watcher 在做 root 检查前先规范化文件路径
- html 不再把文件系统根目录加进 watcher
升级与排查建议
什么时候开 bundled-dev:模块图规模大到冷启动被请求数拖住时收益明显;模块数量不多的项目,默认的逐请求转换路径语义更完整,没必要切换。开之前确认版本已在 8.3.5 及以上,前面那批 HMR 传播、source map、import.meta.env 的问题都已修掉。
dev 报错行号对不上:先确认 bundle 的 source map 是否被正确映射(#23741)。若栈里指向的是打包后的位置,检查是否有自定义 sourcemap 配置覆盖了 dev 默认值;server.origin 与反向代理同时存在时,也顺带核对资源 URL 是否命中 #23683 修的那条路径。
fallback 路由中文乱码:对照 #23846,确认 fallback 页的 charset 声明已经生效,而不是被自定义 HTML 模板覆盖掉。