2年没用Nodejs了,Bun很香

目前 JavaScript 圈,有三大运行时,分别是NodeBun,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内置了对PostgreSQLMysqlSqlite的支持,无需安装第三方依赖,就能连接并操作数据库。

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 路由功能,我们不需要手动实现,也不需要安装第三方依赖,就能实现 接口路由服务,非常适合用来做轻量级的 接口框架,我目前的项目就是基于这个实现的,没有用到任何的expressjskoafastifyhono等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.cookieBun.colorBun.markdownBun.tomlBun.yaml等实用接口。

但我比较纳闷的是,Bun.xml 什么时候内置啊?我可不想再安装 fast-xml-parser 依赖了。

作为一个All in Bun 近2年的开发者,强烈推荐。

关于我

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

相关推荐
宁小法2 小时前
Linux批量删除文件
linux·服务器·批量·删除文件
Hooray2 小时前
用时7天,花费30元,我vibe coding这个网站
前端·agent·ai编程
小小高不懂写代码2 小时前
RAG--检索增强生成--原理及实战
前端·人工智能
空中海2 小时前
04 工程化、质量体系与 React 生态
前端·ubuntu·react.js
Yue1682 小时前
啥子都能看懂的TypeScript快速入门
typescript
05候补工程师2 小时前
深度解构 ROS 2:如何手动调通 Nav2 A* 路径规划引擎
linux·人工智能·经验分享·算法·机器人
好运的阿财3 小时前
OpenClaw工具拆解之host_workspace_write+host_workspace_edit
前端·javascript·人工智能·机器学习·ai编程·openclaw·openclaw工具
XiYang-DING3 小时前
JavaScript
开发语言·javascript·ecmascript
北冥湖畔的燕雀3 小时前
Linux线程编程核心指南
linux·服务器·网络