2023 年 3 月 6 日
今天,我們非常興奮地宣布 Rspack 正式發布! Rspack 是由字節跳動 Web Infra 團隊開發的基於 Rust 的 JavaScript 打包工具,具有高效能、與 webpack 的互操作性、彈性配置等功能。 Rspack 解決了我們場景中的許多問題,並改善了 JavaScript 工程師的開發體驗。為了幫助更多人參與這個令人興奮的項目,我們決定開源這個項目。歡迎您創建 pull request 或 issue。
字節跳動內部有很多大型 JavaScript 應用程式。它們具有非常複雜的建置設定/腳本,可能需要十分鐘到半小時。我們嘗試了很多方法來提高建置效能,但世界上所有現有的解決方案在解決某些問題時都會導致其他問題。經過大量的工作,我們了解到打包工具的需求是
npm run dev
是開發人員每天都會執行多次的腳本。將它們的成本從十分鐘降低到一分鐘確實可以節省很多時間。npm run build
在 CI/CD 環境中很常見,並決定了啟動的效率。字節跳動的許多大型應用程式都需要 20 到 30 分鐘才能建置完成。如果我們能將其縮短到 3~5 分鐘,開發人員將會非常有生產力。總之,我們決定建立自己的打包工具,也就是 Rspack
。
Rspack 專案大約在 11 個月前開始。儘管它仍處於早期階段,但它可以為應用程式的建置腳本帶來 5~10 倍的效能提升。當我們完成所有最佳化時,指標可能會更好。
Rspack 已經完成了 webpack loader 的架構。這表示您可以使用社群中的各種 loader,例如 babel-loader
、less-loader
、svgr
等。我們計劃在 Rspack 中支援 loader 的所有功能。屆時,您可以使用目前尚未支援的 loader,例如 vue-loader
。
Rspack 目前僅支援記憶體快取。持久且可移植的快取將在未來新增。我們正在開發一個建置系統,可以讓快取在兩個裝置或環境之間共用。而 Rspack 將協助完成這項任務。
Rspack 現在已在字節跳動內的所有框架中使用,我們也正試圖與社群中的所有朋友合作。就像 webpack 一樣,Rspack 是 JavaScript 生態系統的基礎架構,這意味著框架和 Rspack 可以彼此互惠互利。
如果沒有社群中各種專案的啟發和支持,Rspack 今天就無法問世。我們想向這些前輩表達我們的敬意
@rspack/html-plugin
是 html-webpack-plugin 的一個分支,目的是避免使用 Rspack 不支援的某些 webpack API。持續建構 Rspack 將是我們的首要任務。與 webpack 相比,Rspack 仍然是個新手,缺乏複雜的功能。請持續向我們傳送有關功能請求的回饋。我們將逐步完成它們。
我們很樂意協助您將 Rspack 整合到您的框架中。如果您是維護框架的工程師,並且碰巧對嘗試 Rspack 感興趣,請與我們聯繫。我們也已與 webpack 團隊建立了合作夥伴關係。Rspack 旨在使用 Rust 優化 webpack 的效能,未來我們將與 webpack 團隊一同探索更多優化 webpack 的可能性。當 Rspack 達到一定成熟度時,webpack 將嘗試透過實驗性標誌將 Rspack 整合到 webpack 中。
Rspack 已支援大多數的 loader API,但僅支援少數外掛程式 API。我們尚未完全支援它們的原因有兩個。一是某些 API 不利於效能,因此我們沒有為開發人員探索它們。另一個原因只是時間不足,因此您可以建立合併請求來幫助我們。
一個高效能的外掛程式系統正在討論中。它可能在未來某一天推出。希望它可以幫助開發人員在獲得彈性配置的同時縮短建置時間。
目前,Rspack 是一個以效能為核心賣點的專案,因此未來我們將做很多事情來維持此特性,例如改進效能觀察實驗室並做好效能預防;在更多情境中使用並行/多核心友好的演算法;開發一個可以跨平台共享的快取系統;優化記憶體的使用和消耗等等。
Webpack 已經累積了非常豐富的測試案例,未來 Rspack 將重複使用 Webpack 現有的測試案例,以提高其程式碼覆蓋率。建立更好的 CI 系統,並與社群專案建立生態系 CI 系統,以確保專案升級不會導致上游專案中斷,以確保專案的長期健康,並確保測試覆蓋率的長期增加。