十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Rolldown 深入解析:基于 Rust 的 Rollup 兼容 JavaScript/TypeScript 打包器

Rolldown 深入解析:基于 Rust 的 Rollup 兼容 JavaScript/TypeScript 打包器 Rolldown 深入解析基于 Rust 的 Rollup 兼容 JavaScript/TypeScript 打包器【免费下载链接】rolldownFast Rust bundler for JavaScript/TypeScript with Rollup-compatible API.项目地址: https://gitcode.com/GitHub_Trending/ro/rolldownRolldown 是一个使用 Rust 编写的 JavaScript/TypeScript 打包器bundler其核心目标是成为 Vite 未来的底层打包引擎同时对外提供与 Rollup 兼容的 API 与插件接口功能范围则更接近 esbuild。本文以仓库根目录的 README.md 为主线结合 docs/guide/introduction.md、docs/guide/getting-started.md、docs/guide/notable-features.md 以及 crates 与 packages 目录下的源码从项目定位、Rust 架构、技术底座、上手实战到内建特性逐一展开帮助你既会用、又知其所以然。Rolldown 是什么定位与设计目标README 对项目的定位只有一句话却浓缩了三个关键信息Rolldown is a JavaScript/TypeScript bundler written in Rust intended to serve as the future bundler used in Vite. It provides Rollup-compatible APIs and plugin interface, but will be more similar to esbuild in scope.拆解来看用 Rust 编写这是性能的根基也是与 RollupJavaScript 实现拉开数量级差距的原因。未来服务 ViteRolldown 最初就是为 Vite 设计的目标是统一 Vite 当前依赖的两套工具链——负责转译的 esbuild 与负责打包/产物优化的 Rollup收敛为单一构建工具。API 兼容 Rollup、能力范围接近 esbuild开发者可以像使用 Rollup 一样使用 Rolldown配置项、JavaScript API、插件接口几乎一致同时开箱即用地获得 esbuild 风格的平台预设、内置转译、CJS 互操作等能力详见下文内建特性。值得注意的是README 同时强调 Rolldown 是 VoidZero Inc.一家面向 JavaScript 基础设施的公司旗下的项目。虽然为 Vite 而生但它在设计上完全可以作为独立通用打包器使用——大多数场景下可充当 Rollup 的直接替代品在需要更细粒度分包控制时也可以作为 esbuild 的替代方案docs/guide/introduction.md。仓库全景Rust workspace 架构从仓库根目录的 Cargo.toml 可以看到这是一个典型的 Cargo workspace成员为./crates/*与tasks/*Rust edition 为 2024整体版本统一为1.2.7与 npm 包 packages/rolldown/package.json 中的版本一致。核心 crate 是crates/rolldown其 lib.rs 暴露了最上层的公共 APIBundle、BundleFactory、Bundler、BundlerBuilder、BundleOutput、BundlerConfig并重导出rolldown_common::bundler_options::*与插件模块。从内部模块划分可以直观看出一次打包的完整链路crates/rolldown/src/lib.rsmodule_loader模块加载与依赖图构建stages分阶段执行扫描scan、链接link、代码生成codegen等核心流程该目录下有 39 个 Rust 文件chunk_graphchunk 图构建与分包决策module_finalizers/esm_init_obligations产物收尾与 ESM 初始化逻辑ast_scanner/ecmascriptAST 扫描与 ECMAScript 相关处理bundle/bundler/hmr/utils/types高层编排、HMR 与公共类型workspace 中还按职责拆分了大量支撑 crate例如rolldown_plugin*插件系统与官方内置插件rolldown_plugin_replace、rolldown_plugin_data_url、rolldown_plugin_bundle_analyzer、rolldown_plugin_vite_*系列等rolldown_resolver模块解析rolldown_sourcemap/string_wizardsourcemap 拼接与产物编辑rolldown_error构建诊断与错误报告rolldown_watcher监听模式rolldown_testing/rolldown_testing_config测试基础设施作为 Node.js 生态的打包器Rolldown 通过crates/rolldown_bindingNAPI 绑定层暴露给 JavaScript。该 crate 用mimallocmimalloc-safe作为全局分配器以提升内存分配性能并支持通过tracking_allocator特性开启分配追踪crates/rolldown_binding/src/lib.rs。此外Cargo.toml 的 release profile 采用了lto fat、codegen-units 1、opt-level 3等激进优化配置并从 workspace 层面启用了 pedantic 级别的 clippy 规则dbg_macro、todo、print_stdout等一律 deny可见其对工程质量的要求。技术底座oxc 与 napi-rsREADME 的 Credits 部分明确列出了两个关键支撑项目这也是理解 Rolldown 技术路线最重要的事实oxc提供底层的 parser解析器、resolver模块解析器与 sourcemap 支持。这在 Cargo.toml 中有直接体现workspace 依赖oxc版本 0.149.0启用了transformer、minifier、mangler、semantic、codegen、isolated_declarations等特性、oxc_parser_napi、oxc_resolver对齐 webpack enhanced-resolve 语义支持 Yarn PnP以及oxc_sourcemap。换句话说Rolldown 没有自己重复造解析器和解析器的轮子而是站在 oxc 之上把精力集中在打包器本身的编排与优化上。napi-rs用于将 Rust 实现编译为 Node.js 的 Node-API 原生插件Addon。crates/rolldown_binding正是基于napi/napi-derive3.x 构建的Cargo.toml它生成rolldown/binding-*系列平台二进制包并为 Rust 侧的类型自动生成 TypeScript 类型定义。性能与交付形态从 packages/rolldown/package.json 可以确认其发布形态npm 包名rolldownbin指向./bin/cli.mjs提供rolldown命令行main/module指向./dist/index.mjs类型定义位于./dist/index.d.mts通过napi配置预编译了 16 个目标平台macOS/Windows/Linux/Android/FreeBSD 的 x64 与 arm64 等含wasm32-wasip1-threads的 WASM 版本运行时要求 Node.js^20.19.0 || 22.12.0。也就是说用户在 npm 安装rolldown时实际拿到的是当前平台的原生二进制NAPI 插件或 WASM 回退版本无需本地 Rust 工具链即可使用。快速上手安装、CLI 与首个打包安装在项目中以开发依赖方式安装docs/guide/getting-started.md$ npm install -D rolldownpnpm、yarn、bun 与vpVoidZero 的包管理器分别对应pnpm add -D rolldown、yarn add -D rolldown、bun add -D rolldown、vp add -D rolldown。针对非常规平台CPU 架构 / OS 不在预编译二进制列表内Rolldown 提供了两条路径使用 WASM 构建安装时指定npm install --cpu wasm32 --os wasip1-threads若预编译二进制不可用Rolldown 会自动回退到 WASM。需要强制使用 WASM 时可设置环境变量NAPI_RS_FORCE_WASIerror。从源码构建克隆仓库后按 docs/development-guide/setup-the-project.md 与 docs/development-guide/building-and-running.md 配置环境并构建然后将NAPI_RS_NATIVE_LIBRARY_PATH指向克隆仓库中的packages/rolldown目录。验证与首个 bundle安装完成后先验证 CLI 可用$ ./node_modules/.bin/rolldown --version $ ./node_modules/.bin/rolldown --help创建两个源码文件// src/main.js import { hello } from ./hello.js; hello();// src/hello.js export function hello() { console.log(Hello Rolldown!); }执行打包并运行验证$ ./node_modules/.bin/rolldown src/main.js --file bundle.js $ node bundle.js # 输出Hello Rolldown!写入 package.json 脚本{ name: my-rolldown-project, type: module, scripts: { build: rolldown src/main.js --file bundle.js }, devDependencies: { rolldown: ^1.0.0 } }之后即可用npm run build或pnpm run build/yarn build/bun run build/vp run build触发构建。配置文件与 JavaScript API使用rolldown.config.js当选项变多时官方推荐使用配置文件支持.js、.cjs、.mjs、.ts、.mts、.cts多种格式// rolldown.config.js import { defineConfig } from rolldown; export default defineConfig({ input: src/main.js, output: { file: bundle.js, }, });defineConfig仅用于获得选项的类型提示与自动补全运行时原样返回配置对象直接导出普通对象同样可用。随后用--config简写-c指定{ scripts: { build: rolldown -c } }Rolldown 支持大部分 Rollup 配置项并补充了若干独有特性详见下文。配置文件也可以导出数组多个配置会并行打包export default defineConfig([ { input: src/main.js, output: { format: esm }, }, { input: src/worker.js, output: { format: iife, dir: dist/worker }, }, ]);仓库内真实示例可以参考 examples/basic-typescript/rolldown.config.js它通过defineConfig配置了多入口 input、resolve.conditionNamesoxc resolver 需要显式指定import条件注释说明未来将与 Vite 对齐、devtools与自定义renderChunk插件examples/basic-vue/rolldown.config.js 则展示了 Vue SFC 场景下的配置形态。编程式 APIRolldown 提供了与 Rollup JavaScript API 兼容的用法将input与output选项分离import { rolldown } from rolldown; const bundle await rolldown({ // input options input: src/main.js, }); // 在内存中按不同 output 选项生成产物 await bundle.generate({ format: esm }); await bundle.generate({ format: cjs }); // 或直接写入磁盘 await bundle.write({ file: bundle.js });也可以使用更简洁的buildAPI其参数与配置文件导出的对象完全一致import { build } from rolldown; // build 默认写入磁盘 await build({ input: src/main.js, output: { file: bundle.js }, });Watcher监听模式监听 API 与 Rollup 的watch兼容但有一处差异watcher.close()在 Rolldown 中返回 Promiseimport { watch } from rolldown; const watcher watch({ /* option */ }); // 或 watch([/* 多个 option */]) watcher.on(event, () {}); await watcher.close(); // 与 rollup 不同rolldown 此处返回 promise底层实现位于crates/rolldown_watcher提供watcher.rs、watch_task.rs、watch_coordinator.rs等模块并通过crates/rolldown_binding的binding_watcher_bundler.rs暴露给 JS 层。与 Rollup 兼容的插件体系Rolldown 的插件 API 与 Rollup 插件 API 保持一致因此现有 Rollup 插件大多可直接复用。在此基础上Rolldown 还提供了一套用 Rust 实现的内置插件docs/builtin-plugins/index.md覆盖常见场景且性能更高rolldown_plugin_replace字符串替换对应rollup/plugin-replace的 Rust 实现含 form 测试目录 crates/rolldown_plugin_replace/testsrolldown_plugin_data_url资源转 data URL含 crates/rolldown_plugin_data_url/README.mdrolldown_plugin_bundle_analyzer产物体积分析对应文档 docs/builtin-plugins/bundle-analyzer.mdrolldown_plugin_esm_external_require处理 ESM 外部依赖的 requiredocs/builtin-plugins/esm-external-require.mdrolldown_plugin_asset_module/rolldown_plugin_copy_module资源模块与复制模块rolldown_plugin_lazy_compilation懒编译rolldown_plugin_hmrHMR 支持rolldown_plugin_isolated_declarationisolated declaration 生成以及rolldown_plugin_vite_*系列alias、import_glob、json、manifest、resolve、transform、web_worker_post 等这些是从 Vite 生态迁移或对齐的插件实现此外社区插件可以在 Vite Plugin Registry 中检索需要强调的实践要点是Rolldown 的许多能力已内建见下节因此很多场景下不必再引入插件。内建特性速览超越 Rollup 的默认能力README 提到 Rolldown more similar to esbuild in scopedocs/guide/notable-features.md 详细列出了这些在 Rollup 中没有内置等价物的特性Platform presets平台预设通过platform选项browser | node | neutral默认cjs输出时为node否则为browser提供模块解析与process.env.NODE_ENV处理的合理默认值与 esbuild 的显著差异是默认输出格式始终为esm。注意面向 browser 时不会自动 polyfill Node 内建模块。Built-in transforms内置转译基于 oxc transformer开箱支持 TypeScript含 legacy decorators 与 decorator metadata可通过tsconfig选项读取tsconfig.json配置、JSX以及按 target 自动降级的语法转译最低支持到 ES2015。CJS 支持混合 ESM/CJS 模块图无需rollup/plugin-commonjs语义对齐 esbuild并声称通过全部 esbuild 的 ESM/CJS 互操作测试仓库内 crates/rolldown/tests/esbuild 目录下的海量测试用例含 1479 个.js、940 个.json、846 个.snap文件正是这类兼容性验证的载体。Module resolution模块解析由 oxc-resolver 驱动默认按 TypeScript 与 Node.js 的解析行为工作无需rollup/plugin-node-resolve提供resolve选项且当顶层tsconfig选项存在时会尊重compilerOptions.paths。Define通过transform.define用常量表达式替换全局标识符对齐 Vite 与 esbuild 的对应选项。它是AST 级替换因此被替换值必须是合法标识符或成员表达式——这与rollup/plugin-replace的字符串替换行为不同后者应使用内置replacePlugin。Inject通过transform.inject将特定模块导出的值垫片为全局变量等价于rollup/plugin-inject。Manual Code Splitting手动代码分割通过output.codeSplitting细粒度控制分包行为能力类似 webpack 的optimization.splitChunks对应深入文档 docs/in-depth/manual-code-splitting.md。Module Types模块类型实验特性概念类似 esbuild 的loader可通过moduleTypes全局关联文件扩展名与内置模块类型详见 docs/in-depth/module-types.md。Minification压缩通过output.minify启用由 oxc minifier 驱动当前仍在持续完善中WIP。这些特性共同支撑了很多场景无需插件的体验也是 Vite 生态得以在其上重建的根基。测试与兼容性验证仓库对兼容性投入了大量测试资源可作为可信度佐证crates/rolldown/tests/esbuildesbuild 官方测试套件的移植/镜像覆盖解析、转换、打包语义等规模达数千个用例crates/rolldown/tests/rollupRollup 行为兼容测试crates/rolldown/tests/integration集成测试crates/rolldown/tests/test262_failures.json与 test262ECMAScript 官方一致性测试相关的失败用例清单说明其以 test262 为参照检验 ECMAScript 处理正确性packages/rollup-tests面向 Rollup API 兼容性的测试集合另有rolldown_testingcrate 提供统一的 fixture 测试基础设施。贡献与许可参与贡献README 明确欢迎更多贡献者加入入门指引见 docs/contribution-guide/index.md。仓库还提供了完善的开发文档包括环境搭建docs/development-guide/setup-the-project.md、构建运行docs/development-guide/building-and-running.md、性能分析docs/development-guide/profiling.md、测试方法docs/development-guide/testing.md与代码风格docs/development-guide/coding-style.md等新贡献者可以按图索骥。Credits向先行者致敬README 明确表示 Rolldown 深受两个项目启发Rollup提供 API 与插件接口的设计蓝本与esbuild提供性能基准与能力范围的参照并由napi-rsNode-API 绑定与oxcparser、resolver、sourcemap提供底层支撑。这些项目在架构与技术选型上的沉淀构成了 Rolldown 能够兼容 Rollup、对标 esbuild的基石。许可证项目本体采用 MIT License部分代码衍生或复制自 Rollup 与 esbuild均为 MIT完整的第三方许可证汇总见根目录的 THIRD-PARTY-LICENSE。小结Rolldown 的独特之处在于它并非简单重写一个 bundler而是在 Rust 高性能实现之上同时继承了 Rollup 的插件生态兼容性API 层与 esbuild 的功能范围能力层并以 Vite 的未来底层引擎为第一目标。通过本文你可以看到它的架构在 crates 下以清晰的阶段化scan → link → codegen组织底层由 oxc解析/转译/压缩与 napi-rs绑定支撑npm 交付物 packages/rolldown 覆盖主流平台并具备 WASM 回退而 docs/guide 与 docs/in-depth 则提供了从安装配置到源码原理的完整学习路径。若想深入某一环节直接阅读对应 crate 的源码与 tests 目录是最快的验证方式。【免费下载链接】rolldownFast Rust bundler for JavaScript/TypeScript with Rollup-compatible API.项目地址: https://gitcode.com/GitHub_Trending/ro/rolldown创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表