跳转到内容

真的能取代 Node.js 吗?Bun 多方位性能“实测”

Bun 是一个集多功能于一体的开发工具包,专门用于开发现代的 JavaScript 和 TypeScript 应用程序。

Bun

看了官网的介绍,发现 Bun 还是有些东西的。它主要分了 4 大功能:

  • 运行时bun run index.ts,对标 Node.js;
  • 包管理bun install,对标 npm、pnpm、yarn 等;
  • 打包工具bun build,对标 vite、esbuild、Webpack 等;
  • 测试运行工具bun test,对标 Jest、Vitest。

是不是很屌?大有一统前端之势。

不仅囊括了这些功能,而且还号称速度比它们更快!

官方文档上到处都能看到与其他工具比拼速度的文案,下面我就用官网上的案例来一一实测,看看是否真如文档所“吹”。

1️⃣ 打包实测

👉 打包 10000 个 React 组件

这是在官网首页的一张截图:

打包10000个React组件

点击底部的View benchmark找到测试源码,并clone到本地。

然后按照文档说明运行命令:

bash
node bench.mjs

实测结果如下:

实测结果

耗时参考性不大,毕竟不同设备的性能都不一样,没法比较,但是相对速度还是可以比较一下的。

为了看起来更加直观,我将实测结果绘制成了一张图表:

耗时对比

很明显,Bun 排第一;esbuild、rolldown、vite 排在第二梯度;rspack、rsbuild 排第三梯度。

rolldown 与 Vite 是一家,它是为了取代早期 Vite 中的 esbuild 和 rollup 两个依赖。

rspack 和 rsbuild 也是一家,直接对标的就是 webpack。

这些都是新兴起的打包工具,速度都远比传统打包工具快,如:webpack、rollup 等。我也试了一下,如果使用 rollup 打包的话耗时差不多要 80 多秒,速度已经不在一个级别了,所以就没有对比的必要。

2️⃣ 网络实测

👉 一个简单的 Express.js 服务

http 吞吐量

还是一样,找到源码,按照文档说明进行测试。

先使用 Bun 启动服务:

bash
bun express/index.mjs

文档上推荐使用oha工具进行测试:

bash
oha http://localhost:3000 -n 500000 -H "Accept-Encoding: identity"

最后结果如下:15634 req/sec

Bun 测试结果

同样的方法启动node express/index.mjs,然后进行测试,其结果如下:4835 req/sec

Nodejs 测试结果

我们可以计算得出:15634 / 4835 ≈ 3.2,与官方测试结果确实相差不大。

3️⃣ 包安装实测

官方宣称包安装速度是 npm 的25 倍

安装速度

我们随便找个项目验证一下,看是否“打脸”。

为了节省时间,我在package.json中只添加了 3 个依赖包。

json
"dependencies": {
  "express": "^5.1.0",
  "postgres": "^3.4.7",
  "@types/bun": "1.3.2"
}

使用官方推荐的测试工具hyperfine

bash
hyperfine "bun install --backend=hardlink" "npm install --no-scripts --ignore-scripts" --prepare="rm -rf node_modules" --cleanup="rm -rf node_modules" --warmup=8

最后实测结果如下:

实测结果 1

2.5 倍!与官方宣称相差甚远。

为了进一步确定,我加入了pnpm又重新跑了几遍,并且特地找了一个差距最大的结果:

实测结果 2

没有意外,相对npm install还是2.5 倍,是pnpm install1.6 倍

虽然实测下来“宣称的 25 倍”打脸了,但人家的速度确实更快,这没得反驳。

总结

个人感觉 Bun 确实是有些东西的,如果能够持续迭代下去,也许会成为前端的一匹黑马杀出重围。

据官方文档介绍,目前 Node.js 的兼容度已接近 100%,并且它的文档也非常完善,对各种技术栈的支持都很高。

如果是纯前端的新项目,也不妨一试!