目前 JavaScript 圈,有三大运行时,分别是Node,Bun,Deno。
Bun 在 1.0 版本之前就关注了,但由于没有正式发布 Windwos 可用版本,所以只能在一边看着 Linux 和 MacOS 用户吃肉了。
说实话,没有了解到 Bun 之前,我觉得 Node 真香,至少比我以前写 PHP 香多了。
但 Bun 的横空出世,让我深深着迷,我喜欢这种 ALL IN ONE 的架构。

直到 2024年4月1日,Bun v1.1发布,正式支持 Windows,我才迫不及待地上手体验。
这次发布,很多人期待已久,网上的讨论早已铺天盖地,并戏称这个里程碑为 Bundows。
不过,从Bun v1.1到Bun v1.2之前,我尝试了多次,在使用过程中,均出现了不同的报错,崩溃。
直到Bun v1.2发布迭代了几个版本后,报错崩溃的现象才明显减少。
由于Bun的发版更新很快,所以没多久时间,我就全面使用 Bun,本地和服务器都不再安装 Nodejs,也没有再用过 npm 和 pnpm。

目前 Bun v1.4马上就要发布了,更是会带来了一个全新的内置功能 Bun.image,不需要依赖 sharp,就能处理图片的旋转,缩放等,具体可以查看我昨天的文章 bun将会支持Bun.image,你怎么看。
就我目前使用情况来看,我分享几个我认为非常方便实用的功能。
Bun.sql
js
import { sql, SQL } from "bun";
// PostgreSQL
const users = await sql`
SELECT * FROM users
WHERE active = ${true}
LIMIT ${10}
`;
// With MySQL
const mysql = new SQL("mysql://user:pass@localhost:3306/mydb");
const mysqlResults = await mysql`
SELECT * FROM users
WHERE active = ${true}
`;
// With SQLite
const sqlite = new SQL("sqlite://myapp.db");
const sqliteResults = await sqlite`
SELECT * FROM users
WHERE active = ${1}
`;
Bun内置了对PostgreSQL、Mysql、Sqlite的支持,无需安装第三方依赖,就能连接并操作数据库。
Bun.redis
js
import { redis } from "bun";
// 设置键值
await redis.set("greeting", "Hello from Bun!");
// 查询键值
const greeting = await redis.get("greeting");
console.log(greeting); // "Hello from Bun!"
// 自增
await redis.set("counter", 0);
await redis.incr("counter");
// 检查是否存在
const exists = await redis.exists("greeting");
// 删除键
await redis.del("greeting");
Redis已经成为了事实上的缓存基础架构,Bun也内置了对Redis的支持,无需安装任何依赖,直接操作Redis。
Http Routing
js
Bun.serve({
routes: {
"/": () => new Response("Home"),
"/api": () => Response.json({ success: true }),
"/users": async () => Response.json({ users: [] }),
},
fetch() {
return new Response("Unmatched route");
},
});
这是 Bun Http 服务的一个功能,与 Node 的 Http 功能不同的是,Bun Http 提供了 routes 路由功能,我们不需要手动实现,也不需要安装第三方依赖,就能实现 接口路由服务,非常适合用来做轻量级的 接口框架,我目前的项目就是基于这个实现的,没有用到任何的expressjs、koa、fastify、hono等web框架。
Bun.Cron
js
Bun.cron("0 * * * *", async () => {
await cleanupTempFiles();
});
Bun 内置了 定时器 功能,非常方便用来做一些定时处理工作。
Bun.Image
js
await Bun.file("photo.jpg")
.image()
.resize(400, 400, { fit: "inside" })
.webp({ quality: 80 })
.write("thumb.webp");
这个即将发布的图片处理功能,我也非常期待,不管是图片处理还是打包,编译,生成二级制,都方便不少。
如果引入第三方 sharp 包,兼容性方面要比内置的差很多。
pm2线上部署
有一个问题,用 Bun 的时候,不可避免地会遇到,那就是Bun项目的部署问题。
我既然决定All in Bun,就不可能在任何环境允许不纯净的 Node 因素存在。
刚开始部署Bun项目的时候,有2个问题困扰着我。
- 如何让 pm2 运行在 Bun 上面?
- 如何执行 pm2 命令时候,不再提示 Node 命令未找到?
为此,我查阅资料,测试了各种方案,耗时几天才真正搞定,其实解决方案很简单,但是中间的过程还是有不少曲折,这里把我的研究方案分享给大家。
JS
module.exports = {
apps: [
{
name: "befly",
script: "index.js",
interpreter: "bun",
// 集群模式配置
instances: 1, // 实例数量,可设置为 'max' 使用所有 CPU
exec_mode: "cluster", // 集群模式
// 自动重启配置
autorestart: true,
watch: false,
max_memory_restart: "500M", // 内存超过 500M 自动重启
// 日志配置
log_date_format: "YYYY-MM-DD HH:mm:ss",
merge_logs: true,
// 从 .env.production 动态加载的环境变量(使用 Bun API)
env: {
RUN_MODE: "production"
}
}
]
};
以上是 pm2 配置文件。
要注意 interpreter: "bun" 配置,表示用 bun 执行项目入口文件。
bash
bunx --bun pm2 start pm2.config.cjs
除此以外,以上是 package.json 文件中 scripts 的 pm2 运行脚本。
还要强制用 bunx --bun pm2 来跑 pm2 本身,如果没有这个脚本,就会默认用 Node 来跑 pm2。
bash
alias pm2='bunx --bun pm2'
除此以外,一个非常关键的配置,要给 pm2 设置别名,也强制用 bun 来运行 pm2 的命令。
这样,我们在控制台正常地执行 pm2 命令,也会强制使用 pm2 去运行,而不是用默认的 Node 来执行 pm2 的命令。
如此三步走,你就能完全脱离 Node,像我一样 All in Bun,体验到 Bun 的方便和强大了。
结尾
除此以外,还有很多诸如 Bun.cookie、Bun.color、Bun.markdown、Bun.toml、Bun.yaml等实用接口。
但我比较纳闷的是,Bun.xml 什么时候内置啊?我可不想再安装 fast-xml-parser 依赖了。
作为一个All in Bun 近2年的开发者,强烈推荐。
关于我
我是农村程序员,独立开发者,前端之虎陈随易。
- 个人网站 1️⃣:chensuiyi.me
- 个人网站 2️⃣:me.yicode.tech