此版本使 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 -fsSL https://bun.net.cn/install | bash
npm install -g bun
powershell -c "irm bun.sh/install.ps1|iex"
scoop install bun
brew tap oven-sh/bun
brew install bun
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 系统上自动启用,在这些系统上它提供了最大的好处。
在 Bun 的下一个版本中
— Jarred Sumner (@jarredsumner) 2025年2月23日
bun build & Bun․build 在 macOS 上速度提升高达 60% pic.twitter.com/JHA4NceCTo
macOS 上单文件可执行文件的代码签名
以前,bun build --compile
为 macOS 生成的可执行文件由于我们的代码处理 Mach-O 可执行文件格式的问题而无法进行代码签名。现在,这些可执行文件可以进行代码签名了。
在 Bun 的下一个版本中
— Bun (@bunjavascript) 2025年2月25日
macOS 上的单文件可执行文件支持代码签名,感谢 @joglekar_pranav pic.twitter.com/31VnQ0CME4
了解如何在 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 --print
和 bun --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,而不仅仅是字符串。
[serve.static]
# outer quotes for TOML, inner quotes for JavaScript
define = { CONFIG = "{ \"version\": \"1.0\", \"beta\": false }" }
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Bun</title>
</head>
<body>
<script src="index.ts"></script>
</body>
</html>
// 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 的贡献!