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年的开发者,强烈推荐。

关于我

我是农村程序员,独立开发者,前端之虎陈随易。

相关推荐
donecoding2 小时前
Corepack 完全解析:从懵到懂,包管理器自由了
前端·node.js·前端工程化
yqcoder2 小时前
端经典面试题:为什么 0.1 + 0.2 !== 0.3?
前端·css
ZC跨境爬虫2 小时前
跟着 MDN 学 HTML day_12:(HTML网页图片嵌入)
前端·javascript·css·ui·html
光影少年2 小时前
reeact虚拟DOM、Diff算法原理、key的作用与为什么不能用index
前端·react.js·掘金·金石计划
用户059540174462 小时前
大模型记忆存储踩坑实录:LangChain 的 ConversationBufferMemory 让我排查了 6 小时
前端·css
用户9416146933652 小时前
Python 实时监控 A 股行情并自动筛选强势股(REST + WebSocket 两种方案)
后端·数据分析
Java编程爱好者2 小时前
吃透 ForkJoinPool:工作窃取底层原理,一次性讲透
后端
是上好佳佳佳呀2 小时前
【前端(十二)】JavaScript 函数与对象笔记
前端·javascript·笔记
longxibo2 小时前
【Flowable 7.2 源码深度解析与实战】
java·后端·流程图