跳到內容

關於 Rolldown

太長不看

Rolldown 是一個使用 Rust 編寫的 JavaScript 捆綁器,目的是作為 Vite 中使用的未來捆綁器。它提供與 Rollup 相容的 API 和外掛程式介面,但其範圍更類似於 esbuild。

🚧 工作進度

Rolldown 目前處於積極開發中,尚未可用於實務,但我們現在開放原始碼,因此我們可以開始與社群貢獻者合作。

為什麼我們建立 Rolldown

Rolldown 被設計為用於 Vite 的未來底層捆綁器。

目前,Vite 在內部依賴兩個捆綁器

Vite 必須使用兩個不同的捆綁器,因為雖然兩個都很棒,但它們各自都缺少另一個提供的功能

  • esbuild 速度飛快且功能豐富,但其輸出,特別是在塊拆分限制方面,並不適合捆綁應用程式。

  • Rollup 成熟且通過實務測試,可為應用程式捆綁,但其速度遠不如使用編譯到原生語言的捆綁器快。

必須使用兩個不同的捆綁器在以下幾個方面並不理想

  • 輸出間的細微差異可能會導致開發和實務建置間的行為差異。

  • 使用者來源在整個實務建置過程中一再由不同的工具進行剖析、轉換和序列化,導致產生許多可以避免的負擔。

理想情況下,我們希望 Vite 能夠利用單一捆綁器,該捆綁器提供原生層級效能、內建轉換(避免剖析/序列化負擔)、與 Rollup 相容的外掛程式介面,以及適用於大型應用程式的進階建置輸出控制。

這就是我們建立 Rolldown 的原因。

Rolldown 是使用 Rust 編寫的,並建立在 Oxc 之上,目前利用其剖析器和解析器。我們還計畫在未來 Oxc 的轉換器和縮小器可用時利用它們。

我們的長期目標是讓 Vite 使用者(直接或透過框架)能夠輕鬆轉換到內部使用 Rolldown 的 Vite 版本。

同時,Rolldown 也將直接作為一個獨立的捆綁器使用。

Rollup 相容性和差異

Rolldown 盡可能與 Rollup 的 API 和外掛程式介面保持一致,以簡化採用。在簡單的使用案例中,它很可能會成為一個隨時可用的替換品。然而,也很可能會在邊緣案例中有一些細微的差異,特別是在涉及進階選項時。

我們一開始的意圖是從 JS 轉到 Rust,但很快地意識到,為了實現最佳的效能,我們必須優先編寫與 Rust 運作方式一致的程式碼。Rolldown 的內部架構較接近 esbuild,而非 Rollup,而我們的區塊分割邏輯最後可能會與 Rollup 不同。

Rolldown 的作用範圍也大於 Rollup,且更類似於 esbuild。它內建 CommonJS 支援、node_modules 解析,未來也將支援 TypeScript/JSX 轉換及壓縮。

為何不逐步改善 Rollup?

Vite 是建立在巨人的肩膀上,它的成功有很大一部分要歸功於 Rollup。我們與 Rollup 目前的主要維護者 Lukas 有良好的合作關係,並非常感謝他傑出的貢獻。在開始開發 Rolldown 之前,我們聯繫了 Lukas 以確保他知悉且接受這件事。共識是同時探索逐步改善(Lukas 負責)和從頭開始重新實作(我們負責)這兩種方式。

我們的論點是,考量到 JavaScript 的單執行緒性質和套件管理工具的複雜性,要透過逐步的變更達成我們追求的效能等級極為不可能。如 Rollup 4 採用 Rust 基礎的 SWC 剖析器所顯示,將部分元件移至 Rust 所獲得的效能提升,通常會被 Rust 與 JavaScript 之間資料傳遞的成本所抵銷。為了達成最佳效能,整個剖析/轉換/程式碼產生流程必須在原生環境中進行,且盡可能平行化。這只能透過從頭開始實作才能實現。

路線圖

查看 GitHub 討論區中的 路線圖

加入我們!

Rolldown 目前仍處於早期階段。我們有很長一段路要走,且沒有社群貢獻者協助的話,我們無法辦到。我們也在積極尋找長期致力於利用 Rust 改善 JavaScript 工具的團隊成員。

上次更新時間:

以 MIT 授權條款釋出。