返回资讯中心
外部精选
软件工程
#开发者实时流

Parcel 3 首个 alpha 发布:用 Rust 重写,比 v2 快 100 倍

来源标题:Parcel 3: 100x faster than v2

Parcel 3 发布首个 alpha 版本,这是用 Rust 从零重写的构建工具,速度最高比 v2 快 100 倍。新版本是完全独立的 Rust 二进制,不依赖 Node,支持用 Rust、Go、Swift、C 编写的原生插件及 JavaScript/TypeScript 自定义运行时。此外还改进了自动代码分割、库模式、tree shaking 和集中式配置等功能。

Hacker News 最新bpierre2026/11/4 · 昨天29 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

今天我们发布 Parcel 3 的首个 alpha 版本,这是用 Rust 对 Parcel 进行的彻底重写。它比 v2 快最多 100 倍,支持用 Rust、Go、Swift 或 C 编写的原生插件,以及面向 JavaScript 和 TypeScript 插件的自定义运行时。它还带来了改进的自动代码分割、库模式、tree shaking、集中式配置等诸多功能。

在 Parcel v2 中,我们用 Rust 重写了 Parcel 的若干独立组件。首先是基于 SWC 构建的 JavaScript 编译器。然后是 Lightning CSS。再后来,我们重建了 HTML 和 SVG 的转换器与优化器。然而,Parcel 的核心仍然是用 JavaScript 编写的。这限制了我们可达到的最高性能,原因包括线程之间缺少共享内存、内存占用高、垃圾回收,以及在工作线程和不同语言之间序列化值的开销。

Parcel v3 是一个完全自包含的 Rust 二进制文件,完全不依赖 Node。从 CLI 和 dev server,到转换器、打包器、优化器以及其间的一切,现在都完全原生实现。这使我们能够高效地充分利用现代多核硬件。结果不言自明:使用与 v2 相同的底层编译器,仅改变核心,构建速度最高提升 100 倍。

直接看基准测试。以下是 React Spectrum(一个大型 TypeScript monorepo)在 v2 和 v3 之间冷启动开发构建的对比。供参考: Storybook – Parcel 2:16.62s16.62sStorybook – Parcel 3:572ms(快 29 倍)572ms · 快 29×Docs websiteDocs website – Parcel 2:87.59s87.59sDocs website – Parcel 3:810ms(快 108 倍)810ms · 快 108×Library buildLibrary build – Parcel 2:131.47s131.47sLibrary build – Parcel 3:2.71s(快 49 倍)2.71s · 快 49×Parcel 2Parcel 3 内存占用 #内存占用,Parcel 2 对比 Parcel 3Storybook:Parcel 2 7.7GB,Parcel 3 1.5GB(少 5.1 倍)。Docs website:Parcel 2 13.9GB,Parcel 3 2.1GB(少 6.6 倍)。Library build:Parcel 2 5.7GB,Parcel 3 2.3GB(少 2.5 倍)。StorybookStorybook – Parcel 2:7.7GB7.7GBStorybook – Parcel 3:1.5GB(少 5.1 倍)1.5GB · 少 5.1×Docs websiteDocs website – Parcel 2:13.9GB13.9GBDocs website – Parcel 3:2.1GB(少 6.6 倍)2.1GB · 少 6.6×Library buildLibrary build – Parcel 2:5.7GB5.7GBLibrary build – Parcel 3:2.3GB(少 2.5 倍)2.3GB · 少 2.5×Parcel 2Parcel 3 无需缓存的速度 #在 Parcel 2 中,我们在磁盘缓存和增量构建上投入了大量精力。一般来说,当底层代码很慢时(比如基于 JavaScript 的打包器),缓存和记忆化是有效的。然而,当冷启动构建本身就很快时,缓存就变得不那么必要了,不仅如此,它实际上可能成为瓶颈。跟踪所有可能导致缓存失效的潜在文件、环境变量、选项、配置等会带来显著开销,还会导致大量 bug。

Parcel 3 采用了显著更简单的架构,针对尽可能快的冷启动构建进行优化,而不是为缓存的开销买单。我们仍然支持内存中的增量重建,但不需要把每个转换结果写入磁盘,也不需要完美跟踪所有可能的失效情况。对于可能产生非确定性结果的变更(如插件或配置),Parcel 3 足够快,直接做一次完整重建即可。这消除了一整类陈旧缓存 bug。

在 Parcel 2 中,我们把每个部分拆分成独立的 npm 包插件。这是一种非常模块化的架构,但导致你需要升级和维护数百个依赖。

在 Parcel 3 中,对大多数常见 Web 语言的支持都开箱即用地包含在单个二进制文件中,包括 HTML、CSS、JavaScript、TypeScript、SVG、图片转换与优化、RSS 和 Atom feed、web manifest 等。新增的原生支持包括 Tailwind(无需 PostCSS)、React Compiler、MDX、SVG → JSX 以及 glob 导入。

Parcel 的开发体验也有重大改进。它包括通过与你操作系统集成的本地证书颁发机构支持可信 HTTPS,改进的 --open 选项可在 macOS 上通过 Apple Events 复用你现有的浏览器标签页,以及内置的 bundle analyzer,可显示每个模块为何被包含、哪些 bundle 加载了其他 bundle 等。

新的 parcel run 命令会构建并运行一个 Node.js 入口,支持热模块替换,仅在需要时重启进程。这非常适合开发 React Server Components 或任何其他 Node 服务器或脚本。

即使拥有所有这些功能以及一个完整的内置 JavaScript 运行时(见下文),Parcel 3 二进制文件不到 30 MB,且零 npm 依赖。这比 Parcel 2 小 4 倍,后者总安装体积(包括依赖)约为 120 MB。

除了这些内置功能,Parcel 3 还可通过用 Rust、Go、Swift 或任何支持 C ABI 的语言编写的原生插件进行扩展。这使任何人都能扩展 Parcel 以支持新语言、自定义模块解析、优化 bundle 等,且全部具备原生性能。

原生 Parcel 插件是在运行时加载到 Parcel 进程中的动态库。Parcel 暴露了一个稳定的 C ABI,插件可以调用其中的函数来获取和设置 asset 内容、读取 bundle 图等。

bool parcel_asset_get_content(struct Buffer *buf, AssetRef asset, Options options, Diagnostics *diagnostics); void parcel_asset_set_content(Asset asset, const uint8_t *data, uintptr_t len, const uint8_t *map, uintptr_t map_len); void parcel_asset_set_type(Asset asset, const uint8_t *ty, uintptr_t ty_len); // ...

C 是编程语言的通用语:它底层、具有稳定的 ABI,且许多高级语言都能与它互操作。我们为 Rust、Go 和 Swift 构建了 SDK,以及一个可复用的 GitHub Actions workflow 来管理交叉编译和发布到 npm。

use parcel_plugin::{Asset, Diagnostic, Options, Plugin, register_plugin}; struct MyTransformer; impl Plugin for MyTransformer {

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →