掘金 后端 ( ) • 2024-04-19 11:12

前端技术发展至今,Javascript这门语言已经超出了其最初的用途。除了传统的网页效果和交互效果的制作,Javascript还被广泛用于服务端开发、桌面/移动应用开发、游戏开发、插件开发。而Javascript运行时环境,从浏览器环境衍生到了Node.js,至今还发展出了Deno和Bun,可谓是百花齐放。那么不同的Javascript运行时到底有什么不同呢,又或仅仅是重复造轮子呢,下面就由笔者带大家了解一下。

诞生背景

要比较不同的Javascript运行时,还得从他们的诞生背景开始说起,每一种技术的诞生,总有它想解决的痛点。

在Node.js之前,Javascript还仅仅是用于传统网页开发。而在Chrome和V8的发布为Javascript提供强大的运行环境后,Ryan Dahl看到了其潜力,并决定开发一个基于V8的Javascript服务端运行环境。从此开始,Javascript便走上了它的全栈之路。

随着Node.js的发展,它以其事件驱动、非阻塞I/O模型而闻名,具有强大的并发处理能力,广泛活跃于网络应用的开发。但同时,Node.js也存在着如原生API缺少、node_modules依赖过重等缺陷。Node.js之父Ryan Dahl意识到这些问题,并希望创建一个新的运行时来解决这些问题,于是Deno诞生了。

Bun的诞生同样是因为Node.js的缺陷。虽然Node.js在Web开发领域已经取得了巨大的成功,但诸如启动速度、包管理、安全性等方面的问题仍旧困扰着开发者们。为了追求更简单、更快速、更安全的开发环境,Bun诞生了。

性能和速度

结论先行:Bun比Node.js和Deno更快。究其原因,和Node.js/Deno使用的V8引擎不同,Bun使用了Webkit的JavaScriptCore引擎。我们都知道,Chrome浏览器使用的是V8引擎,以其高性能著称,但鲜有人知苹果Safari浏览器使用的JavaScriptCore引擎。JSC引擎优先考虑更快的启动时间和减少内存的使用,V8则优先考虑快速执行并进行更多的运行时优化,但相应的内存占用会增加。JSC的性能是非常优秀的,理论上更胜于V8,但这仅限于苹果平台上,具体原因比较复杂笔者并未深入探究(而且可能是由于其使用JSC的原因,Bun对于win系统的支持不是很友好)。除了JS引擎的不同,Bun还采用了Zig编写,一种静态类型、编译型的低级编程语言,具有手动内容管理功能,从而可以优化代码实现最大的性能。

安全性和权限控制

结论先行:Deno安全性与权限控制最为完善。Deno提供了沙盒环境,这有助于将代码和潜在危险隔离。Deno就像个保险箱,默认情况下,它是安全的,除非用户明确授权,否则脚本运行将受到严格限制。而Node.js的安全性已在社区内遭受诟病,其默认情况下是对系统开放的,第三方依赖可以轻松获取到如文件系统等功能的访问/操作权限。好在社区和维护者已经开始着手改善,权限模型正在实施,Node.js未来将会更加安全。至于Bun,它旨在提供速度,安全性方面可能还未像其他运行时一样经历过完善的安全测试(不敢保证在经历安全性迭代后,其引以为傲的速度会不会受到影响)。

生态系统和社区支持

结论先行:Node.js拥有最完善的生态系统和社区支持。从发展时间来看,Node.js从2009年发布之际已经过去了15年,是本文比较的三个运行时中历史最为悠久的存在,得益于其时间的积累,其配套的开发工具、依赖非常完善,社区活跃。Ryan Dahl于2018年宣布了Deno,2020年正式发布1.0版本。与Node.js相比,Deno的社区规模较小,但发展迅速,生态系统日渐完善,越来越多的Deno软件包、库和工具可供使用。而Bun于2023年才发布其1.0版本,且最初仅支持mac/linux,目前在window系统上仅提供有限的、实验性的功能支持(甚至官方建议于wsl中使用),可谓是‘新颖’且‘小众’了。

易用性和开发体验

这方便只能说是胡萝卜青菜各有所爱。

Deno和Bun都提供了开箱即用的Typescript支持,同时对标准浏览器API支持比较完善,Node.js在这方面只能引用各种依赖以支持Typescript和诸如Promise等API了。

Deno拥有独特的包管理模式,其没有package.json这样的统一的依赖管理文件,一切依赖可以在源码中通过远程地址引用,在本地机器上进行缓存,依赖版本也由其引用地址控制。Bun内置包管理器,而Node.js衍生出诸如npm/yarn/pnpm等多种包管理器,比较多种包管理器并进行选型也成为了开发成本的一部分。

Deno和Bun都在一定程度上兼容Node.js的npm依赖,但当开发过程中用到旧npm包时,Node.js可能又会成为开发者唯一的选择。

跨平台兼容性

除了Bun对Windows操作系统支持欠佳外,Node.js和Deno都能在不同操作系统上开发部署。所有运行时都在不同程度上提供了ARM64支持,其中Node.js支持的平台范围最广。

总结

Bun无疑是速度上最大的赢家,功能上有不少创新点。但它的新颖也给它带来了一定的风险。如果开发者是非Windows平台且注重性能和开发体验,想了解技术前沿的,Bun是一个好工具。

Deno很安全,速度上比Node.js快,比Bun略慢。如果开发者寻求一个现代化、默认安全且日渐成熟的运行时环境,Deno是最好的选择。

Node.js最大的优势在于其成熟度和生态系统规模,其目前仍是生产环境上最禁得起考验的选择。