(圖片鎮(zhèn)樓,與原文無(wú)關(guān)) Rust[2] 是一種快速、可靠、內(nèi)存高效的編程語(yǔ)言。它已經(jīng)連續(xù)六年被評(píng)為最受 歡[3] 迎[4] 的 編[5] 程[6] 語(yǔ)[7] 言[8] 。它由 Mozilla 創(chuàng)建,現(xiàn)在被 Facebook[9] 、 蘋(píng)果[10] 、 亞馬遜[11] 、 微軟[12] 和 谷歌[13] 用于系統(tǒng)基礎(chǔ)設(shè)施、加密、虛擬化和更多底層(low-level)的編程中。 為什么Rust現(xiàn)在被用來(lái)取代 JavaScript 成為 Web 生態(tài)系統(tǒng)的一部分,如壓縮(Terser)、編譯(Babel)、格式化(Prettier)、打包(webpack)、linting(ESLint),以及其他場(chǎng)景? 什么是Rust?Rust 幫助開(kāi)發(fā)人員編寫(xiě)運(yùn)行快并高效利用內(nèi)存的軟件。它是 C++ 或 C 等語(yǔ)言的現(xiàn)代替代品,聚焦在代碼安全和簡(jiǎn)潔的語(yǔ)法。 Rust 與 JavaScript 有很大不同。JavaScript 采用的是 垃圾回收[14] 機(jī)制,會(huì)試圖清除不再使用的變量和對(duì)象。JavaScript 將開(kāi)發(fā)者從對(duì)手動(dòng)內(nèi)存管理的思考中抽離出來(lái)。 有了 Rust,開(kāi)發(fā)者對(duì)內(nèi)存分配有了更多的控制,而不像 C++ 或 Go 那樣令人痛苦。
Adoption在上面提到的公司之外,Rust 還被用于流行的開(kāi)源庫(kù),比如:
從 JavaScript 到 RustJavaScript 是使用最廣泛的編程語(yǔ)言,存在于每個(gè)有瀏覽器的設(shè)備上。在過(guò)去的十年中,圍繞著 JavaScript 已經(jīng)建立了一個(gè)龐大的生態(tài)系統(tǒng):
數(shù)以百萬(wàn)計(jì)的代碼被編寫(xiě)出來(lái),甚至更多的 bug 被修復(fù),從而為今天的 Web 應(yīng)用提供了基礎(chǔ)。所有這些工具都是用 JavaScript 或 TypeScript 編寫(xiě)的。目前已經(jīng)做的很不錯(cuò)了,但我們對(duì) JS 的優(yōu)化已經(jīng)達(dá)到頂峰。因此,這激發(fā)了一類新的工具們的誕生,旨在極大地提高 Web 構(gòu)建的性能。 SWCSWC[21] 創(chuàng)建于 2017 年,一個(gè)下一代快速開(kāi)發(fā)的工具,是一個(gè)基于 Rust 的可擴(kuò)展平臺(tái)。Next.js、 Parcel 和 Deno 等工具,以及 Vercel、字節(jié)跳動(dòng)、騰訊、Shopify 等公司都在使用它。 SWC 可用于編譯(compilation)、壓縮(minification)、打包(bundling)等 —— 并且被設(shè)計(jì)成可擴(kuò)展的。你可以調(diào)用它來(lái)執(zhí)行代碼轉(zhuǎn)換(無(wú)論是內(nèi)置的還是自定義的)。這些轉(zhuǎn)換由更高維度的工具來(lái)運(yùn)行,比如 Next.js 。 DenoDeno[22] 創(chuàng)建于 2018 年,是一個(gè)簡(jiǎn)單、現(xiàn)代、安全的 JavaScript 和 TypeScript 的運(yùn)行時(shí),Deno 使用 V8[23] 的同時(shí),并以 Rust 構(gòu)建。它試圖取代 Node.js ,由 Node.js 的原作者創(chuàng)建。雖然它是在 2018 年創(chuàng)建的,但直到 2020 年 5月才達(dá)到[24] v1.0[25] 。 Deno 的 linter、code formatter 和文檔生成器是使用 SWC 構(gòu)建的[26] 。 esbuildesbuild[27] 創(chuàng)建于 2020 年 1 月,一個(gè)代碼打包和壓縮的工具,它是用 Go 寫(xiě)的,比當(dāng)今的工具快 10 到 100 倍。
在 esbuild 發(fā)布之前,用系統(tǒng)編程語(yǔ)言(如 Go 和 Rust )構(gòu)建 JavaScript 工具是相當(dāng)小眾的。因此在我看來(lái),esbuild 激發(fā)人們對(duì)于讓開(kāi)發(fā)工具更快的廣泛興趣。Evan 選擇了使用 Go:
有人認(rèn)為 Rust 可以表現(xiàn)得更好,但兩者都可以實(shí)現(xiàn) Evan 最初的目標(biāo),即影響社區(qū):
RomeRome[31] 創(chuàng)建于 2020 年 8 月,包含 linter、compiler、bundler、test runner 以及其它東西,適用于 JavaScript、TypeScript、HTML、JSON、Markdown 和 CSS 。他們的目標(biāo)是取代和統(tǒng)一整個(gè)前端開(kāi)發(fā)工具鏈。它是由 Sebastian[32] 創(chuàng)建的,他是 Babel 的創(chuàng)建者。 那么,為什么要重寫(xiě)一切呢?
Rome 目前是用 TypeScript 編寫(xiě)的,在 Node.js 上運(yùn)行。但他們現(xiàn)在正致力于 用 Rust[34] 重寫(xiě)[35] 。 NAPIRust 與 Node.js 的整合比其他低級(jí)語(yǔ)言更好。 napi-rs[36] 允許你用 Rust 構(gòu)建預(yù)編譯的 Node.js add-ons 。它為交叉編譯(cross-compilation)和向 NPM 發(fā)布本地二進(jìn)制文件提供了一個(gè)開(kāi)箱即用的解決方案,不需要 node-gyp 或使用 postinstall 。 相應(yīng)的,你也能輕松構(gòu)建一個(gè)被 Node.js 側(cè)直接調(diào)用的 Rust 模塊,而不需要像 esbuild 那樣創(chuàng)建一個(gè)子進(jìn)程。 Rust + WebAssemblyWebAssembly[37] (WASM)是一種可移植的低級(jí)語(yǔ)言,Rust 可以編譯成它。它在瀏覽器中運(yùn)行,可與 JavaScript 互操作,并被所有主要的現(xiàn)代瀏覽器所支持。
雖然 WASM 還不是完美的解決方案,但它可以幫助開(kāi)發(fā)者創(chuàng)建極快的 Web 體驗(yàn)。Rust 團(tuán)隊(duì) 致力于[39] 實(shí)現(xiàn)高質(zhì)量和先進(jìn)(cutting edge)的 WASM 實(shí)現(xiàn)。對(duì)于開(kāi)發(fā)者來(lái)說(shuō),這意味著你可以擁有 Rust 的性能優(yōu)勢(shì)(相對(duì)于 Go ),同時(shí)還可以為 Web 服務(wù)(使用 WASM )。 這個(gè)領(lǐng)域的一些早期庫(kù)和框架:
這些基于 Rust 的、可編譯為 WASM 的 Web 框架并不是要取代 JavaScript,而是要與之一起工作。雖然我們還沒(méi)有達(dá)到這個(gè)目的,但看到 Rust 在兩方面都追隨 Web 的發(fā)展是很有趣的:使現(xiàn)有的 JavaScript 工具更快,并在未來(lái)提出 編譯到 WASM[45] 的想法。 這就是 Rust 之后的路。 為什么不選擇 Rust ?Rust 有一個(gè)陡峭的學(xué)習(xí)曲線。它的抽象程度比大多數(shù) Web 開(kāi)發(fā)者所習(xí)慣的要低。
此外,Rust 在網(wǎng)絡(luò)社區(qū)的使用仍然是小眾的。它還沒(méi)有達(dá)到技術(shù)選型臨界點(diǎn)(critical adoption)。即使學(xué)習(xí) Rust 的 JavaScript 工具會(huì)有一定的門(mén)檻,但有趣的是,開(kāi)發(fā)者寧愿擁有一個(gè) 更快、更難參與貢獻(xiàn)[47] 的工具。唯快不破[48](Fast software wins)[49] 。 目前,你很難為你喜歡的服務(wù)(如登錄鑒權(quán)、數(shù)據(jù)庫(kù)、支付等工作)找到一個(gè) Rust 庫(kù)或框架。我確實(shí)認(rèn)為,一旦 Rust 和 WASM 達(dá)到技術(shù)選型臨界點(diǎn)(critical adoption),這個(gè)問(wèn)題會(huì)自行解決。但現(xiàn)在還不行。我們需要現(xiàn)有的 JavaScript 工具來(lái)幫助我們縮小差距,并逐步采用性能改進(jìn)。 JavaScript 工具化的未來(lái)我相信 Rust 是 JavaScript 工具化的未來(lái)。Next.js 12[50] 已經(jīng)開(kāi)始了我們的轉(zhuǎn)型,用 SWC 和 Rust 完全取代 Babel(transpilation)和 Terser(壓縮)。為什么會(huì)有這樣的選擇?
在逐步使用 SWC 的絕不僅僅是 Next.js:
現(xiàn)在是 Rust 的早期階段 —— 有幾個(gè)重要的部分還在摸索之中:
不管怎么說(shuō),我相信 Rust 會(huì)在未來(lái) 1 - 2 年以及未來(lái)繼續(xù)對(duì) JavaScript 生態(tài)系統(tǒng)產(chǎn)生重大影響。想象一下這樣一個(gè)世界:Next.js 中使用的所有構(gòu)建工具都是用 Rust 編寫(xiě)的,給你帶來(lái)最佳性能。然后,Next.js 可以作為一個(gè) 靜態(tài)二進(jìn)制文件[60] (static binary)分發(fā),你可以從 NPM 下載。 這就是我想生活(和建設(shè))的世界。 感謝Devon Govett[61] 審閱本文的早期草稿。 全文完 參考資料[1]Rust Is The Future of JavaScript Infrastructure – Lee Robinson: https:///blog/rust [2]Rust: https://www./ [3] https://insights./survey/2016#technology-most-loved-dreaded-and-wanted [4]https://insights./survey/2017#most-loved-dreaded-and-wanted [5]https://insights./survey/2018#technology-_-most-loved-dreaded-and-wanted-languages [6]https://insights./survey/2019#technology-_-most-loved-dreaded-and-wanted-languages [7]https://insights./survey/2019#technology-_-most-loved-dreaded-and-wanted-languages [8]https://insights./survey/2020#most-loved-dreaded-and-wanted [9]Facebook: https://engineering./2021/04/29/developer-tools/rust/ [10]蘋(píng)果: [11]亞馬遜: [12]微軟: [13]谷歌: [14]垃圾回收: [15]—— Discord: https://blog./why-discord-is-switching-from-go-to-rust-a190bbca2b1f [16]Firecracker: https://github.com/firecracker-microvm/firecracker [17]Bottlerocket: https://github.com/bottlerocket-os/bottlerocket [18]Quiche: https://github.com/cloudflare/quiche [19]Neqo: https://github.com/mozilla/neqo [20]—— Dropbox: https:///infrastructure/rewriting-the-heart-of-our-sync-engine [21]SWC: http:/// [22]Deno: https://nd/ [23]V8: https://v/ [24]5月才達(dá)到: https:///blog/v1 [25]v1.0: https:///blog/v1 [26]SWC 構(gòu)建的: [27]esbuild: https://esbuild./ [28]Source: https://news./item?id=22336334 [29]Source: https://news./item?id=22336284 [30]—— Discord: https://blog./why-discord-is-switching-from-go-to-rust-a190bbca2b1f [31]Rome: https://ols/blog/2020/08/08/introducing-rome [32]Sebastian: https://twitter.com/sebmck [33]Source: https://ols/blog/2020/08/08/introducing-rome [34]用 Rust: [35]重寫(xiě): [36]napi-rs: https:/// [37]WebAssembly: https:///docs/use-cases/ [38]Devon Govett: https://twitter.com/devongovett [39]致力于: [40]Yew: https:/// [41]Percy: https://github.com/chinedufn/percy [42]Seed: https://github.com/seed-rs/seed [43]Sycamore: https://github.com/sycamore-rs/sycamore [44]Stork: https:/// [45]編譯到 WASM: [46]Source: https:///2021/01/15/rust.html [47]更快、更難參與貢獻(xiàn): [48]唯快不破: [49]Fast software wins): https:///essays/fast_software/ [50]Next.js 12: http:///12 [51]Deno: https://nd/ [52]SWC 構(gòu)建的: [53]Rome: https://ols/ [54]用 Rust 重寫(xiě): [55]dprint: https://github.com/devongovett/dprint-node [56]Parcel: https:/// [57]提高了 10 倍: [58]自定義轉(zhuǎn)換: [59]Devon Govett: https://twitter.com/devongovett [60]靜態(tài)二進(jìn)制文件: [61]Devon Govett: https://twitter.com/devongovett [62]https://live./4354/rescript-lang: https://live./4354/rescript-lang |
|