代码 别用 overrides 把 rolldown 1.3.0 塞进 Vite 8.3.6:它锁着版本,HMR 与构建会踩空

2026-11-06 21:07:17

别用 overrides 把 rolldown 1.3.0 塞进 Vite 8.3.6:它锁着版本,HMR 与构建会踩空

Rolldown v1.3.0 是个 minor 版本,带上了实验性的 import attributes 支持,同时有几处变更会改变与 1.2.16 相比的默认行为。这类 minor 在别的项目里随手升一下没什么问题,但官方这次单独提醒 Vite 用户:暂不要通过 overrides 或 resolutions 强制把 rolldown 1.3.0 注入 Vite。

Vite 锁着 rolldown 的版本,是有意为之

Vite 8.3.6 及更早版本需要做改动才能配合 rolldown 1.3 工作,所以 Vite 在依赖里把它锁住了。锁版本背后是 lockstep 假设:Vite 内部直接调用 rolldown 的 API 和运行时行为——插件容器调度、chunk 生成、HMR 的模块边界都依赖它。这些不是对外承诺稳定的接口,Vite 只对自己声明的那段版本范围做测试。1.3.0 改了默认行为,Vite 8.3.6 里依赖旧行为的地方不会报错,只会悄悄走偏:HMR 更新执行不下去、构建产物的分块和预期对不上,这类比编译失败难查得多。

正常安装不受影响。Vite 的依赖声明会拉到它锁定的那个版本,lockfile 里也是它。

overrides 是怎么把 lockfile 弄脏的

overrides 不改变 Vite 声明的依赖范围,只在解析阶段把最终结果替换掉。lockfile 里 Vite → rolldown 那条边记录的是替换后的版本,等于你手写了一份「Vite 依赖 rolldown 1.3.0」的假事实。团队里没配 overrides 的人执行 pnpm install 会得到另一棵树,CI 上 --frozen-lockfile 却照装不误,两边跑的根本不是同一套运行时。

正确的升级顺序:先 Vite,后 rolldown

rolldown 是 Vite 的传递依赖。想用新版本,等一个声明支持 rolldown 1.3 的 Vite 发布,先升 Vite:

# pnpm
pnpm up vite@latest
# npm
npm install -D vite@latest
# yarn
yarn up vite@latest

升完再看 rolldown 有没有跟着换掉:

pnpm why rolldown
npm ls rolldown
yarn why rolldown

反过来,先升 rolldown 再用 overrides 把 Vite 按回去,顺序做反了。

自检:有没有被强行注入

查 overrides 条目。npm 看根 package.json 的 overrides,pnpm 看 pnpm.overrides(新版本里在 pnpm-workspace.yaml),yarn 看 resolutions:

grep -n "overrides" -A5 package.json pnpm-workspace.yaml 2>/dev/null

里面只要出现 rolldown,就是强行注入。

看依赖树上的标记:

pnpm why rolldown
npm ls rolldown --all

两者都会打印完整的引入链,被 override 的包通常带 overridden 标记。树里 Vite 下面挂的 rolldown 版本如果对不上 Vite 自己声明的范围,就是被换过。

翻 lockfile diff:

git diff -- pnpm-lock.yaml | grep -n -i rolldown

只改了一两行版本号、父节点又是 vite 的,基本可以确认。

清理方式:删掉 overrides / resolutions 里那条,重新 pnpm install(或 npm install),再 git diff 确认 lockfile 回到 Vite 声明的那版。

想尝鲜 import attributes,就隔离开

import attributes 就是 import 语句里的 with { ... } 部分,Node 和浏览器处理 JSON、CSS 模块脚本时要求带上它。rolldown 1.3 的 experimental.importAttributes 打开后有三件事变了:

  • 同一个文件用不同属性导入,会被当成不同模块,各自有独立实例;
  • type: 'json'、'text'、'bytes' 不用插件就能工作;
  • 插件在 resolveId、load、transform 里都能读到属性,resolveId 中还能改。

尝鲜别在主仓库主分支上做。单独开分支,或者干脆起一个空工程,把 experimental 标在显眼位置:

git switch -c try/rolldown-1.3-import-attributes
mkdir rolldown-ia-lab && cd rolldown-ia-lab
pnpm init
pnpm add -D rolldown@1.3.0

配置里显式写 experimental.importAttributes: true,并在配置文件顶部或 README 第一行注明「实验特性,不并入主分支」。这样属性相关行为再有变化,影响范围限于实验目录,主应用的 Vite + rolldown 组合仍是它锁定的那一套。

顺带:Vite 8.3.6 自身的行为变化

同期发布的 Vite 8.3.6(2026-11-05)有几处会影响现有项目的改动:

  • server.fs 之外的 .wasm 请求会被拒绝;
  • 静态 alias 替换会保留 $ 模式;
  • build.sourcemap 会尊重来自环境的设置;
  • build.ssr: true 时,SSR 构建使用顶层 input;
  • 用 new URL(..., import.meta.url) 引用、且带 query 或 hash 的文件会被监听。

其余多为修复:重叠的插件容器 close 调用、收集 CSS 依赖时带 query 的动态导入、chunk import map hash 签名改用稳定 module id、bundled-dev 下从 Node 内置模块命名导入、HMR 无法再次执行条目时的重载、服务端 HTML 属性转义、ssr.target=webworker 下对外部内置模块的 require 转 import、optimizer 缓存目录识别更精确、把 pnpm 的 .modules.yaml 排除在 Vite Task 输入之外。性能方面移除了 settle 后的 preload link 监听,cssScopeTo 的渲染模块每份输出只索引一次。

这些和 rolldown 版本是两件事。先确认 Vite 升到位,再谈 rolldown。

复制全文 生成海报 Vite Rolldown 前端构建 依赖管理

推荐文章

程序员茄子在线接单