2年没用Nodejs了,Bun很香

目前 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个问题困扰着我。

  1. 如何让 pm2 运行在 Bun 上面?
  2. 如何执行 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年的开发者,强烈推荐。

关于我

我是农村程序员,独立开发者,前端之虎陈随易,技术群与交朋友请在个人网站 👇 联系我 ✌️

相关推荐
杨云龙UP19 分钟前
TDengine 3.4.2.8 Community 三节点三副本生产集群部署实战(DNode/MNode/taosAdapter/Explorer)
大数据·linux·运维·数据库·tdengine·时序库
行者-全栈开发1 小时前
【前端/JS框架】CVE-2026-3854:GitHub Enterprise Server X-Stat注入XSS漏洞深度剖析与紧急修复指南
前端·javascript·github
向成科技1 小时前
XC3576H工控主板|深度适配Ubuntu 26.04 LTS,释放边缘AI与工业开发新潜能
linux·人工智能·ubuntu·机器人·硬件·主板·边缘ai
Fcy6482 小时前
Linux下 进程间关系与守护进程
linux·运维·服务器·守护进程
计算机魔术师2 小时前
AMD砸82亿买下李飞飞,这次不卖芯片卖什么?
前端
码农小韩2 小时前
Linux驱动理论(二)——Linux字符设备驱动
linux·嵌入式软件开发·linux操作系统·linux应用开发·linux驱动理论
well06122 小时前
Linux粘滞位与Makefile机制深度解析
linux·运维·服务器
再写一行代码就下班2 小时前
linux sh脚本在windows修改导致无法使用解决方式
java·linux·centos
hzxpaipai2 小时前
杭州企业官网怎么建设?从策划到上线的5步建站方法
运维·服务器·前端·网络
怕浪猫3 小时前
2026年金九银十,我面了22个前端
前端·javascript·面试