Node.js、Deno、Bun看看哪家更强?

前端技术发展至今,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最大的优势在于其成熟度和生态系统规模,其目前仍是生产环境上最禁得起考验的选择。

相关推荐
间彧2 分钟前
Docker Compose和Kubernetes在编排服务时有哪些核心区别?
后端
间彧7 分钟前
如何在实际项目中集成Arthas Tunnel Server实现Kubernetes集群的远程诊断?
后端
冴羽19 分钟前
今日苹果 App Store 前端源码泄露,赶紧 fork 一份看看
前端·javascript·typescript
蒜香拿铁22 分钟前
Angular【router路由】
前端·javascript·angular.js
时间的情敌28 分钟前
Vite 大型项目优化方案
vue.js
brzhang1 小时前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构
西洼工作室1 小时前
高效管理搜索历史:Vue持久化实践
前端·javascript·vue.js
樱花开了几轉1 小时前
element ui下拉框踩坑
开发语言·javascript·ui
草明1 小时前
Go 的 IO 多路复用
开发语言·后端·golang
蓝-萧1 小时前
Plugin ‘mysql_native_password‘ is not loaded`
java·后端