<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Rust VS JS,Rust 已開(kāi)始滲入前端~

          共 9473字,需瀏覽 19分鐘

           ·

          2021-11-22 21:40

          本文翻譯自:Rust Is The Future of JavaScript Infrastructure – Lee Robinson[1] ,已獲得作者授權(quán),原文略做修改以符合中文語(yǔ)境。

          (圖片鎮(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 那樣令人痛苦。

          Rust 使用了一種相對(duì)獨(dú)特的內(nèi)存管理方法,包含了內(nèi)存“所有權(quán)”的概念。基本上,Rust 會(huì)記錄誰(shuí)可以讀取和寫(xiě)入內(nèi)存。它知道程序什么時(shí)候在使用內(nèi)存,一旦不再需要就立即釋放內(nèi)存。它在編譯時(shí)執(zhí)行內(nèi)存規(guī)則,使得運(yùn)行時(shí)的內(nèi)存錯(cuò)誤幾乎不可能出現(xiàn)。你不需要手動(dòng)跟蹤內(nèi)存。編譯器會(huì)照顧到這一點(diǎn)。

          —— Discord[15]

          Adoption

          在上面提到的公司之外,Rust 還被用于流行的開(kāi)源庫(kù),比如:

          • Firecracker[16] (AWS)

          • Bottlerocket[17] (AWS)

          • Quiche[18] (Cloudflare)

          • Neqo[19] (Mozilla)

          Rust 一直是我們團(tuán)隊(duì)的力量源泉,押注Rust是我們做出的最好決定之一。除了性能之外,它的人機(jī)工程學(xué)( ergonomics )和對(duì)正確性的關(guān)注也幫助我們控制了同步的復(fù)雜性。我們可以在類(lèi)型系統(tǒng)中對(duì)系統(tǒng)的復(fù)雜不變性進(jìn)行編碼,讓編譯器為我們檢查。

          —— Dropbox[20]

          從 JavaScript 到 Rust

          JavaScript 是使用最廣泛的編程語(yǔ)言,存在于每個(gè)有瀏覽器的設(shè)備上。在過(guò)去的十年中,圍繞著 JavaScript 已經(jīng)建立了一個(gè)龐大的生態(tài)系統(tǒng):

          • Webpack :開(kāi)發(fā)者希望將多個(gè) JavaScript 文件 bundle 成一個(gè)文件。

          • Babel :開(kāi)發(fā)者希望在支持舊版瀏覽器的同時(shí)編寫(xiě)現(xiàn)代 JavaScript 。

          • Terser :開(kāi)發(fā)者希望生成盡可能小的文件。

          • Prettier :開(kāi)發(fā)者希望有一個(gè)有自帶規(guī)則(opinionated)的代碼格式化器,剛好可用就行。

          • ESLint :開(kāi)發(fā)者希望在部署前發(fā)現(xiàn)他們的代碼存在的問(wèn)題。

          數(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ā)了一類(lèi)新的工具們的誕生,旨在極大地提高 Web 構(gòu)建的性能。

          SWC

          SWC[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 。

          Deno

          Deno[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]

          esbuild

          esbuild[27] 創(chuàng)建于 2020 年 1 月,一個(gè)代碼打包和壓縮的工具,它是用 Go 寫(xiě)的,比當(dāng)今的工具快 10 到 100 倍。

          我試圖創(chuàng)建一個(gè)構(gòu)建工具:

          A)能夠在一個(gè)合理的場(chǎng)景(bundler JavaScript,TypeScript,也許還有CSS)中工作得很好。

          B)能夠重新定義社區(qū)對(duì)構(gòu)建工具速度的期望。對(duì)于JS快速構(gòu)建工具來(lái)說(shuō),到底什么才是快?在我看來(lái),我們目前的工具都太慢了。

          —— Evan,Creator of esbuild( Source[28]

          在 esbuild 發(fā)布之前,用系統(tǒng)編程語(yǔ)言(如 Go 和 Rust )構(gòu)建 JavaScript 工具是相當(dāng)小眾的。因此在我看來(lái),esbuild 激發(fā)人們對(duì)于讓開(kāi)發(fā)工具更快的廣泛興趣。Evan 選擇了使用 Go:

          Rust版本也許可以通過(guò)足夠的努力使其以同等速度工作。但在高層次上,Go 的工作方式更令人愉快。這是一個(gè) side project ,所以它對(duì)我來(lái)說(shuō)必須要有樂(lè)趣。

          —— Evan,Creator of esbuild( Source[29]

          有人認(rèn)為 Rust 可以表現(xiàn)得更好,但兩者都可以實(shí)現(xiàn) Evan 最初的目標(biāo),即影響社區(qū):

          即使只是進(jìn)行了基本的優(yōu)化,Rust也能夠勝過(guò)超手工調(diào)整的 Go 版本。這是一個(gè)巨大的證明,與我們不得不對(duì) Go 的深入研究相比,用Rust編寫(xiě)高效程序是多么容易。

          —— Discord[30]

          Rome

          Rome[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ě)一切呢?

          對(duì) Babel 進(jìn)行必要的修改,使其成為其他工具的可靠基礎(chǔ),這絕對(duì)需要對(duì)所有東西進(jìn)行修改。這個(gè)架構(gòu)與我在 2014 年學(xué)習(xí)解析器、 AST 和編譯器時(shí)做出的最初設(shè)計(jì)選擇是有緊密聯(lián)系的。

          —— Sebastian( Source[33]

          Rome 目前是用 TypeScript 編寫(xiě)的,在 Node.js 上運(yùn)行。但他們現(xiàn)在正致力于 用 Rust[34] 重寫(xiě)[35]

          NAPI

          Rust 與 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 + WebAssembly

          WebAssembly[37] (WASM)是一種可移植的低級(jí)語(yǔ)言,Rust 可以編譯成它。它在瀏覽器中運(yùn)行,可與 JavaScript 互操作,并被所有主要的現(xiàn)代瀏覽器所支持。

          WASM 肯定比 JS 快很多,但還沒(méi)有達(dá)到原生速度。在我們的測(cè)試中,Parcel 編譯成 WASM 后的運(yùn)行速度比使用本地二進(jìn)制文件慢 10 - 20 倍。

          —— Devon Govett[38]

          雖然 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ù)和框架:

          • Yew[40]

          • Percy[41]

          • Seed[42]

          • Sycamore[43]

          • Stork[44]

          這些基于 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 會(huì)迫使你思考你代碼中對(duì)系統(tǒng)編程方面具有很大影響的部分。它讓你思考內(nèi)存是如何共享或復(fù)制的。它讓你思考真實(shí)但不可能發(fā)生的邊界問(wèn)題,并確保它們得到處理。它可以幫助你寫(xiě)出在所有可能的方面都非常高效的代碼。

          —— Tom MacWright ( Source[46] )

          此外,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ì)有這樣的選擇?

          • 可擴(kuò)展性(Extensibility) 。SWC 可以作為 Next.js 內(nèi)部的一個(gè) Crate 使用,而無(wú)需 fork 其它庫(kù)或面臨設(shè)計(jì)上的限制(workaround design constraints)。

          • 性能(Performance) 。通過(guò)改用 SWC ,我們?cè)?Next.js 中實(shí)現(xiàn)了約 3 倍的刷新速度(Fast Refresh)和約 5 倍的構(gòu)建速度,還有更多的優(yōu)化正在進(jìn)行。

          • WebAssembly 。Rust 對(duì) WASM 的支持,使得 Next.js 可以支持所有可能的平臺(tái),讓 Next.js 遍布所有的地方。

          • 社區(qū)(Community) 。Rust 社區(qū)和生態(tài)系統(tǒng)是驚人的,而且還在不斷增長(zhǎng)。

          在逐步使用 SWC 的絕不僅僅是 Next.js:

          • Deno[51] linter、代碼格式化器和文檔生成器都是用 SWC 構(gòu)建的[52]

          • Rome[53] 正在 用 Rust 重寫(xiě)[54] ,并計(jì)劃使用 SWC 。

          • dprint[55] ,建立在 SWC 之上,一個(gè)快 30 倍的用于替代 Prettier 的代碼格式化工具。

          • Parcel[56] 使用 SWC 將整體構(gòu)建性能 提高了 10 倍[57]

          Parcel 像一個(gè)庫(kù)一樣使用 SWC 。之前我們使用 Babel 的解析器和用 JS 編寫(xiě)的自定義轉(zhuǎn)換。現(xiàn)在,我們使用 SWC 的解析器和 Rust 中的 自定義轉(zhuǎn)換[58] 。這包括一個(gè)全局 hoisting 的實(shí)現(xiàn)、依賴(lài)性收集等。它的范圍類(lèi)似于 Deno 在 SWC 之上的構(gòu)建方式。

          —— Devon Govett[59]

          現(xiàn)在是 Rust 的早期階段 —— 有幾個(gè)重要的部分還在摸索之中:

          • 插件(Plungins) 。對(duì)于許多 JavaScript 開(kāi)發(fā)者來(lái)說(shuō),用 Rust 編寫(xiě)插件并不是那么容易的。同時(shí),在 JavaScript 中暴露一個(gè)插件系統(tǒng)可能會(huì)否定性能的提升。目前還沒(méi)有一個(gè)明確的解決方案。

          • 打包(Bundling) 。一個(gè)有趣的發(fā)展領(lǐng)域是 swcpack ,它是 SWC 對(duì) Webpack 的替代。它仍在開(kāi)發(fā)中,但可能是非常有前途的。

          • WebAssembly 。如上所述,編寫(xiě) Rust 并編譯成 WASM 的前景很誘人,但仍有工作要做。

          不管怎么說(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] 審閱本文的早期草稿。

          全文完



          往期推薦


          2021 TWeb 騰訊前端技術(shù)大會(huì)精彩回顧(附PPT)
          面試題:說(shuō)說(shuō)事件循環(huán)機(jī)制(滿(mǎn)分答案來(lái)了)
          專(zhuān)心工作只想搞錢(qián)的前端女程序員的2020

          最后


          • 歡迎加我微信,拉你進(jìn)技術(shù)群,長(zhǎng)期交流學(xué)習(xí)...

          • 歡迎關(guān)注「前端Q」,認(rèn)真學(xué)前端,做個(gè)專(zhuān)業(yè)的技術(shù)人...

          點(diǎn)個(gè)在看支持我吧

          參考資料

          [1]

          Rust Is The Future of JavaScript Infrastructure – Lee Robinson: https://leerob.io/blog/rust

          [2]

          Rust: https://www.rust-lang.org/

          [3]

          歡: https://insights.stackoverflow.com/survey/2016#technology-most-loved-dreaded-and-wanted

          [4]

          迎: https://insights.stackoverflow.com/survey/2017#most-loved-dreaded-and-wanted

          [5]

          編: https://insights.stackoverflow.com/survey/2018#technology-_-most-loved-dreaded-and-wanted-languages

          [6]

          程: https://insights.stackoverflow.com/survey/2019#technology-_-most-loved-dreaded-and-wanted-languages

          [7]

          語(yǔ): https://insights.stackoverflow.com/survey/2019#technology-_-most-loved-dreaded-and-wanted-languages

          [8]

          言: https://insights.stackoverflow.com/survey/2020#most-loved-dreaded-and-wanted

          [9]

          Facebook: https://engineering.fb.com/2021/04/29/developer-tools/rust/

          [10]

          蘋(píng)果: https://twitter.com/oskargroth/status/1301502690409709568

          [11]

          亞馬遜: https://aws.amazon.com/blogs/opensource/why-aws-loves-rust-and-how-wed-like-to-help/

          [12]

          微軟: https://twitter.com/ryan_levick/status/1171830191804551168

          [13]

          谷歌: https://security.googleblog.com/2021/04/rust-in-android-platform.html

          [14]

          垃圾回收: https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)

          [15]

          —— Discord: https://blog.discord.com/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://dropbox.tech/infrastructure/rewriting-the-heart-of-our-sync-engine

          [21]

          SWC: http://swc.rs/

          [22]

          Deno: https://deno.land/

          [23]

          V8: https://v8.dev/

          [24]

          5月才達(dá)到: https://deno.com/blog/v1

          [25]

          v1.0: https://deno.com/blog/v1

          [26]

          SWC 構(gòu)建的: https://twitter.com/devongovett/status/1369033422002389000

          [27]

          esbuild: https://esbuild.github.io/

          [28]

          Source: https://news.ycombinator.com/item?id=22336334

          [29]

          Source: https://news.ycombinator.com/item?id=22336284

          [30]

          —— Discord: https://blog.discord.com/why-discord-is-switching-from-go-to-rust-a190bbca2b1f

          [31]

          Rome: https://rome.tools/blog/2020/08/08/introducing-rome

          [32]

          Sebastian: https://twitter.com/sebmck

          [33]

          Source: https://rome.tools/blog/2020/08/08/introducing-rome

          [34]

          用 Rust: https://twitter.com/rometools/status/1422616144763097091

          [35]

          重寫(xiě): https://twitter.com/rometools/status/1422616144763097091

          [36]

          napi-rs: https://napi.rs/

          [37]

          WebAssembly: https://webassembly.org/docs/use-cases/

          [38]

          Devon Govett: https://twitter.com/devongovett

          [39]

          致力于: https://www.rust-lang.org/what/wasm

          [40]

          Yew: https://yew.rs/

          [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://stork-search.net/

          [45]

          編譯到 WASM: https://rustwasm.github.io/docs/book/introduction.html

          [46]

          Source: https://macwright.com/2021/01/15/rust.html

          [47]

          更快、更難參與貢獻(xiàn): https://twitter.com/devongovett/status/1261379312898306048

          [48]

          唯快不破: https://craigmod.com/essays/fast_software/

          [49]

          Fast software wins): https://craigmod.com/essays/fast_software/

          [50]

          Next.js 12: http://nextjs.org/12

          [51]

          Deno: https://deno.land/

          [52]

          SWC 構(gòu)建的: https://twitter.com/devongovett/status/1369033422002389000

          [53]

          Rome: https://rome.tools/

          [54]

          用 Rust 重寫(xiě): https://twitter.com/rometools/status/1422616144763097091

          [55]

          dprint: https://github.com/devongovett/dprint-node

          [56]

          Parcel: https://parceljs.org/

          [57]

          提高了 10 倍: https://v2.parceljs.org/blog/beta3/

          [58]

          自定義轉(zhuǎn)換: https://github.com/parcel-bundler/parcel/tree/v2/packages/transformers/js/core/src

          [59]

          Devon Govett: https://twitter.com/devongovett

          [60]

          靜態(tài)二進(jìn)制文件: https://en.wikipedia.org/wiki/Static_build

          [61]

          Devon Govett: https://twitter.com/devongovett

          [62]

          https://live.juejin.cn/4354/rescript-lang: https://live.juejin.cn/4354/rescript-lang


          瀏覽 105
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  婷婷九月成人在线 | 五月天婷婷综合 | 日的好深好爽免费视频 | 色视频免费观看 | 国产在线视频卡一卡二 |