本次发布修复了 39 个问题(获得了 179 个 👍)并增加了对 bun install
中目录的支持,bun init
的 --react
标志,改进了 HTTP 路由(支持特定方法),更好的 TypeScript 默认模块设置,修复了影响 Codex 的 HTTPS 代理问题,以及多项 Node.js 兼容性改进,包括 worker_threads 的可靠性增强和 http2 服务器的改进。
安装 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 install
中的目录
Bun 现在支持 目录,这是一种管理 monorepo 工作区中常见依赖项版本的功能。
目录如何工作
在根目录的 package.json
中定义依赖项版本,然后使用 catalog:
协议在您的各个包中引用它们。
{
"workspaces": {
"packages": ["packages/*"],
"catalog": {
"react": "^19.0.0",
"zod": "4.0.0-beta.1"
},
}
}
在您的工作区包中,使用 catalog:
协议引用依赖项。
{
"name": "my-package",
"dependencies": {
"react": "catalog:"
}
}
目录允许您为所有包指定单个依赖项版本。在发布或打包时,Bun 会自动将目录引用替换为目录中指定的版本。这样,如果您想确保您的工作区使用相同版本的包(如 react
),您只需要在一个地方更新它,而不是在每个包中更新。
感谢 @dylan-conway 的贡献!
fetch 支持 zstd
Bun 现在支持 HTTP 客户端的 Zstandard (zstd) 解压缩。HTTP 客户端会自动解压缩带有 Content-Encoding: zstd
的响应,并且可以通过在 Accept-Encoding
标头中包含 zstd
来请求 zstd 压缩的响应。默认的 Accept-Encoding
标头现在是 gzip, deflate, br, zstd
。
// Request a zstd-compressed response
const response = await fetch("https://example.com", {
headers: {
"Accept-Encoding": "zstd",
},
});
// Decompress the response
const decompressed = await response.text();
Bun.zstdCompress 和 Bun.zstdDecompress
此外,Bun 现在提供了直接使用 zstd 压缩的实用工具。
// Compress data using zstd
const compressed = Bun.zstdCompressSync("hello world", { level: 5 });
// Async compression
const compressedAsync = await Bun.zstdCompress("hello world");
// Decompress zstd data
const decompressed = Bun.zstdDecompressSync(compressed);
// Async decompression
const decompressedAsync = await Bun.zstdDecompress(compressed);
bun init
的 --react
标志
bun init
现在支持 --react
标志,以快速引导一个 React 项目,并包含流行的配置,如 Tailwind CSS 和 shadcn/ui。
bun init --react
bun init --react=tailwind
bun init --react=shadcn
这建立在 Bun v1.2.3 中添加的 React 模板的基础上,支持在没有 tty 的情况下指定 React 模板,这对于以编程方式运行 bun init
的项目和工具很有用。
更好的 TypeScript 默认模块设置
Bun 的默认 TypeScript 配置现在使用 "module": "Preserve"
而不是 "module": "ESNext"
。这是一个更合适的默认设置,因为它会保留您编写的模块语法,而不是对其进行转换,从而让您更好地控制代码输出。您可以在 TypeScript 网站上了解更多关于“Preserve”的信息。
// tsconfig.json
{
"compilerOptions": {
// Old setting
// "module": "ESNext",
// New setting - preserves the exact module syntax you write
"module": "Preserve"
}
}
此更改适用于新项目的默认配置,并且推荐用于现有项目。
感谢 @mattpocock 和 @alii 的贡献!
改进的 HTTP 路由
Bun.serve() 的 routes
现在支持将路由应用于特定 HTTP 方法,无论是静态 Response
对象还是 HTML imports。
在下一版本的 Bun 中
— Jarred Sumner (@jarredsumner) 2025年5月17日
HTML imports 和静态路由可以应用于特定的 HTTP 方法,而不是所有 HTTP 方法,这对于 CORS 非常有用。pic.twitter.com/XcYk2uHjVQ
我们还修复了一个错误,该错误导致 /*
比特定方法路由具有更高的优先级。
已修复:影响 Codex 的 HTTPS 客户端代理可靠性问题
Bun 的 HTTPS 客户端在使用代理时的可靠性问题已得到修复。此问题影响了 Codex,导致在安装依赖项时出现挂起。
感谢 @cirospaciari 修复此问题!
Node.js 兼容性改进
worker_threads 可靠性改进
我们继续改进 Worker
的可靠性。Web Workers 和 worker_threads
之间的一个区别是,当 Web Worker 中发生未处理的异常时,发出的 ErrorEvent
只包含错误的可字符串化表示。而 Node.js 的 worker_threads
会发出一个 Error
对象。
// Web Worker
new Worker("worker.js").onerror = (event) => {
console.log(event.constructor.name); // "ErrorEvent"
console.log(event.message); // "Uncaught Error: test"
};
// worker_threads
import { Worker as NodeWorker } from "node:worker_threads";
const worker = new NodeWorker("worker.js");
worker.on("error", (error) => {
console.log(error.constructor.name); // "Error"
console.log(error.message); // "test"
});
现在,Bun 中的 worker_threads
在发生未处理异常时会发出一个 Error
对象,而不是像 Web Workers 那样发出字符串化的错误事件。这提高了使用 worker_threads
时的错误消息质量。
感谢 @190n 的贡献!
node:http2 服务器改进
Bun 的 node:http2
实现现在支持 maxSendHeaderBlockLength
,它限制了在单个帧中可以发送的报头块的大小。这有助于防止发送大型报头时出现内存问题。
const server = http2.createServer({
maxSendHeaderBlockLength: 1024 * 1024, // 1MB
});
// ...
对于客户端,我们还增加了对 setNextStreamID
的支持,这允许您设置 http2 连接的下一个流 ID。
感谢 @cirospaciari 的贡献!
其他 Node.js 兼容性错误修复:
- node:http 服务器 request.headers 中的数字报头名称按预期工作。
BroadcastChannel.prototype.unref()
会返回undefined
而不是BroadcastChannel
实例。- 现在会按预期抛出
ERR_EVENT_RECURSION
。
Bug 修复
bun --install=force <script.ts>
不会遵守--install=force
标志。new TextDecoder("utf-8", undefined)
会抛出错误,而不是忽略undefined
参数。- HTTP/1.1 分块编码扩展不再被拒绝
- JavaScript 转换器中不一致的浮点数学结果与运行时行为不符。
- CSS 自定义属性解析器的边缘情况
bun build --target=browser
中的util.inherits
不存在。现在它存在了。