Agent Developer Roadmap
构建工具

Rolldown:Rollup 兼容 API 之下的 Rust + Oxc 打包器

核验日期:2026-07-09。示例版本来自 examples/build-tools/package.jsonrolldown 1.1.3。Rolldown 官方文档当前 latest release channel 为 1.x.x;Vite 8 已把 Rolldown 作为统一 Rust bundler。

需要掌握的问题

主题读者必须回答的问题原理与边界高频错误代码或观察证据来源
定位与 Vite 8 关系Rolldown 是什么,为什么不能把它等同于 Vite dev server?Rolldown 是 Rust bundler,目标是以 Rollup 兼容 API 服务 Vite 和独立构建;Vite 提供 dev server、HMR、环境编排和框架体验直接用 Rolldown 期待 Vite 的 HMR、HTML dev transform、依赖预构建和插件容器行为Vite 8 release、Rolldown getting started 中“通过 Vite 使用”说明IntroductionVite 8 release
构建流水线scan → resolve → parse → link → generate 每步输入输出是什么?从 input 扫描入口,resolver 解析依赖,Oxc/Rust 解析和转换模块,link 阶段建立图与 chunk,generate 输出 JS/CSS/assets/map在 transform 阶段期待最终文件名,或在 output 后才想改变 chunk 拓扑Mermaid 流程、共享 rolldown.config.mjsGetting Started
Rust + Oxc 内置能力Rolldown 为什么能少装很多 Rollup 插件?Rust core 负责并行图构建;Oxc 提供 TypeScript、JSX、syntax lowering、minify、resolver 相关能力;moduleTypes 让 CSS/JSON 等非 JS 类型有统一约定继续照搬 Rollup 插件链导致 JS/native 边界过重;误以为内置 TS 转换会类型检查defineConfig、内置 transforms、module types、Oxc resolverNotable FeaturesModule Types
Rollup 兼容配置与插件哪些 Rollup API 可复用,哪些要回归?配置文件、input/output、JS API、watcher 和 Rollup 风格插件 API 尽量兼容;多数插件可复用,但内置能力可能替代插件,私有行为仍要验证插件依赖 Rollup 内部对象、输出钩子时机或 CJS 插件细节,迁移后产物不同resolveIdloadtransformgenerateBundle 示例Getting StartedWhy Plugin Hook Filters
plugin hook filter 与 JS/native 边界为什么 JavaScript 插件会拖慢 Rust bundler?Rust core 可并行处理模块,但每次进入 JS plugin hook 都要跨边界且常在单线程串行;filter 让 Rust 先判断是否需要调用 JS每个插件在 transform 里手写 if (!id.endsWith(...)) return,但仍对所有模块跨边界调用filter 写法、官方 10k benchmark 说明Why Plugin Hook Filters
dynamic import、chunk 与 Tree ShakingRolldown 如何决定 entry chunk、dynamic chunk、common chunk 和可删除代码?dynamic import 形成 dynamic chunks;多入口共享模块可形成 common chunks;DCE 同时要求“未使用”和“无副作用”;manual code splitting 可覆盖默认策略CSS/副作用被误删;manual group 改变执行顺序;HTML 直接加载动态 chunkdetail.ts dynamic entry、SHOULD_NOT_REACH_BUNDLE 被删除、preserved 保留Automatic Code SplittingDead Code Elimination
CSS、assets、manifest 与 bundle analyzer独立 Rolldown 怎样生成浏览器可验收产物?Rolldown 核心负责 bundle;示例用插件把 CSS 聚合为 asset、生成 manifest.jsonindex.html;bundle analyzer 可通过 generateBundle、manifest 或兼容可视化插件读取 bundle只输出 JS 文件,却以为已经是完整应用产物;analyzer 插件兼容性不回归cssAsset()manifest()html() 插件和 artifact testModule TypesGetting Started
CJS、external 与兼容失败迁移 Rollup 配置时哪些地方最容易和旧产物不同?Rolldown 内置 CJS 支持,解析逻辑靠 oxc-resolver;external、platform、Node built-ins polyfill、CJS interop、插件私有 API 都可能影响结果浏览器目标中误用 Node built-ins;CJS default/named interop 与旧插件链不同Notable features、Bundling CJS、TroubleshootingBundling CJSTroubleshooting
迁移与重大变化Rollup/Vite 迁移到 Rolldown/Vite 8 要核对什么?Rolldown 1.x 是稳定 npm 线;Vite 8 用 Rolldown 统一过去 esbuild + Rollup 双管线;许多配置可自动转换,但复杂项目建议先用 rolldown-vite 隔离问题认为 Vite 8 仍由 Rollup 生产构建;把本地小样例耗时当普遍性能结论版本线表、Vite 8 迁移建议Vite 8 releaseGetting Started
native binary 与供应链Rust bundler 的安装和执行边界是什么?Rolldown 发布多平台 prebuilt binaries;无预构建平台可 fallback Wasm 或源码构建;插件仍以 Node 权限执行CI 架构不支持、Wasm fallback 性能不同、插件读取 secret、未锁定 native 包prebuilt 平台、Wasm fallback、插件执行边界Getting Started

内容边界说明:

分类本文落点
编程语言与类型系统解释 TypeScript、JSX、ESM、CJS、dynamic import、DCE 和 Oxc 转换;不教学 JS/TS 语法,也不把 Rolldown 当类型检查器
Browser APIs 与持久化能力覆盖浏览器 ESM、dynamic import、CSS asset、HTML 引用、Source Map 和相对路径;IndexedDB、Storage、权限模型不适用
UI 框架与元框架只说明 Rolldown 与 Vite 8、插件生态、HMR 边界;框架渲染、调度和水合由框架文章负责
构建工具与运行时完整覆盖 input、resolveId/load/transform、parse、link、chunk、Tree Shaking、output、插件、产物和故障定位
后端、数据与 Agent 技术只覆盖 native binary、构建插件以 Node 权限执行、CI/供应链和 bundle 分析;请求生命周期、数据库一致性和 Agent 评测不适用

Rolldown 的主问题:用 Rollup 兼容接口统一高性能打包底座

Rolldown 不只想做一个“更快的 Rollup CLI”。它是 Vite 8 统一底层 bundler 的关键组件:用 Rust 和 Oxc 提供接近 esbuild 级别的性能,同时尽量保留 Rollup/Vite 插件生态的扩展方式。

要先划清边界:Rolldown 自身不是 Vite dev server,也不提供 Vite 的端到端 HMR、HTML 按请求转换、环境 API、框架插件编排或浏览器客户端。即使 Rolldown 核心存在 HMR 相关演进,直接使用 rolldown --config 时你得到的仍是 bundler;需要 Vite 开发体验时应通过 Vite 使用。

和相邻工具的边界:

工具主要职责与 Rolldown 的关系
RollupESM-first 打包器和插件 API 事实标准Rolldown 尽量兼容 Rollup 配置/API/插件,但实现和性能模型不同
esbuildGo 实现的高速转换/打包器Vite 8 之前常用于 dev 转换;Rolldown 试图以 Rust 统一 dev/build 底座
OxcRust 语言工具链,提供 parser、transform、minifier、resolver 等能力Rolldown 使用 Oxc 能力做内置转换、解析和优化
Vite开发服务器、插件容器、生产构建编排Vite 8 把 Rolldown 作为 bundler;Vite 仍负责 dev server 和 HMR
tsdown面向库打包的上层工具Rolldown 文档建议库构建可关注 tsdown,而不是所有库都手写底层配置

严重问题完整流程:

症状根因观察命令修正
直接运行 Rolldown 后没有 HMRRolldown 不是 dev server查看命令是否是 rolldown --config 而不是 vite dev需要开发服务器用 Vite;需要底层 bundle 才直接用 Rolldown
插件迁移后变慢JS 插件对每个模块都跨边界调用打开 plugin hook filter 或减少插件链用内置能力替代插件,为 transform/load 加 filter
构建成功但浏览器白屏只输出 JS,未生成 HTML/CSS/manifest 或 public path 错检查 dist/rolldown/index.html 和 Network用插件或上层工具生成完整浏览器产物

scan、resolve、parse、link、generate:按阶段定位问题

Rolldown 可以用 Rollup 风格配置;下面是最小示意,不包含本文示例里生成 HTML、CSS 和 manifest 的插件:

import { defineConfig } from 'rolldown';

export default defineConfig({
  input: 'src/main.ts',
  output: {
    dir: 'dist/rolldown',
    format: 'esm',
    sourcemap: true,
    entryFileNames: 'assets/[name]-[hash].js',
    chunkFileNames: 'assets/[name]-[hash].js',
  },
});

这段配置会进入如下阶段:

阶段输入处理输出常见错误
scan用户 entry、配置、插件收集入口和初始导入请求待解析 dependencyinput 指错、HTML 当 entry 但没有对应插件
resolvesource + importeroxc-resolver、alias、condition、external、插件 resolveId稳定模块 id 或 external同包多份、Node built-ins 进入浏览器 bundle
parse模块源码Oxc/Rust parse JS/TS/JSX/CJS 等 module typeAST、imports/exports、side effect 初步信息语法超出 transform 目标或模块类型识别错
transform单模块代码内置 TS/JSX/syntax lowering、插件 transform新代码和 source mapmap 丢失、插件对所有文件运行
link所有模块建 module graph、绑定 exports、DCE、side effect 分析可优化的图CJS 动态访问、side effect 不确定导致保守保留
chunk图和 output 配置entry/dynamic/common/manual chunk 切分chunk graphmanual groups 改变执行顺序或缓存策略
generatechunk 和 assets渲染 JS、写 CSS/manifest/HTML/mapdist/ 产物在错误 hook 里依赖最终 hash 文件名

调试建议:先定位阶段,再改配置。比如“找不到模块”通常在 resolve;“代码没降级”在 transform;“文件数量不对”在 chunk;“HTML 没引用 CSS”在 generate。

Rust + Oxc 内置能力:少装插件,但别省掉验证

Rolldown 的内置能力覆盖了很多旧 Rollup 项目会安装插件解决的问题:

能力内置来源取代或减少的插件边界
TypeScriptOxc transform@rollup/plugin-typescript 的部分转译职责不做类型检查,不生成 .d.ts 发布策略
JSXOxc transformBabel/SWC JSX 转换链的一部分框架插件仍可能需要额外 HMR/refresh 逻辑
Syntax loweringOxc transform targetBabel/esbuild 转换的一部分目标环境和 polyfill 仍要另行处理
CJS interopRolldown 内置 CJS 支持@rollup/plugin-commonjs 的很多用法动态 require、奇异 interop 仍要回归
Module resolutionoxc-resolver@rollup/plugin-node-resolve 的很多用法alias、exports、browser/node platform 需核对
define/injecttransform 内置能力replace/inject 类插件的一部分AST-based 替换和文本替换语义不同
minifyOxc Minifierterser/esbuild minify 的部分用法压缩 bug workaround 和 legal comment 策略需测试
CSS/moduleTypesmodule type 约定和插件协作非 JS 资源插件的一部分独立应用产物仍要生成 CSS asset 和 HTML 引用

TypeScript 边界示例:

{
  "scripts": {
    "build": "rolldown --config rolldown.config.mjs",
    "typecheck": "tsc --noEmit"
  }
}

不要把 “Rolldown 支持 TypeScript” 读成 “Rolldown 会替你做类型证明”。它更接近“能解析并删除/转换类型语法,让模块进入 bundle”。

CSS 边界也类似。Rolldown 的 module types 给 CSS 等非 JS 模块一个统一识别和插件协作模型;但独立使用 Rolldown 时,是否写出 CSS 文件、如何注入 HTML、是否提取 critical CSS,仍由配置或插件决定。本仓库示例用自定义 cssAsset() 插件显式产生 assets/styles.css

Rollup 兼容插件:resolveId/load/transform/generateBundle 仍是核心语言

Rolldown 的插件 API 目标是兼容 Rollup,因此迁移时最先核对四类钩子:

钩子输入输出适合做不适合做
resolveIdimport 请求和 importerresolved id、external、nullalias、虚拟模块、external、条件导出改完整源码
loadresolved id源码、map、moduleType、null虚拟模块、读取非标准资源依赖最终 chunk 文件名
transform单模块 code/id新 code、map、moduleTypeTS/CSS/MD/SVG 转换全局 bundle 分析
generateBundle完整 bundle 对象emit asset、修改 bundlemanifest、HTML、bundle analyzer 数据依赖文件已经写入磁盘

共享示例里 manifest() 使用 generateBundle,因为它必须看到完整 bundle:

function manifest() {
  return {
    name: 'manifest',
    generateBundle(_options, bundle) {
      const entries = {};

      for (const item of Object.values(bundle)) {
        if (item.type !== 'chunk' || !item.facadeModuleId) continue;
        entries[toSourceName(item.facadeModuleId)] = {
          file: item.fileName,
          src: toSourceName(item.facadeModuleId),
          isEntry: item.isEntry,
          isDynamicEntry: item.isDynamicEntry,
        };
      }

      this.emitFile({
        type: 'asset',
        fileName: 'manifest.json',
        source: `${JSON.stringify(entries, null, 2)}\n`,
      });
    },
  };
}

一个 CSS 插件应该尽量用 hook filter 减少 JS/native 边界:

function cssAsset() {
  return {
    name: 'css-asset',
    transform: {
      filter: {
        id: { include: /\.css$/ },
      },
      handler(code, id) {
        return {
          code: `export default ${JSON.stringify(id)};`,
          map: null,
          moduleType: 'js',
        };
      },
    },
    generateBundle() {
      this.emitFile({
        type: 'asset',
        fileName: 'assets/styles.css',
        source: '/* collected css */\n',
      });
    },
  };
}

严重问题完整流程:

症状根因观察命令修正
插件逻辑正确但构建慢transform 对所有模块都跨入 JS 后再 return打印 hook 调用次数或用 profiler使用 transform.filter,让 Rust 先过滤 id
manifest 少了 dynamic entry在过早钩子里生成 manifest,看不到完整 bundle检查 manifest.json 是否有 src/detail.tsgenerateBundle 中读取 bundle
Source Map 指向虚拟模块或生成代码插件返回 code 但 map 不完整检查 .map.sources使用 MagicString 或转换器返回 map;虚拟 id 给可读 source

plugin hook filter:Rust 并行和 JavaScript 插件之间的边界

Rolldown 的核心在 Rust 中并行处理模块;JavaScript 插件仍运行在 JS 侧。没有 filter 时,即使插件只关心 .css,hook 也可能对每个 .js.ts.jsx 模块跨边界调用一次。

官方文档用 10k 应用 benchmark 说明:传统写法下,插件数量增加会让构建时间线性变差;加 filter 后,Rust 在跨边界前先判断是否匹配,绝大多数无关模块不会进入 JS hook。

传统写法:

export default {
  name: 'css-only',
  transform(code, id) {
    if (!id.endsWith('.css')) return null;
    return { code: transformCss(code), map: null };
  },
};

更适合 Rolldown 的写法:

export default {
  name: 'css-only',
  transform: {
    filter: {
      id: { include: /\.css$/ },
    },
    handler(code) {
      return { code: transformCss(code), map: null };
    },
  },
};

取舍:

写法性能可靠性使用难度维护成本适用规模
hook 内手写 if小项目可接受语义直观插件少、模块少
hook filter更好,避免大量无关跨边界过滤条件要准确多插件、大模块图、CI 构建
内置能力替代插件通常最好取决于内置语义是否覆盖低到中TS/JSX/CJS/resolve/minify 等常见能力

判断标准:如果插件只处理某些扩展名、目录或模块类型,就写 filter;如果插件依赖所有模块信息,则保留全量 hook,但要接受性能成本。

dynamic import、chunk、Tree Shaking:默认切分不等于最佳切分

Rolldown 的自动代码分割规则可以从三个 chunk 类型理解:

chunk 类型来源示例
entry chunk用户 input 直接指定的入口src/main.ts
dynamic chunkimport() 形成的异步边界src/detail.ts
common chunk被多个 entry 静态共享的模块多入口应用共享的 vendor 或工具模块

共享源码的动态导入:

button.addEventListener('click', async () => {
  const { renderDetail } = await import('./detail');
  renderDetail(panel);
});

预期结果是 manifest.json 中能看到:

{
  "src/main.ts": {
    "isEntry": true
  },
  "src/detail.ts": {
    "isDynamicEntry": true
  }
}

Tree Shaking/DCE 的判断不是“没被 import 就删除”这么简单。Rolldown 官方 DCE 文档给出的核心条件是:值未被使用,并且删除不会改变程序行为。共享源码提供两个观察点:

export const removableMarker = 'SHOULD_NOT_REACH_BUNDLE';
globalThis.__BUILD_TOOLS_SIDE_EFFECT__ = 'preserved';

预期结果:

  • SHOULD_NOT_REACH_BUNDLE 被删除。
  • preserved 保留,因为 side-effect.ts 有顶层副作用。
  • CSS 不能被当成纯模块误删。

manual code splitting 适合控制缓存和加载策略,但会引入执行顺序风险。Rolldown 文档也提醒,自动/手动分块都要保持 singleton 和执行语义;手动 groups 还可能生成 runtime chunk 来保证顺序。

严重问题完整流程:

症状根因观察命令修正
点击按钮才需要的模块进了 initial chunk插件或 manual group 把 dynamic dependency 合并到入口manifest.json 和 chunk 文件移除过宽 manual group,保留 dynamic import 边界
CSS 或 polyfill 消失side effect 判断过激搜索 CSS asset、preserved、运行页面保守处理 CSS/副作用模块,必要时显式标记
manual chunk 后运行顺序变了common/manual chunk 提前或延后了副作用模块浏览器控制台和最小复现减少手动分块,或使用执行顺序相关配置并写回归测试

CSS、manifest、HTML 与 bundle analyzer:独立 Rolldown 要自己定义应用产物

本仓库的 Rolldown 示例刻意不依赖 Vite,而是展示底层 bundler 如何补齐浏览器产物。

运行:

pnpm --filter @roadmap/build-tools-slice build:rolldown

预期结果:

文件用途必须观察的事实
examples/build-tools/dist/rolldown/index.html浏览器入口只引用相对路径的 entry JS 和 CSS
examples/build-tools/dist/rolldown/manifest.json机器可读构建清单包含 src/main.ts entry 和 src/detail.ts dynamic entry
examples/build-tools/dist/rolldown/assets/*.jsentry/dynamic chunk包含必要运行时代码和业务代码
examples/build-tools/dist/rolldown/assets/styles.cssCSS asset来自 src/styles.css
*.map调试映射JS map 包含 main.ts/detail.ts,CSS map 包含 styles.css

自动验收:

node --test --test-name-pattern rolldown examples/build-tools/test/artifacts.test.mjs

bundle analyzer 的思路不是必须依赖某个固定 UI。对独立 Rolldown 项目,有三种实用入口:

分析入口能回答什么成本
generateBundle 中遍历 bundleentry/dynamic chunk、assets、文件大小、facade module最低,适合 CI 产物契约
manifest.json服务端模板、部署系统、async entry 可见性低,但信息比完整 bundle 少
Rollup/Vite 生态可视化插件依赖图和体积可视化中,需要确认 Rolldown 插件兼容性

最小 analyzer 插件:

function bundleAnalyzer() {
  return {
    name: 'bundle-analyzer',
    generateBundle(_options, bundle) {
      const report = Object.fromEntries(
        Object.entries(bundle).map(([fileName, item]) => [
          fileName,
          {
            type: item.type,
            bytes: item.type === 'asset'
              ? String(item.source).length
              : item.code.length,
          },
        ]),
      );

      this.emitFile({
        type: 'asset',
        fileName: 'bundle-report.json',
        source: `${JSON.stringify(report, null, 2)}\n`,
      });
    },
  };
}

CJS、external、platform 与兼容失败:Rollup 兼容不等于结果逐字相同

Rolldown 内置 CJS 支持,且解析基于 oxc-resolver,默认能覆盖很多过去需要 @rollup/plugin-node-resolve@rollup/plugin-commonjs 的场景。但迁移仍要核对结果:

风险点为什么会变观察方式修正
CJS default/named interopRolldown largely follows esbuild semantics;旧 Rollup 插件链可能不同写最小 CJS fixture,对比导入结果给关键包加回归测试,必要时 external
Node built-ins浏览器目标默认不 polyfill Node built-ins搜索 node:fspath 报错不在浏览器 bundle 引入 Node API;确需 polyfill 时显式 opt-in
external旧 Rollup 配置 external 函数可能依赖插件解析顺序打印 external 命中和最终 import固定 peer/external 策略
plugin private API插件依赖 Rollup 内部对象或 undocumented hook 行为跑插件集成测试换内置能力、更新插件或保留 Rollup
CSS/module type旧插件以 query 约定 CSS,Rolldown 可能采用 moduleTypes检查虚拟模块 id 和 CSS 输出使用 moduleType 或兼容插件

external 示例:

const peerDependencies = new Set(['react', 'react-dom']);

export default {
  input: 'src/index.ts',
  external(id) {
    const packageName = id.startsWith('@')
      ? id.split('/').slice(0, 2).join('/')
      : id.split('/')[0];
    return peerDependencies.has(packageName);
  },
  output: {
    format: 'esm',
    dir: 'dist',
  },
};

严重问题完整流程:

症状根因观察命令修正
浏览器报 process is not definedNode/SSR 依赖进入 browser bundle搜索产物 process.node:设置 platform/define,或替换依赖
升级后某 CJS 包默认导出变了CJS interop 语义差异对该包写 import fixtureexternal 该包,或调整导入方式
可视化插件报错插件依赖 Rollup 内部 API最小配置只跑该插件更新插件、换 analyzer 或用 generateBundle 自建报告

迁移与重大变化:Rolldown 1.x、Vite 8 和 Rollup 项目要分开看

Rolldown 官方 getting started 当前显示 latest release channel 为 1.x.x,本仓库使用 rolldown 1.1.3。对工程迁移来说,至少有三条线:

迁移线重大变化建议
Rollup → RolldownRust core、Oxc resolver/transform/minify、内置 CJS/TS/JSX、hook filter、moduleTypes先迁移可观测小包;保留 output fixture、CJS fixture、CSS fixture 和插件集成测试
Vite 7/rolldown-vite → Vite 8Vite 8 使用 Rolldown 作为统一 Rust bundler,并提供兼容层转换部分 esbuild/Rollup 配置大项目先在 Vite 7 用 rolldown-vite 隔离 bundler 问题,再升 Vite 8
独立 Rolldown 1.x直接使用 CLI/API/config,自己负责 HTML、CSS、manifest、预览和部署链路应用项目若需要 dev server/HMR,优先通过 Vite 使用

Vite 8 release 给出的关键信息:

  1. Vite 8 把过去 esbuild + Rollup 双 bundler 路径收敛到 Rolldown。
  2. 迁移目标是性能、兼容和统一工具链,而不是取消 Vite 上层职责。
  3. 多数项目可能无需大量配置变更,但复杂插件、框架和边缘模块语义仍要回归。
  4. Vite 8 要求 Node.js 20.19+ 或 22.12+。

不要把 Vite 8 的能力倒推给独立 Rolldown:

能力独立 RolldownVite 8
生产打包是,底层使用 Rolldown
dev server
HMR
HTML 开发时 transform
framework plugin orchestration只作为底层插件 API
manifest/HTML可通过插件实现Vite build 内置支持

native binary、Wasm fallback 和插件供应链

Rolldown 使用 native binary 发布。官方 getting started 列出了 Tier 1/Tier 2/Experimental 平台,并说明无预构建平台时可以使用 Wasm build 或从源码构建。

工程边界:

边界风险控制措施
native binaryCI/开发机架构不一致,optional package 缺失固定 Node/pnpm;保留 lockfile;在 CI 打印 rolldown --version
Wasm fallback可用性更好,但性能/线程能力可能不同把 fallback 当兼容路径,不把性能结果混在一起比较
JavaScript plugins仍以 Node 权限执行,可读取文件和环境变量审查构建依赖;PR CI 不暴露生产 secrets
analyzer/HTML/CSS 自定义插件影响产物正确性和安全 headers对 HTML、相对路径、Source Map、CSS 做 artifact test

缓存和供应链建议:

node-version
pnpm-lock-hash
rolldown-version
native-platform
config-hash
plugin-version
target-env

严重问题完整流程:

症状根因观察命令修正
CI 中 Rolldown native package 加载失败平台包未安装或架构不支持pnpm --filter @roadmap/build-tools-slice exec rolldown --version检查 optional dependency、平台支持;必要时配置 Wasm fallback
本地 benchmark 和 CI 差异巨大native vs Wasm、CPU、缓存、Source Map、插件数量不同benchmark 输出环境信息分开记录环境,不写无条件性能排名
构建插件泄露 secret插件拥有 Node 权限检查插件源码和 CI env最小化 secrets,新增构建插件走审查

共享示例:用同一份输入验证 Rolldown 的底层打包能力

本仓库示例不通过 Vite,直接运行 Rolldown CLI:

pnpm --filter @roadmap/build-tools-slice build:rolldown

配置特征节选:

import { defineConfig } from 'rolldown';

export default defineConfig({
  input: 'src/main.ts',
  plugins: [
    cleanOutput(),
    cssAsset(),
    manifest(),
    html(),
  ],
  output: {
    dir: 'dist/rolldown',
    format: 'esm',
    sourcemap: true,
    minify: true,
    entryFileNames: 'assets/[name]-[hash].js',
    chunkFileNames: 'assets/[name]-[hash].js',
    assetFileNames: 'assets/[name]-[hash][extname]',
    codeSplitting: true,
  },
});

预期输出:

  • dist/rolldown/index.html:包含 entry script 和 stylesheet,路径是相对路径。
  • dist/rolldown/manifest.json:记录 src/main.tssrc/detail.ts
  • dist/rolldown/assets/*.js:包含 initial chunk 和 dynamic chunk。
  • dist/rolldown/assets/styles.css:由示例 CSS 插件输出。
  • Source Map:JS map 可追溯 main.tsdetail.ts,CSS map 可追溯 styles.css

自动验收:

node --test --test-name-pattern rolldown examples/build-tools/test/artifacts.test.mjs

这组验收刻意覆盖底层 bundler 应该负责的证据:resolve/transform、chunk、Tree Shaking、CSS asset、manifest、HTML、Source Map。它不测试 Vite HMR,因为那不是 Rolldown 独立职责。

来源

在 GitHub 上编辑此页

本页目录