關於 Rolldown
太長不看
Rolldown 是一個使用 Rust 編寫的 JavaScript 捆綁器,目的是作為 Vite 中使用的未來捆綁器。它提供與 Rollup 相容的 API 和外掛程式介面,但其範圍更類似於 esbuild。
🚧 工作進度
Rolldown 目前處於積極開發中,尚未可用於實務,但我們現在開放原始碼,因此我們可以開始與社群貢獻者合作。
為什麼我們建立 Rolldown
Rolldown 被設計為用於 Vite 的未來底層捆綁器。
目前,Vite 在內部依賴兩個捆綁器
esbuild,由 Evan Wallace 建立。Vite 使用 esbuild 進行 依賴項預先捆綁、TypeScript / JSX 轉換、目標降低和縮小。
Rollup,由 Rich Harris 建立並由 Lukas Taegert-Atkinson 維護。Vite 使用 Rollup 進行實務建置,並支援與 Rollup 相容的外掛程式介面。
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 工具的團隊成員。