概述
这是一个新开的技术系列。
最近笔者在尝试性的实验和评估一个新的Web应用开发技术-bun。 这个过程中有一定的积累和思考,就想到著文记录之。由于这个过程还在持续当中,所以相关的内容会以系列的形式出现。也作为某种工作的总结和记录。
本文是本系列的第一篇博文。主要内容是简单的介绍一下这个技术。
bun是什么
我们先来看看它自己的定义(From bun.sh):
Bun is a fast Javascript
runtime,package manager,bundlertest runner,bundle
... all in one toolkit
We're on a mission to make JavaScript faster & simpler.
简单而言,它就是一个JS开发的全能工具箱。考虑到它的开发背景,笔者理解,它就是专门针对nodejs在开发过程中令人不太满意的地方的补充和改进的开发技术系统,就是nodejs的替代品(或者一种外部升级)。在它的网站中,是这样描述nodejs生态的状况的:
.. complex, fragmented toolchains common today: Node.js, Jest, Webpack, esbuild, Babel, yarn, PostCSS, etc.
bun开发和发展的愿景,就是为了解决上面的问题,使JavaScript更快和更简单。
Why bun?
下面是基于其技术文档,结合笔者有限的使用体验,简单的总结了一些自认为比较重要的方面和特性如下:
- Nodejs兼容
客观的说,它虽然把这个列在第一条,但考虑到时间过于短促,有一些地方还是不如人意的,但确实在一般的应用场景中,开发者是感受不到兼容问题的。这一特性的主要意义,就是其对产品的定义,应该就是想要作为一个兼容但更好的选择,继承现有nodejs庞大完善的开发体系和用户。
- 高性能JavaScript运行环境
这主要是和nodejs相比,它确实也是达到了这一主要目标,笔者亲测有效,性能改善幅度在50%以上,如果比较看重这一方面,确实是值得升级的。
- Web Standard APIs
这当然是应有之义,还有就是HTTP框架方面,比node要好一些(比如内置提供route, 原生WebSocket、fetch等等)。
- 包管理器
相对而言,nodejs使用npm,起码从形式上需要另一个程序,再说npm确实问题比较多。bun内置提供了包管理系统,来方便使用和支持开发。
- TyptScript支持
本来笔者不是TS的拥趸,但这个也想给个好评。这一点是nodejs特别是老版本的弱项,老是搞不好,很别扭。
- 数据库内置支持
是的!!bun内置SQLite和Postgres的支持,这对于笔者现在使用的技术栈非常重要。除了上面两个关系数据库之外,还原生支持S3和Redis,这是笔者在查阅资料是发现的,还没有机会实际应用。
- 单一可执行文件
这对于云计算应用部署很重要,笔者也很看好这个技术的发展。但遗憾的是,它现有的实现,只是比Node方便了一点,但起码它现在还是没法实现全功能的项目的支持,距离理想状态还很远。只不过现在大家基本上都是这个状态,所以也不算明显的优势或者弱项。
- Bundler
可能前端的开发者更感兴趣,但笔者这方面接触的不多。
- JSX支持
也是前端方面的内容。
- Dev Server
内置一个HTTP Server,主要方便支持前端的开发。
- 内置Test Runner
好评!结构清晰,使用方便。这对于完善开发和测试过程,非常重要。
- Cross-Platform
作为一个新的技术体系,在这方面表现的不错。迄今笔者在Windows、Linux和Arm Linux上的使用,都没有太大的问题。
- Crypto
相比nodejs还不够完善,但应该算是够用了。
- 单一工具
在按照完成后,bun是单一的可执行文件和工具,非常有go的感觉,这非常方便使用和移植。
需要注意的是,bun虽然是定位在一个全功能的Web应用开发体系系统。但笔者主要是从后端开发的角度来了解和评估这一技术的,可能有比较片面的地方,希望有观点的读者予以补充和指正。
当然,bun也不算完美无缺,起码在现在这个阶段,还是有不少的问题的。下面也简单的从笔者思考的角度,例举几条:
- 发展时间比较短
nodejs也是长时间发展,大量的用户使用过程中,逐步发展起来的。相比而言,其实笔者觉得的bun的发展速度已经挺快了,产品成熟度从应用的角度也可以接受。但可能在笔者看不到的地方,应该有一些由于时间过短没有表现出来的问题。这很多不是产品和技术的问题,而是任何事物发展的客观规律。
- 零星兼容性问题
这是笔者在编写本系列文章的过程中发现的。特别是arm64平台的系统要注意。包括crypto的兼容性,还是有对env支持好像在这个平台上有点问题。
有些兼容性,可能的问题就是用例比较少,所以社区并没有及时发现或者改进。
- Crypto
虽然号称支持nodejs的crypto模块,但实际上,可使用的算法是有限的,可能还在完善当中。比如ECC可选曲线的列表和数量,chacha20-1305算法支持等等。
- REPL
现在的bun版本没有原生的REPL。也就是说,你在命令行里面输入bun,它不会向nodejs一样,进入一个执行命令环境。但笔者发现有一个模块,可以执行类似的功能。执行 bun repl,它会安装repl模块,并进入一个模拟的repl环境。
- cluster
nodejs可以支持内置的child process,这对于实现支持新型硬件的现代化高性能应用程序是比较重要的。现在bun原生没有这个功能。只能用Workers和多实例的方式在外部实现,这样应用场景就会收到一定限制。
- 进程管理
笔者在nodejs生产环境喜欢使用pm2来进行进程的管理。但好像在hun中,没有看到类似的技术和机制(也许是孤陋寡闻和对bun了解的不够深入吧)。
- 社区
对于任何开源系统而言,技术社区都是非常重要的。相比nodejs而言,由于发展时间短,bun的技术社区,显然也没有那么庞大和完善。但逻辑上而言,bun对Nodejs有很好的技术继承性,所以,nodejs的技术社区,也可以看成是bun的社区?
- 过于理想
在笔者刚开始看到bun这个产品定位和目标的时候,其实是非常担心的。因为它设定的目标过于全面和理想化了。几乎包括了和Web应用开发所有相关的技术和内容: HTTP协议、包管理、数据库、测试、安全、前端....。 这样很容易产生发展的不平衡或者导致系统的庞大和低效。但随后的评估和体验感觉还不错,这方面的担心减少了很多。但还是希望开发者能够很好的平衡需求和资源的分配,有条不紊,扎扎实实的把系统的开发和演进搞好,重视开发体验,保持系统的健壮和稳定,解决各个发展阶段的重要问题和核心诉求。
其实,如果读者对JS Web开发体系了解和熟悉的话,就知道,基于类似的目的,bun还有一个类似的竞争技术:deno(node reverse)。笔者也曾简单的了解了一下,但相对而言,经过一段实际的应用和比较,笔者还是觉得bun的理念和实现可能更优秀一点。
以上就是笔者对bun进行初步的应用和评估的一些观点和思考。后续的具体内容,会从实际代码和执行的角度,来佐证和说明这些内容和观点。笔者也会根据相关主题,分成系列的内容和文章逐步完善和呈现。
其他的技术规格
Bun的开发,起始于2022年7月(第一个发布版v0.1.1)。截至到本文成文的时间(2025-05-30),Bun的最新版本是 v1.2.15。版本已经发展到超过了1,说明这个开发团队,自认为这个产品已经相对成熟,基本达到了一个可以使用的状态。就是已经具有的核心特性和功能,是稳定和可靠的。其他的非核心特性,还需要不断发展完善。
Bun使用Zig语言开发。
Bun所使用的JS引擎,并不是Nodejs所使用的大名鼎鼎的V8,而是另一个虽然不太显赫,但实际上很有实力的JavaScriptCore(JSC)。bun选择JSC的考虑和nodejs可能稍有不同,可能是因为它把自己定位成为轻型高性能Web应用开发有一定关系。因为业界一般认为,JSC相对V8而言:
- 冷启动速度更快,但V8相对在长时间执行过程中的优化做的更好
- 内存占用较小
- 更温和的垃圾回收机制,更适合轻量执行环境
- 嵌入系统开销更小
- JSC的二进制体积更小
- 更适合移植,而V8的依赖比较多
- JSC使用的C语言接口,和Zig配合更加自然流畅
安装完成之后,bun的发行版本会表现成为一个单一的可执行文件,大小在94M左右(相比而言nodejs 22版本在120M左右)。
已知缺陷
这是笔者在本系列成文过程中,新增加的章节,因为在研究评估中,发现了一些问题,觉得需要记录一下。
之所以会发现这些问题,可能的原因是笔者故意使用了一个不太典型的执行环境,很多问题都是在这个系统上出现的,这个系统是一个RK3399的嵌入式系统,CPU架构arm64,Linux的版本是Ubuntu20.04,内核版本4.4,使用的bun版本1.2.16。
现有发现的问题如下:
- crypto支持的曲线类型和算法确实
中间比较重要的,包括SECP256K1,Chacha20-Poly1305,是确认不支持的。在标准nodejs环境中,没有这个问题。
- ASN密钥恢复
无法使用简单方式,从ECC私钥信息中,恢复ECC密钥对象,必须补足公钥的部分。而在amd64平台上,没有这个问题。
- env
.env文件的配置和使用,在这个平台上,是有问题的,无法自动正确识别和加载。
- bun shell命令兼容性
内置的bun shell,不支持ls -l这种简单的命令。
小结
本文作为bun技术评估系列文章的开篇,简单的介绍了何为bun,以及它的一些核心的功能特性。并加入了很多笔者在应用评估过程中的观点和思考。