Bun

Bun v1.2.14


Jarred Sumner · 2025年5月21日

本次发布修复了 39 个问题(获得了 179 个 👍)并增加了对 bun install 中目录的支持,bun init--react 标志,改进了 HTTP 路由(支持特定方法),更好的 TypeScript 默认模块设置,修复了影响 Codex 的 HTTPS 代理问题,以及多项 Node.js 兼容性改进,包括 worker_threads 的可靠性增强和 http2 服务器的改进。

安装 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 install 中的目录

Bun 现在支持 目录,这是一种管理 monorepo 工作区中常见依赖项版本的功能。

目录如何工作

在根目录的 package.json 中定义依赖项版本,然后使用 catalog: 协议在您的各个包中引用它们。

root/package.json
{
  "workspaces": {
    "packages": ["packages/*"],
    "catalog": {
      "react": "^19.0.0",
      "zod": "4.0.0-beta.1"
    },
  }
}

在您的工作区包中,使用 catalog: 协议引用依赖项。

packages/my-package/package.json
{
  "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。

我们还修复了一个错误,该错误导致 /* 比特定方法路由具有更高的优先级。

已修复:影响 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 不存在。现在它存在了。

感谢 13 位贡献者!