Rust 的風(fēng),終究還是吹到了前端
前幾天有一個(gè)叫做Rolldown的工具悄悄開源了,做前端開發(fā)的同學(xué)可能已經(jīng)了解到了。我寫這篇文章時(shí)是晚上,看到 star 數(shù)量是 4.6k,而在這一天的上午我打開這個(gè)倉庫的時(shí)候應(yīng)該是3.7k。開源作者正是前端大佬,Vue 創(chuàng)始人尤雨溪。
要說這個(gè)工具有什么特點(diǎn)嗎?那可能有這么幾個(gè)特點(diǎn):
- 使用 Rust 語言編寫;
- 性能更好,當(dāng)然也得益于第1點(diǎn);
- 主要開發(fā)者都是前端程序員,而且還有很多貢獻(xiàn)者也是前端開發(fā)者。當(dāng)然了,對(duì)于大佬們來說,語言只是實(shí)現(xiàn)功能的一個(gè)工具,用哪個(gè)都可以;
Rolldown 是什么
Rolldown 是一個(gè)用 Rust 編寫的 JavaScript bundler,旨在未來作為 Vite 中的 bundler 使用。
現(xiàn)在寫前端幾乎都是用框架了,最流程的就是 Vue、React 了。基本上都采用模塊化開發(fā)了,很少有用原生js、JQuery 來開發(fā)的項(xiàng)目了。相比于后端而言,一個(gè)大的前端項(xiàng)目一點(diǎn)也不比后端的文件少,甚至更多。
而一個(gè)用模塊化方式編寫的項(xiàng)目,想要在瀏覽器上運(yùn)行,還需要做一些額外的工作。其中一個(gè)非常重要的工作就是將多個(gè)JS或者 TS 文件合并到一個(gè)文件中,而這個(gè)文件,瀏覽器能直接支持。這個(gè)過程就是 bundler(捆綁器)所要做的工作。
當(dāng)然,現(xiàn)代瀏覽器對(duì)模塊化已經(jīng)支持的很好了,但是現(xiàn)在的打包服務(wù)還是會(huì)使用 bundler 打包成一個(gè)或幾個(gè)js文件來用作線上環(huán)境。因?yàn)檫@樣能最大限度的提高性能,尤其是減少網(wǎng)絡(luò)方面的開銷。
Rolldown 就是用來實(shí)現(xiàn)以上所說的功能的。
Rust 出手,要的就是快
現(xiàn)在主流的前端編譯工具有 Webpack 和 Vite。Webpack 是比較老牌的了,功能豐富。還有最近比較火的 Vite,Vite 也是 Vue 團(tuán)隊(duì)開發(fā)的,功能對(duì)標(biāo) Webpack,只是性能要比 Webpack 高不少。
前端編譯工具所說的性能好主要體現(xiàn)在幾個(gè)方面:
- 打包速度快,如果一個(gè)項(xiàng)目巨大的話,性能差的打包工具可能要好幾分鐘;
- 開發(fā)調(diào)試響應(yīng)快,改完一個(gè)文件,馬上就能看到效果,而不是等上半天;
除了這兩個(gè)功能最豐富的工具外,還有功能簡(jiǎn)單,專門用做 bundler 的 esbuild,用 Go 開發(fā),性能極好。下面是幾個(gè)常見工具打包一個(gè)簡(jiǎn)易項(xiàng)目的時(shí)間。
圖片
現(xiàn)在 Vite 中用的 bundler 就是倒數(shù)第二的這個(gè) Rollup,所以這次尤雨溪大佬開發(fā) Rolldown 也就是為了將這一部分的性能提上來。看名字也很有意思,一個(gè) up,一個(gè)down。
前兩天尤雨溪發(fā)的博文中說到,Rolldown 比 esbuild 還要快1.4~2倍,而且功能更豐富。果然大佬不用選擇,既要性能好又要功能豐富,沒有的話,那就自己開發(fā)。就是這么任性。
圖片
我看到 Hacker News 上,關(guān)于 Rolldown 有一個(gè)討論,有一條是這么說的。
圖片
“
這是一個(gè)有趣的臨界質(zhì)量案例。幾年前,Rust 是一種不太適合啟動(dòng) JavaScript 工具(或 Python)的語言。然而,一些瘋狂的人并不在意,只是繼續(xù)這樣做。隨著時(shí)間的推移,對(duì)工具的基本投資水平突然意味著有很多可以利用的東西,它從一種晦澀的語言選擇變成了一種相當(dāng)合理的語言選擇。
”
Rust 的風(fēng)吹呀吹
不只是Rolldown,還有很多前端的工具正在被用 Rust 改寫。
比如 Tailwind CSS ,在最新的 4.0 版進(jìn)展公告中,也有寫到關(guān)于 Rust 的一些應(yīng)用。
Rust where it counts — we’ve migrated some of the most expensive and parallelizable parts of the framework to Rust, while keeping the core of the framework in TypeScript for extensibility.
Rust 發(fā)揮了重要作用——我們已將框架中一些最昂貴且可并行的部分遷移到 Rust,同時(shí)將框架的核心保留在 TypeScript 中以實(shí)現(xiàn)可擴(kuò)展性。