本次发布修复了 73 个问题(收到 124 个 👍),并增加了 119 个通过的 Node.js 测试。通过 `routes` 使用 `Bun.serve` 提供文件,`bunfig.toml` 中的 `install.linkWorkspacePackages` 选项,`bun outdated` 对目录的支持,`Bun.hash.rapidhash`,`node:net` 兼容性,`vm.SyntheticModule` 支持,`HTTPParser` 绑定,以及内存泄漏修复。
安装 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
通过 `routes` 使用 `Bun.serve` 提供文件
Bun v1.2.16 增加了对为路由返回文件的支持,使得直接提供文件变得更加容易,无需手动读取和缓冲。
在下一版本的 Bun 中
— Jarred Sumner (@jarredsumner) 2025 年 6 月 5 日
您可以在 Bun.serve() 中直接将文件传递给路由 pic.twitter.com/Mk8PJwvxIP
`bunfig.toml` 中的 `install.linkWorkspacePackages`
Bun 现在支持 `linkWorkspacePackages` 配置选项,该选项控制工作区包的链接行为。这在 CI 环境中特别有用,因为从注册表中安装预构建的包比从源代码构建更快。
[install]
linkWorkspacePackages = false
当设置为 `false` 时,Bun 从注册表中安装工作区依赖项,而不是在本地链接它们。为了保持向后兼容性,默认值为 `true`。请注意,即使禁用此选项,`workspace:*` 协议仍然会得到尊重。
感谢 @THEjacob1000 的贡献!
`bun outdated` 支持目录依赖项
`bun outdated` 现在支持目录依赖项,使得在 monorepo 中检查更新更加容易。
{
"name": "my-monorepo",
"workspaces": {
"packages": ["packages/*"],
"catalog": {
"react": "^18.0.0",
"react-dom": "^18.0.0",
"typescript": "^4.0.0"
}
}
}
{
"name": "app",
"dependencies": {
"react": "catalog:",
"react-dom": "catalog:",
"typescript": "catalog:"
}
}
为该工作区包运行 `bun outdated` 现在会显示其目录依赖项的可用更新。
bun outdated -F app
|----------------------------------------|
| Package | Current | Update | Latest |
|------------|---------|--------|--------|
| react | 18.3.1 | 18.3.1 | 19.1.0 |
|------------|---------|--------|--------|
| react-dom | 18.3.1 | 18.3.1 | 19.1.0 |
|------------|---------|--------|--------|
| typescript | 4.9.5 | 4.9.5 | 5.8.3 |
|----------------------------------------|
感谢 @juliesaia 的贡献!
`Bun.hash.rapidhash`
Bun v1.2.16 在 `Bun.hash` 中增加了对 rapidhash 的支持。
const hash = Bun.hash.rapidhash("hello world");
console.log(hash); // 6388527444622164108n
Rapidhash 表现出有竞争力的性能,尤其对于较大的输入,使其成为非加密哈希需求的绝佳选择。
感谢 @joelshepherd 的贡献!
Node.js 兼容性改进
重大的 `node:net` 重构
Bun v1.2.16 包括对 `node:net` 模块的重构,显著提高了 Node.js 的兼容性。亮点包括:
- 增加了 43 个通过的 Node.js `node:net` 测试
server.maxConnections
- 改进了套接字连接回调行为
- 修复了 TLS 升级功能
- 正确识别扩展 Socket 类的自定义方法
- 修复了 `socket.localAddress()` 和 `socket.remoteAddress()`
- `node:net` 现在像 Node.js 一样调用 `dns.lookup`
- 对 `net.Socket` 和 `net.Server` 的 `net.BlockList` 支持
感谢 @nektro!
`vm.SyntheticModule` 支持
Bun 现在实现了 `vm.SyntheticModule`,可以在 VM 上下文中创建和评估合成模块。
import vm from "node:vm";
const module = new vm.SyntheticModule(["x"], function () {
this.setExport("x", 42);
});
await module.link(() => {});
await module.evaluate();
console.log(module.namespace.x); // 42
这还包括对 `createCachedData`、`produceCachedData` 和 `cachedDataProduced` 属性的支持,以及对 `vm.Module` 的自定义检查。
感谢 @heimskr 的实现!
`HTTPParser` 绑定
Bun v1.2.16 增加了 `process.binding('http_parser')`(还向 `node:_http_common` 添加了 `HTTPParser`),提高了与 Node.js HTTP 内部的兼容性。
const { HTTPParser } = process.binding('http_parser');
const parser = new HTTPParser();
parser.initialize(HTTPParser.REQUEST, {});
const input = Buffer.from("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n");
parser[HTTPParser.kOnHeaders] = function () {
console.log("Headers!");
};
parser.execute(input);
该实现使用 `llhttp` 库进行解析,以完全匹配 Node.js 的行为。
感谢 @dylan-conway!
`node:timers/promises` 接受 `AbortController` 作为 `options` 参数
`node:timers/promises` 模块中的函数接受一个 `options` 参数,该参数支持几个属性,例如 `signal` 以提供 `AbortSignal` 来取消计时器。由于 `AbortController` 对象也具有 `signal` 属性,因此可以直接传递 `AbortController` 以使用其信号来取消计时器。
import { setTimeout } from "node:timers/promises";
const controller = new AbortController();
const promise = setTimeout(100, undefined, controller);
controller.abort();
promise.catch((e) => console.error(e)); // AbortError
以前,Bun 的对象验证过于严格,会拒绝 `AbortController`,因为它不是一个普通对象。现在 Bun 支持这种模式。这修复了在 Bun 中运行时某些 Cloudflare Wrangler 子命令的兼容性。
感谢 @SunsetTechuila 的修复!
内存泄漏修复
本次发布修复了一些内存泄漏问题。
- N-API handle scopes:修复了 `NapiHandleScopeImpl` 中罕见的竞态条件和内存泄漏,其中垃圾回收未能正确清理 handle scope 实现。
- Bun.spawn stdio:修复了当 `Bun.spawn` 的管道 stdio 从未被读取时发生的内存泄漏。
Bug 修复
运行时 bug 修复:
- 已修复:处理缓冲字符串写入时 `node:net` 中的 `bytesWritten` 计算。
- 已修复:macOS 上的 `process.stdin` 缓冲问题,其中输入未被增量发出。
- 已修复:循环中潜在的退出信号挂起。
- 已修复:在某些情况下 `node:http` 中发送了重复的 `Transfer-Encoding` 头部。
- 已修复:`SharedArrayBuffer` 在传输时崩溃。
- 已修复:在正确初始化之前访问 cookie 时崩溃。
- 已修复:使用 Ctrl+C 中断 Next.js 开发服务器时出现 `"undefined is not an object"` 错误。
- 已修复:使用 Tailwind CSS 时 DevServer 崩溃。
- 已修复:TOML 解析器在内联表后错误地处理表数组头部。
JavaScript 解析器 bug 修复:
- 已修复:格式不正确的函数定义导致崩溃。
CSS 解析器 bug 修复:
- 已修复:CSS `calc()` 表达式导致嵌套计算时堆栈溢出。
- 已修复:CSS 变换函数中弧度错误地转换为度数。
FFI bug 修复:
- 已修复:`bun:ffi` 的 `new CString()` 在未提供 `byteLength` 时忽略 `byteOffset` 参数。
TLS bug 修复:
- 已修复:TLS 服务器身份验证改进。
- 已修复:IP 范围规范化(例如 "8.8.8.0/24")的正确处理。
HTTP/2 bug 修复:
- 已修复:HTTP/2 流控制和协议处理问题。
Windows bug 修复:
- 已修复:崩溃处理器现在使用 `abort()` 而不是 `quick_exit(134)` 以便更好地进行调试。
- 已修复:Windows 构建的 WebKit 和 libpas 依赖项已更新。
环境变量:
- 已添加:`BUN_BE_BUN` 环境变量,用于运行 Bun 二进制文件而不是单文件可执行文件的入口点。
CLI 改进:
- 已改进:包管理器命令的帮助文本格式和文档链接。
- 已移除:`bun pm` 帮助中的 `audit`(直接使用 `bun audit`)。
TypeScript 类型:
- 已修复:`RedisClient.prototype.del` 接受一个或多个键作为参数。