Bun v1.3.12 发布:内置浏览器自动化、Markdown 终端渲染与多项核心性能优化

3 阅读6分钟

Bun 团队于 2026 年 4 月 9 日发布了 v1.3.12 版本。本次更新不仅引入了 原生浏览器自动化 API终端 Markdown 渲染 两大新特性,还在运行时稳定性、Node.js 兼容性及性能方面带来了大量实质性的改进。

以下是本次更新的关键亮点解读。

1. Bun.WebView:原生头端浏览器自动化

Bun v1.3.12 在运行时中直接内置了原生头端浏览器自动化能力,通过统一的 API 支持两种后端:

  • WebKit (macOS 默认):使用系统 WKWebView,零外部依赖。
  • Chrome (跨平台):通过 Chrome DevTools Protocol (CDP) 控制 Chrome/Chromium,可自动检测已安装的浏览器或指定路径。

所有输入事件均以操作系统级事件派发,网站无法区分 view.click() 与真实鼠标点击(isTrusted: true)。选择器方法会自动等待元素可操作性(挂载、可见、稳定、不被遮挡),风格类似 Playwright。

await using view = new Bun.WebView({ width: 800, height: 600 });
await view.navigate("https://bun.sh");

await view.click("a[href='/docs']");     // 等待可操作,原生点击
await view.scroll(0, 400);               // 原生滚轮事件,isTrusted: true
const title = await view.evaluate("document.title");
const png = await view.screenshot({ format: "jpeg", quality: 90 });
await Bun.write("page.jpg", png);

Bun.WebView 继承自 EventTarget,支持页面导航、截图、键盘输入、CDP 原始调用等丰富方法。值得一提的是,每个 Bun 进程共享一个浏览器子进程,后续创建 new Bun.WebView() 仅会在同一实例中打开新标签页。

2. 终端即文档:bun ./file.mdBun.markdown.ansi()

现在你可以直接在终端中渲染 Markdown 文件了。运行 bun ./file.md 时,Bun 会读取文件并将其输出为格式精美的 ANSI 文本,且没有 JavaScript VM 启动开销

此外,新增的 Bun.markdown.ansi() API 允许程序化地将 Markdown 转换为 ANSI 字符串,支持以下选项:

  • colors: false:纯文本模式,不含转义码。
  • hyperlinks: true:启用可点击的超链接。
  • columns: 60:自定义折行宽度。
  • kittyGraphics: true:通过 Kitty Graphics Protocol 内联显示图片(支持 Kitty、WezTerm、Ghostty)。

3. 进程内 Bun.cron() 调度器

此前 Bun 已支持注册操作系统级别的 Cron 任务(crontab/launchd/Task Scheduler)。v1.3.12 新增了进程内回调重载,适用于长期运行的服务器或容器,让调度任务能够直接共享应用状态(如数据库连接池、缓存等)。

// 每分钟执行一次,且不会重叠运行(等待上一次 Promise 完成)
Bun.cron("* * * * *", async () => {
  await doPeriodicWork(); 
});

// 使用 disposable 风格自动停止
{
  using job = Bun.cron("0 * * * *", () => console.log("每小时整点"));
}

关键行为:

  • UTC 时间0 9 * * * 表示 9:00 UTC,与系统时区无关。
  • 错误处理:同步抛错触发 uncaughtException,Promise 拒绝触发 unhandledRejection
  • --hot 安全:编辑模块后,所有进程内 cron 任务会自动清除并重载。
  • 生命周期控制:支持 .ref()(保持进程存活,默认)和 .unref()(允许进程自然退出)。

4. UDP Socket 增强:ICMP 错误与截断检测

Bun.udpSocket() 得到两项重要改进,更贴近 libuv/Node.js 行为:

  • ICMP 错误不再静默关闭 Socket:发送到不可达端口的 UDP 数据包会触发 error 回调(错误码如 ECONNREFUSED),但 Socket 保持打开状态,避免影响后续发送。
  • 可检测数据报截断:当接收的数据报大于接收缓冲区时,data 回调的第五个参数 flags 会包含 truncated: true,让你能识别被截断的负载。

5. Unix Domain Socket 生命周期匹配 Node.js

Bun 修正了两处与 Node.js/libuv 语义不一致的行为:

场景Node.js / libuvBun (之前)Bun (v1.3.12)
绑定时文件已存在EADDRINUSE静默 unlink 并继续绑定抛出 EADDRINUSE
close() 后 Socket 文件自动删除遗留磁盘文件自动清理

这意味着调用 Bun.listen({ unix: "/tmp/my.sock" }) 不会再意外窃取其他进程的活跃 Socket,并且监听器停止后会自动删除 .sock 文件,避免泄漏。

6. JavaScriptCore 引擎升级:显式资源管理 + 性能优化

Bun 的底层 JS 引擎(WebKit JavaScriptCore)同步了上游超过 1,650 个提交,带来多项语言特性与性能提升:

  • 显式资源管理:正式支持 usingawait using 声明,自动管理资源释放。
  • JIT 改进Array.isArray 变为 JIT 固有函数;String.prototype.includes 单字符快速路径;Promise 反应与微任务队列微优化。
  • WebAssembly:SIMD shuffle 优化、Memory64 边界检查修复、BBQ/OMG 编译器代码生成改进。
  • 内存分配器 (libpas):通过“scavenge 时重标记”提升内存安全性;大页面分配阈值从 64MB 降至 1MB。

7. 性能与兼容性强化

URLPattern 提速 2.3 倍

内部正则匹配直接调用编译后的正则引擎,避免为每个 URL 组件分配临时 JS 对象,单次调用最多减少 24 次 GC 分配。

SIMD 加速 ANSI 处理

Bun.stripANSIBun.stringWidth 等函数使用 SIMD 指令集(如一次处理 64 字节),在特定场景下性能提升可达 4 倍到 11 倍,相比 npm 上的 string-width 包快 4–822 倍。

Cgroup 感知的并行度

Bun 在 Linux 上现在会尊重 cgroup 的 CPU 限制(Docker/k8s 环境),而非直接读取物理核心数,大幅改善容器环境中的资源利用率。

HTTPS 代理连接复用

通过代理发送多个 HTTPS 请求时,Bun 会复用同一个 CONNECT 隧道和内部 TLS 会话,避免每次请求都重新握手,显著降低延迟。

TCP_DEFER_ACCEPT(Linux)

Bun.serve() 在 Linux 上设置 TCP_DEFER_ACCEPT(FreeBSD 使用 SO_ACCEPTFILTER "dataready"),将新连接的两次事件循环唤醒(accept + 可读)合并为一次,对短连接场景尤其有利。

8. 大量 Bug 修复

本次更新修复了超过 40 个问题,重点包括:

  • Node.js 兼容性:修复了 process.env 在特定权限目录下变空、vm.Script 内存泄漏、fetch 响应体 pipeline 死锁、dns 模块缺失导出、fs.stat 高 inode 截断、Error.captureStackTrace 异步栈帧丢失等问题。
  • Bun 自有 API:修复了运行时修改 HTTP_PROXY 无效、事件循环单次最多处理 1024 个 I/O 事件导致高并发延迟、Bun.serve 在并发 async handler 下性能骤降、ARM64 架构线程池挂起、Bun.SQL MySQL 适配器内存泄漏、长 Unix Socket 路径失败等。
  • Web API:修复了关闭的 MessagePort 内存无限增长、AbortController.signal.reason GC 后变 undefinedBroadcastChannel 竞态条件、String.raw 破坏空字节、Response 体重复消费崩溃等。
  • 工具链:修复了 bun build --compile 在 NixOS 上生成不可移植二进制、Windows 上 tar 绝对路径穿越、bun test --elide-lines 在非 TTY 环境下错误退出等问题。

升级与总结

你可以通过以下命令立即升级到 Bun v1.3.12:

bun upgrade

本次更新展现了 Bun 作为一个全能型 JavaScript 运行时的野心:不仅在前端工具链(打包、测试、包管理)上持续深耕,更开始涉足浏览器自动化、系统调度、高级网络协议等传统上需要多语言配合的领域。同时,对 Node.js 兼容性的执着修复和底层引擎的激进优化,使得 Bun 在生产环境中的可靠性又迈上了一个台阶。

对于追求高性能、低依赖、现代化 API 的开发者而言,Bun v1.3.12 绝对值得一试。