代码 Rolldown 1.3 把 preserveModules 文件名改回 Rollup 规则:data.json 变成 data.json.js

2026-11-12 21:01:56

Rolldown 1.3.0:import attributes 进实验选项,Vite 用户先不要强制覆盖

项目地址:
Release:
Vite 8 公告:

Vite 用户:不要用 overrides / resolutions 强制覆盖

官方在 release notes 里单独点名:不要通过 overrides 或 resolutions 把 rolldown 1.3.0 强制安装进 Vite。Vite 8.3.6 及更早版本需要改动才能与 1.3.0 配合工作。Vite 自己锁定 rolldown 版本,正常安装走的是自带的版本,不受影响。正确做法是等支持 Rolldown 1.3 的 Vite 版本发布,再随 Vite 升级。

这也决定了升级顺序:先升级 Vite 到支持 Rolldown 1.3 的版本,再让 rolldown 跟着升级;不要反过来先在依赖里指定 rolldown 1.3.0,因为那样会触发上面提到的版本不匹配问题。

实验性支持 import attributes

即 import 语句里的 with { ... } 部分:

import config from './config.json' with { type: 'json' };
import shader from './shader.glsl' with { type: 'text' };
import wasm from './module.wasm' with { type: 'bytes' };

开启方式:

export default { experimental: { importAttributes: true } }

打开 experimental.importAttributes 后:

  • 同一文件以不同属性导入时,被视为不同模块;
  • type: 'json'、type: 'text'、type: 'bytes' 无需插件即可工作;
  • 插件可在 resolveId、load、transform 中读取属性,并可在 resolveId 中修改属性。

该设计遵循 Rollup 5。默认关闭,原因是它会改变带属性导入模块的 id,把 id 当文件路径使用的插件可能因此失效。Rolldown 的 dev 模式与 Vite 目前都还不支持这个特性。

devtools 构建报告

devtools: { mode: 'report' } 会把每次构建的简短 Markdown 与 JSON 写入 node_modules/.rolldown/report/。报告涵盖:

  • Time:扫描与生成耗时、各 hook 的插件耗时、没有执行任何工作的 hook、transform hook 中最慢的模块;
  • Chunks:最大的 chunk、每个 chunk 存在的原因、出现在多个 chunk 中的模块;
  • Modules;
  • Packages:最大的包、直接依赖与传递依赖、存在多个版本的包;
  • Graph:各入口的初始加载、chunk 导入图、模块保留体积;
  • Changes:与上次构建或固定基线的差异;
  • Raw data:metrics.json 稳定指标 id、module-graph.json、chunk-graph.json。

@rolldown/perf-kit

新包 @rolldown/perf-kit 消费 devtools report 数据,并加入自身测量:

npx @rolldown/perf-kit help

测量三类目标:

  • 页面:限速浏览器中的 LCP/FCP,构建需带 sourcemap;
  • Node.js 或 Deno 服务端:服务就绪耗时;
  • Cloudflare Worker:全局作用域耗时。

破坏性变更

1. preserveModules 文件名改为遵循 Rollup(#11410、#11413)

[name] 现在保留非 JS 扩展名:data.json 会变成 data.json.js 而不是 data.js,Comp.vue 会变成 Comp.vue.js 而不是 Comp.js。把 exports 指向旧文件名的库需要相应更新。

2. CLI:--input 不能与位置参数入口同时使用(#11445)

# 1.3.0 起报错
rolldown 1.js --input 2.js

# 改为
rolldown 1.js 2.js
rolldown --input 1.js --input 2.js

修复:外部导入保留属性

#11302、#11303 修复了外部导入的属性保留问题,无论是否开启 experimental.importAttributes 都生效。此前,同一外部模块带不同属性的两次导入会被合并成一个模块,导致其中一次导入的属性丢失;旧的 assert 关键字也会被复制到输出中,而 Node.js 22+ 无法加载这种写法。

输入:

import 'ext';
import 'ext' with { type: 'json' };
import data from 'ext2' assert { type: 'json' };

1.2.16 输出:

import 'ext' with { type: 'json' };
import data from 'ext2' assert { type: 'json' };

1.3.0 输出,并附带 DEPRECATED_IMPORT_ASSERTION 警告:

import 'ext';
import 'ext' with { type: 'json' };
import data from 'ext2' with { type: 'json' };

插件现在可以在 this.getModuleIds() 中看到这类外部模块的 id 携带属性,例如 ext?attributes=%7B%22type%22%3A%22json%22%7D。

版本与迁移背景

  • Vite 8.0(2026-03-12):用 Rolldown 统一替代开发环境的 esbuild 与生产环境的 Rollup,官方称比 Rollup 快 10-30 倍,插件 API 兼容。迁移建议先在 Vite 7 上切到 rolldown-vite,再升 Vite 8。
  • Vite 8.3.7(2026-11-09):更新 Rolldown 到 1.2.18。
  • Vite 8.3.8(2026-11-11):修复 transform hook meta 与 inline worker 资源。

对照上面这些版本号可以看出,Vite 8.3.x 仍停在 1.2.x;1.3.0 的适配要等后续 Vite 版本,升级顺序仍然是先 Vite、后 rolldown。

复制全文 生成海报 Rolldown Vite 前端构建 打包工具

推荐文章

程序员茄子在线接单