(图片镇楼,与原文无关) Rust[2] 是一种快速、可靠、内存高效的编程语言。它已经连续六年被评为最受 欢[3] 迎[4] 的 编[5] 程[6] 语[7] 言[8] 。它由 Mozilla 创建,现在被 Facebook[9] 、 苹果[10] 、 亚马逊[11] 、 微软[12] 和 谷歌[13] 用于系统基础设施、加密、虚拟化和更多底层(low-level)的编程中。 为什么Rust现在被用来取代 JavaScript 成为 Web 生态系统的一部分,如压缩(Terser)、编译(Babel)、格式化(Prettier)、打包(webpack)、linting(ESLint),以及其他场景? 什么是Rust?Rust 帮助开发人员编写运行快并高效利用内存的软件。它是 C++ 或 C 等语言的现代替代品,聚焦在代码安全和简洁的语法。 Rust 与 JavaScript 有很大不同。JavaScript 采用的是 垃圾回收[14] 机制,会试图清除不再使用的变量和对象。JavaScript 将开发者从对手动内存管理的思考中抽离出来。 有了 Rust,开发者对内存分配有了更多的控制,而不像 C++ 或 Go 那样令人痛苦。
Adoption在上面提到的公司之外,Rust 还被用于流行的开源库,比如:
从 JavaScript 到 RustJavaScript 是使用最广泛的编程语言,存在于每个有浏览器的设备上。在过去的十年中,围绕着 JavaScript 已经建立了一个庞大的生态系统:
数以百万计的代码被编写出来,甚至更多的 bug 被修复,从而为今天的 Web 应用提供了基础。所有这些工具都是用 JavaScript 或 TypeScript 编写的。目前已经做的很不错了,但我们对 JS 的优化已经达到顶峰。因此,这激发了一类新的工具们的诞生,旨在极大地提高 Web 构建的性能。 SWCSWC[21] 创建于 2017 年,一个下一代快速开发的工具,是一个基于 Rust 的可扩展平台。Next.js、 Parcel 和 Deno 等工具,以及 Vercel、字节跳动、腾讯、Shopify 等公司都在使用它。 SWC 可用于编译(compilation)、压缩(minification)、打包(bundling)等 —— 并且被设计成可扩展的。你可以调用它来执行代码转换(无论是内置的还是自定义的)。这些转换由更高维度的工具来运行,比如 Next.js 。 DenoDeno[22] 创建于 2018 年,是一个简单、现代、安全的 JavaScript 和 TypeScript 的运行时,Deno 使用 V8[23] 的同时,并以 Rust 构建。它试图取代 Node.js ,由 Node.js 的原作者创建。虽然它是在 2018 年创建的,但直到 2020 年 5月才达到[24] v1.0[25] 。 Deno 的 linter、code formatter 和文档生成器是使用 SWC 构建的[26] 。 esbuildesbuild[27] 创建于 2020 年 1 月,一个代码打包和压缩的工具,它是用 Go 写的,比当今的工具快 10 到 100 倍。
在 esbuild 发布之前,用系统编程语言(如 Go 和 Rust )构建 JavaScript 工具是相当小众的。因此在我看来,esbuild 激发人们对于让开发工具更快的广泛兴趣。Evan 选择了使用 Go:
有人认为 Rust 可以表现得更好,但两者都可以实现 Evan 最初的目标,即影响社区:
RomeRome[31] 创建于 2020 年 8 月,包含 linter、compiler、bundler、test runner 以及其它东西,适用于 JavaScript、TypeScript、HTML、JSON、Markdown 和 CSS 。他们的目标是取代和统一整个前端开发工具链。它是由 Sebastian[32] 创建的,他是 Babel 的创建者。 那么,为什么要重写一切呢?
Rome 目前是用 TypeScript 编写的,在 Node.js 上运行。但他们现在正致力于 用 Rust[34] 重写[35] 。 NAPIRust 与 Node.js 的整合比其他低级语言更好。 napi-rs[36] 允许你用 Rust 构建预编译的 Node.js add-ons 。它为交叉编译(cross-compilation)和向 NPM 发布本地二进制文件提供了一个开箱即用的解决方案,不需要 node-gyp 或使用 postinstall 。 相应的,你也能轻松构建一个被 Node.js 侧直接调用的 Rust 模块,而不需要像 esbuild 那样创建一个子进程。 Rust + WebAssemblyWebAssembly[37] (WASM)是一种可移植的低级语言,Rust 可以编译成它。它在浏览器中运行,可与 JavaScript 互操作,并被所有主要的现代浏览器所支持。
虽然 WASM 还不是完美的解决方案,但它可以帮助开发者创建极快的 Web 体验。Rust 团队 致力于[39] 实现高质量和先进(cutting edge)的 WASM 实现。对于开发者来说,这意味着你可以拥有 Rust 的性能优势(相对于 Go ),同时还可以为 Web 服务(使用 WASM )。 这个领域的一些早期库和框架:
这些基于 Rust 的、可编译为 WASM 的 Web 框架并不是要取代 JavaScript,而是要与之一起工作。虽然我们还没有达到这个目的,但看到 Rust 在两方面都追随 Web 的发展是很有趣的:使现有的 JavaScript 工具更快,并在未来提出 编译到 WASM[45] 的想法。 这就是 Rust 之后的路。 为什么不选择 Rust ?Rust 有一个陡峭的学习曲线。它的抽象程度比大多数 Web 开发者所习惯的要低。
此外,Rust 在网络社区的使用仍然是小众的。它还没有达到技术选型临界点(critical adoption)。即使学习 Rust 的 JavaScript 工具会有一定的门槛,但有趣的是,开发者宁愿拥有一个 更快、更难参与贡献[47] 的工具。唯快不破[48](Fast software wins)[49] 。 目前,你很难为你喜欢的服务(如登录鉴权、数据库、支付等工作)找到一个 Rust 库或框架。我确实认为,一旦 Rust 和 WASM 达到技术选型临界点(critical adoption),这个问题会自行解决。但现在还不行。我们需要现有的 JavaScript 工具来帮助我们缩小差距,并逐步采用性能改进。 JavaScript 工具化的未来我相信 Rust 是 JavaScript 工具化的未来。Next.js 12[50] 已经开始了我们的转型,用 SWC 和 Rust 完全取代 Babel(transpilation)和 Terser(压缩)。为什么会有这样的选择?
在逐步使用 SWC 的绝不仅仅是 Next.js:
现在是 Rust 的早期阶段 —— 有几个重要的部分还在摸索之中:
不管怎么说,我相信 Rust 会在未来 1 - 2 年以及未来继续对 JavaScript 生态系统产生重大影响。想象一下这样一个世界:Next.js 中使用的所有构建工具都是用 Rust 编写的,给你带来最佳性能。然后,Next.js 可以作为一个 静态二进制文件[60] (static binary)分发,你可以从 NPM 下载。 这就是我想生活(和建设)的世界。 感谢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]苹果: [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月才达到: https:///blog/v1 [25]v1.0: https:///blog/v1 [26]SWC 构建的: [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]重写: [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]更快、更难参与贡献: [48]唯快不破: [49]Fast software wins): https:///essays/fast_software/ [50]Next.js 12: http:///12 [51]Deno: https://nd/ [52]SWC 构建的: [53]Rome: https://ols/ [54]用 Rust 重写: [55]dprint: https://github.com/devongovett/dprint-node [56]Parcel: https:/// [57]提高了 10 倍: [58]自定义转换: [59]Devon Govett: https://twitter.com/devongovett [60]静态二进制文件: [61]Devon Govett: https://twitter.com/devongovett [62]https://live./4354/rescript-lang: https://live./4354/rescript-lang |
|
来自: 菌心说 > 《编程+、计算机、信息技术》