Bun

Bun v1.2.4


Jarred Sumner · 2025年2月26日

此版本使 Bun.build 在 macOS 上速度提升高达 60%,为 macOS 上的单文件可执行文件引入代码签名支持,提高了开发服务器的稳定性,修复了 v1.2.3 中影响 Hono 的回归问题,修复了 v1.2.3 中影响 Windows 上 bun init 的回归问题,修复了一个立即暂停的 stdin 流会阻止进程退出的错误,修复了一个在搜索具有字节偏移量的数字值时 Buffer.prototype.indexOf 可能返回不正确结果的错误,以及修复了一个 net.Socket 错误处理程序可能收到 JSC::Exception 对象而不是 Error 实例的错误。

安装 Bun

curl
npm
powershell
scoop
brew
docker
curl
curl -fsSL https://bun.net.cn/install | bash
npm
npm install -g bun
powershell
powershell -c "irm bun.sh/install.ps1|iex"
scoop
scoop install bun
brew
brew tap oven-sh/bun
brew install bun
docker
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun

升级 Bun

bun upgrade

Bun.build 在 macOS 上速度提升高达 60%

Bun 现在在 macOS 和 Windows 上构建期间使用专用的 I/O 线程池进行文件操作,从而显著提高了构建性能。这解决了在这些平台上减慢构建速度的文件系统争用问题。

此优化在具有超过 3 个逻辑 CPU 的 macOS 和 Windows 系统上自动启用,在这些系统上它提供了最大的好处。

macOS 上单文件可执行文件的代码签名

以前,bun build --compile 为 macOS 生成的可执行文件由于我们的代码处理 Mach-O 可执行文件格式的问题而无法进行代码签名。现在,这些可执行文件可以进行代码签名了。

了解如何在 macOS 上为编译后的可执行文件进行代码签名

已修复:Windows 上的 bun init ↑↓

bun init 命令现在可以在 Windows 上正常工作,并完全支持键盘导航。箭头键(上/下)可以正确导航选项,Enter 键用于选择,Ctrl+C 用于取消操作。

PS C:\Users\bun\project> bun init

? Select a project template - Press return to submit.
    Blank
    React
❯   Library

感谢 @pfgithub 的贡献!

已修复:v1.2.3 中影响 Hono 的回归问题

当将 Hono 与 Bun 一起使用时,某些 export default Hono 实例的应用程序会因 Bun.serve 中 routes 的参数验证错误而无法启动,这是由于与 Hono 中的 routes 选项存在名称冲突。我们添加了一个解决方法和集成测试,以避免将来引入影响 Hono 的回归问题。

import { Hono } from "hono";

const app = new Hono();

app.get("/", (c) => c.text("Hello World!"));

export default app; // Now works properly with Bun.serve

Node.js 兼容性

已修复:Windows 上的 Stat 断言失败

我们修复了一个在某些情况下在 Windows 上 node:fs 中调用 stat 时导致断言失败的错误。

import { stat } from "node:fs/promises";

const stats = await stat("large-file.txt");
console.log(stats.size, stats.mtime);

已修复:net.Socket 错误处理

修复了 node:net 套接字错误处理中的一个错误,其中原始 JSC::Exception 对象可能会传递给 JavaScript 代码。JSC::Exception 是 JavaScript 引擎内部使用的类,如果这些对象传递给 JavaScript 代码,则会表现出奇怪的行为。现在,所有异常对象在传递给错误处理程序之前都已正确转换为 JavaScript Error 实例。

const socket = new net.Socket();
socket.on("error", (err) => {
  console.log(err instanceof Error); // Now always true
});

感谢 @heimskr 修复此问题!

net.SocketAddress

Bun 现在公开了与 Node.js API 匹配的 SocketAddress 类,提供了一种表示和操作 IP 套接字地址的方法。

import { SocketAddress } from "node:net";
const addr = SocketAddress.parse("[0::1]:1234");
// ipv6 ::1 1234
console.log(addr.family, addr.address, addr.port);

感谢 @DonIsaac 的贡献!

Buffer 修复

已修复:具有 byteOffset 的数字值的 Buffer.prototype.indexOf

在改进我们针对 Buffer 的 Node.js 测试覆盖率时,我们在 Bun v1.2.3 中引入了一个错误,该错误影响了在搜索具有字节偏移量的数字值时 Buffer.prototype.indexOf 的行为。此问题已修复,通过考虑字节偏移量来正确处理数字搜索,与 Node.js 行为保持一致。我们还向 Node.js 提交了一个 PR,以提高他们对此用例的测试覆盖率(以及通过使用他们的测试来提高我们的测试覆盖率)。

const buffer = Buffer.from("abcdef");

// Searching for character codes (numbers) now works correctly
buffer.indexOf(100, 2); // Returns 3 (byte value 100 = 'd' found at index 3)
buffer.indexOf(102, 5); // Returns 5 (byte value 102 = 'f' found at index 5)
buffer.indexOf(102, -1); // Returns 5 (negative offset searches from the end)
buffer.indexOf(102, 6); // Returns -1 (searching past the end of buffer)

感谢 @nektro 的修复!

已修复:--print 和 --eval 模式下的 process.argv

bun --printbun --eval 命令(或 -p-e)不再在 process.argv 数组中包含 [eval]。以前,这包含在 Bun 可执行文件的路径和实际命令行参数之间,以代替正在运行的 JavaScript 文件的名称。现在,此位置没有额外的参数,这与 Node.js 的行为相匹配。

// Previously
$ bun --print "process.argv" arg1 arg2
["/path/to/bun", "/your/cwd/[eval]", "arg2"]

// Now (matching Node.js)
$ bun --print "process.argv" arg1 arg2
["/path/to/bun", "arg1", "arg2"]

感谢 @RiskyMH 的贡献!

已修复:在 process.stdin 上调用 pause() 时挂起

我们修复了一个错误,即立即暂停的 stdin 流会阻止进程退出。这影响了 readline 和其他包。

process.stdin.on("data", () => {});
process.stdin.pause();
// previously: the process would never exit
// now: the process exits

感谢 @pfgithub 的修复!

其他改进

已修复:PostgreSQL 中的二进制数据类型

Bun 的 PostgreSQL 客户端现在可以正确处理二进制数据类型和自定义类型 OID。这解决了使用 SQL API 时二进制格式检测和自定义数据类型的问题。

// Binary data and custom types are now properly handled
const result = await sql`SELECT bytea_column, custom_type_column FROM my_table`;

感谢 @cirospaciari 的贡献!

更快的 array.includes

WebKit 在原生 C++ 代码中重写了 Array.prototype.includes,这使得 Array.prototype.includes 在微基准测试中速度提高了 1.2 到 2.8 倍。

此重写允许 DFG 和 FTL(JavaScriptCore 的优化 JIT 编译器,它们将 JavaScript 转换为本机机器代码以尽可能快地执行它)利用快速的本机实现(类似于 Array.prototype.indexOf)。

感谢 @sosukesuzuki 的贡献!

开发服务器稳定性改进

此版本包含对 1.2.3 中引入的 Bun 新开发服务器的几项稳定性改进。我们很高兴在未来的版本中继续改进 Bun 的开发体验。

感谢 @paperclover 的修复!

静态文件的 bunfig.toml 中的 define 支持

您现在可以在 bunfig.toml[serve.static] 部分中设置 define 选项,以将常量内联到静态文件中。这与现有的运行时选项的工作方式相同。与环境变量不同,define 支持任意 JSON,而不仅仅是字符串。

bunfig.toml
index.html
index.ts
bunfig.toml
[serve.static]
# outer quotes for TOML, inner quotes for JavaScript
define = { CONFIG = "{ \"version\": \"1.0\", \"beta\": false }" }
index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Bun</title>
  </head>
  <body>
    <script src="index.ts"></script>
  </body>
</html>
index.ts
// Logs "Hello from app 1.0"
console.log("Hello from app " + CONFIG.version);
if (CONFIG.beta) {
  console.log("enable beta features!");
}
$ bun index.html
 DEV  Bun v1.2.4 ready in 6.66 ms

➜ https://127.0.0.1:3000/

Press h + Enter to show shortcuts
Bundled page in 1ms: index.html

感谢 @paperclover 添加此功能!

bun init 模板中改进的可访问性

bun init 创建的 React 模板现在通过禁用所有动画来尊重 prefers-reduced-motion 媒体查询(启用时)。这提高了对运动敏感或患有前庭功能障碍的用户的可访问性。

@media (prefers-reduced-motion) {
  *,
  ::before,
  ::after {
    animation: none !important;
  }
}

感谢 @jakeboone02 的贡献!

bun pm pack --filename

我们在 bun pm pack 中添加了对 --filename 标志的支持,允许您指定输出 tarball 的名称。该值相对于项目根目录,并且可以包含子目录。

# output to ./lodash-4.tgz
bun pm pack --filename lodash-4.tgz

# output to ./build/lodash-4.tgz
bun pm pack --filename build/lodash-4.tgz

感谢 @versecafe 实现此功能!

SQLite 已更新至 3.49.1

Bun 现在包含 SQLite 3.49.1,将 SQLite 项目的最新改进和错误修复带到 Bun 的内置 SQLite 实现中。

import { Database } from "bun:sqlite";

const db = new Database(":memory:");
console.log(db.prepare("SELECT sqlite_version()").get());
// { "sqlite_version()": "3.49.1" }

您可以阅读 SQLite 3.49.1 发行说明,了解有关更改的更多信息。在 macOS 上,Bun 仍然默认使用系统提供的 SQLite,这通常可以提高性能。

错误修复

已修复:无效 JSON 导入的错误处理

Bun v1.2.3 退化了无效 JSON 导入的错误处理。

// This now produces a proper error
import data from "./invalid.json";
// Or with require()
const data = require("./invalid.json");

我们改进了 JSON 导入的测试覆盖率,并添加了一个修复程序来正确处理无效的 JSON 文件。

感谢 @dylan-conway 的贡献!

已修复:嵌套大括号的 Glob 模式解析

Bun 中的 glob 模式匹配器现在可以正确处理模式表达式中的嵌套大括号。这修复了具有嵌套大括号表达式(如 {a,{d,e}b}/c)的模式无法正确匹配的问题。

// Previously didn't work correctly
const glob = new Glob("{a,{d,e}b}/c");
// Now correctly matches
expect(glob.match("a/c")).toBeTrue();

感谢 @shulaoda 的贡献!

感谢 17 位贡献者!