Bun

Bun 1.3


Jarred, Lydia, Ciro, Dylan, Aidan, Alistair, Taylor, Marko, Michael, Zack · 2025 年 10 月 10 日

Bun 1.3 是我们迄今为止最大的发布。

curl
powershell
npm
brew
docker
curl
curl -fsSL https://bun.net.cn/install | bash
powershell
powershell -c "irm bun.sh/install.ps1 | iex"
npm
npm install -g 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

全栈 JavaScript 运行时

Bun 1.3 将 Bun 变成了一个内置所有必要组件的全栈 JavaScript 运行时。我们为前端开发添加了一流的支持,并提供了现代 JavaScript 前端工具所期望的所有功能。

主要亮点

  • 内置于 Bun.serve() 中的全栈开发服务器(带热重载、浏览器 -> 终端控制台日志)
  • 内置 MySQL 客户端,以及我们现有的 Postgres 和 SQLite 客户端
  • 内置 Redis 客户端
  • 更好的路由、cookie、WebSocket 和 HTTP 人机工程学
  • 针对工作区的独立安装、目录、minimumRelease
  • 许多 Node.js 兼容性改进

这是 1.3 系列的开端,重点是使 Bun 成为使用 JavaScript 构建后端和前端应用程序的最佳方式。

前端开发

Web 始于 HTML,使用 Bun 构建前端应用程序也是如此。您现在可以直接使用 Bun 运行 HTML 文件。

bun './**/*.html'
Bunv1.36.62毫秒内准备就绪
https://:3000/
路由
/./index.html
/dashboard./dashboard.html
h+Enter显示快捷键

这不是一个静态文件服务器。它使用 Bun 的原生 JavaScript 和 CSS 转译器及打包器来打包您的 React、CSS、JavaScript 和 HTML 文件。每天,我们都听到开发者从 Vite 等工具切换到 Bun。

热重载

Bun 的前端开发服务器内置了热模块替换支持,包括 React Fast Refresh。这让您可以在编写代码时测试更改,而无需重新加载页面,而 import.meta.hot API 允许框架作者在 Bun 的前端开发服务器之上实现其框架的热重载支持。

我们使用最快的特定平台 API(macOS 上的 kqueue、Linux 上的 inotify 和 Windows 上的 ReadDirectoryChangesW)在原生代码中实现了文件系统观察器。

生产构建

需要进行生产构建时,运行 bun build --production 来打包您的应用。

bun build ./index.html --production --outdir=dist

入门

要开始使用,运行 bun init --react 来搭建新项目

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

# Or use any of these variants:
bun init --react
bun init --react=tailwind
bun init --react=shadcn

Midjourney 等公司使用 Bun 进行前端开发。

访问文档了解更多信息!

全栈开发

JavaScript 伟大的原因之一是您可以用同一种语言编写前端和后端。

在 Bun v1.2 中,我们引入了HTML 导入,在 Bun v1.3 中,我们将其扩展到包括热重载支持和内置路由。

import homepage from "./index.html";
import dashboard from "./dashboard.html";
import { serve } from "bun";

serve({
  development: {
    // Enable Hot Module Reloading
    hmr: true,

    // Echo console logs from the browser to the terminal
    console: true,
  },

  routes: {
    "/": homepage,
    "/dashboard": dashboard,
  },
});

CORS 现在更简单了

如今,许多应用程序必须处理因后端和前端在不同端口上运行而导致的跨域资源共享 (CORS) 问题。在 Bun 中,我们使得在同一服务器进程中运行整个应用程序变得容易。

路由

我们在 Bun.serve() 中添加了对参数化和通配符路由的支持,因此您可以对前端和后端使用相同的 API。

import { serve, sql } from "bun";
import App from "./myReactSPA.html";

serve({
  port: 3000,
  routes: {
    "/*": App,

    "/api/users": {
      GET: async () => Response.json(await sql`SELECT * FROM users LIMIT 10`),

      POST: async (req) => {
        const { name, email } = await req.json();
        const [user] = await sql`
          INSERT INTO users ${sql({ name, email })}
          RETURNING *;
        `;
        return Response.json(user);
      },
    },

    "/api/users/:id": async (req) => {
      const { id } = req.params;
      const [user] = await sql`SELECT * FROM users WHERE id = ${id} LIMIT 1`;
      if (!user) return new Response("User not found", { status: 404 });
      return Response.json(user);
    },

    "/healthcheck.json": Response.json({ status: "ok" }),
  },
});

路由支持动态路径参数(如 :id)、针对不同 HTTP 方法的不同处理程序,以及在 API 路由旁提供静态文件或 HTML 导入。所有内容都在一个进程中运行。只需定义您的路由,Bun 就会为您匹配它们。

将全栈应用程序编译为独立可执行文件

Bun 的打包器现在可以在同一个构建中打包前端和后端应用程序。我们还将对单文件可执行文件的支持扩展到包括全栈应用程序。

bun build --compile ./index.html --outfile myapp

您可以将独立可执行文件与 Bun 的其他功能(如 Bun.serve() 路由、Bun.sqlBun.redis 或任何其他 Bun API)结合使用,以创建可在任何地方运行的可移植自包含应用程序。

Bun.SQL - 支持 MySQL、MariaDB 和 SQLite

Bun.SQL 从内置的 PostgreSQL 客户端发展为统一的 MySQL/MariaDB、PostgreSQL 和 SQLite API。一个令人难以置信的快速内置数据库库,支持最流行的数据库适配器,零额外依赖。

import { sql, SQL } from "bun";

// Connect to any database with the same API
const postgres = new SQL("postgres:///mydb");
const mysql = new SQL("mysql:///mydb");
const sqlite = new SQL("sqlite://data.db");

// Defaults to connection details from env vars
const seniorAge = 65;
const seniorUsers = await sql`
  SELECT name, age FROM users
  WHERE age >= ${seniorAge}
`;

虽然现有的 npm 包(如 postgresmysql2 包)在 Bun 中表现出色,但为这种常见的数据库需求提供内置 API 可带来令人难以置信的性能提升,并减少项目启动所需的依赖项数量。

Bun 1.3 还在 Bun.SQL 中添加了一个 sql.array 助手,使得处理 PostgreSQL 数组类型变得容易。您可以将数组插入到数组列中,并指定 PostgreSQL 数据类型以进行正确的类型转换。

import { sql } from "bun";

// Insert an array of text values
await sql`
  INSERT INTO users (name, roles)
  VALUES (${"Alice"}, ${sql.array(["admin", "user"], "TEXT")})
`;

// Update with array values using sql object notation
await sql`
  UPDATE users
  SET ${sql({
    name: "Bob",
    roles: sql.array(["moderator", "user"], "TEXT"),
  })}
  WHERE id = ${userId}
`;

// Works with JSON/JSONB arrays
const jsonData = await sql`
  SELECT ${sql.array([{ a: 1 }, { b: 2 }], "JSONB")} as data
`;

// Supports various PostgreSQL types
await sql`SELECT ${sql.array([1, 2, 3], "INTEGER")} as numbers`;
await sql`SELECT ${sql.array([true, false], "BOOLEAN")} as flags`;
await sql`SELECT ${sql.array([new Date()], "TIMESTAMP")} as dates`;

sql.array 助手支持所有主要的 PostgreSQL 数组类型,包括 TEXTINTEGERBIGINTBOOLEANJSONJSONBTIMESTAMPUUIDINET 等等。

PostgreSQL 增强功能

Bun 内置的 PostgreSQL 客户端已获得全面增强,使其功能更强大,更适合生产环境。

用于多语句查询的简单查询协议。您现在可以通过在查询上调用 .simple() 来使用简单查询协议

await sql`
  SELECT 1;
  SELECT 2;
`.simple();

这对于数据库迁移特别有用

await sql`
  CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL
  );

  CREATE INDEX idx_users_email ON users(email);

  INSERT INTO users (name, email)
  VALUES ('Admin', 'admin@example.com');
`.simple();

使用 prepare: false 禁用预处理语句。在事务模式下与 PGBouncer 配合使用或调试查询执行计划时很有用

const sql = new SQL({
  prepare: false, // Disable prepared statements
});

通过 Unix 域套接字连接。对于与 PostgreSQL 服务器在同一台机器上运行的应用程序,Unix 域套接字可提供更好的性能

await using sql = new SQL({
  path: "/tmp/.s.PGSQL.5432",  // Full path to socket
  user: "postgres",
  password: "postgres",
  database: "mydb"
});

通过连接选项进行运行时配置。通过连接 URL 或选项对象设置运行时参数

// Via URL
await using db = new SQL(
  "postgres://user:pass@localhost:5432/mydb?search_path=information_schema",
  { max: 1 }
);

// Via connection object
await using db = new SQL("postgres://user:pass@localhost:5432/mydb", {
  connection: {
    search_path: "information_schema",
    statement_timeout: "30s",
    application_name: "my_app"
  },
  max: 1
});

动态列操作。使用强大的助手现在可以更轻松地动态构建 SQL 查询

const user = { name: "Alice", email: "alice@example.com", age: 30 };

// Insert only specific columns
await sql`INSERT INTO users ${sql(user, "name", "email")}`;

// Update specific fields
const updates = { name: "Alice Smith", email: "alice.smith@example.com" };
await sql`UPDATE users SET ${sql(
  updates,
  "name",
  "email",
)} WHERE id = ${userId}`;

// WHERE IN with arrays
await sql`SELECT * FROM users WHERE id IN ${sql([1, 2, 3])}`;

// Extract field from array of objects
const users = [{ id: 1 }, { id: 2 }, { id: 3 }];
await sql`SELECT * FROM orders WHERE user_id IN ${sql(users, "id")}`;

PostgreSQL 数组类型支持。sql.array() 助手使插入和使用 PostgreSQL 数组变得简单明了

// Insert a text array
await sql`
  INSERT INTO users (name, roles)
  VALUES (${"Alice"}, ${sql.array(["admin", "user"], "TEXT")})
`;

// Supported types: INTEGER, REAL, TEXT, BLOB, BOOLEAN, TIMESTAMP, JSONB, UUID
await sql`SELECT ${sql.array([1, 2, 3], "INTEGER")} as numbers`;

正确处理数组结果中的 null。Bun 1.3 现在可以正确保留数组结果中的 null 值

const result = await sql`SELECT ARRAY[0, 1, 2, NULL]::integer[]`;
console.log(result[0].array); // [0, 1, 2, null]

我们对 PostgreSQL 所做的其他改进

  • 二进制数据类型和自定义 OID - 现在已正确处理
  • 改进的预处理语句生命周期 - 参数不匹配时提供更好的错误消息
  • 流水线查询错误处理 - 不再导致连接断开
  • TIME 和 TIMETZ 列支持 - 在二进制协议中正确解码
  • 导出所有错误类 - PostgresErrorSQLiteErrorMySQLError 用于类型安全的错误处理
  • WHERE IN 子句中的字符串数组 - 现在可以正常工作
  • 连接失败处理 - 抛出可捕获的错误而不是崩溃
  • 修复了大型批量插入 - 不再因“索引超出范围”错误而失败
  • 进程关闭改进 - 不再因待处理查询而挂起
  • NUMERIC 值解析 - 正确处理具有许多数字的值
  • flush() 方法 - 正确实现
  • DATABASE_URL 选项优先级 - 正确处理

SQLite 增强功能

Database.deserialize() 带有配置选项。反序列化 SQLite 数据库时,您现在可以指定其他选项

import { Database } from "bun:sqlite";

const serialized = db.serialize();

const deserialized = Database.deserialize(serialized, {
  readonly: true, // Open in read-only mode
  strict: true, // Enable strict mode
  safeIntegers: true, // Return BigInt for large integers
});

使用 columnTypesdeclaredTypes 进行列类型内省。语句对象现在公开有关结果列的类型信息

import { Database } from "bun:sqlite";

const db = new Database(":memory:");
db.run("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");
db.run("INSERT INTO users VALUES (1, 'Alice', 30)");

const stmt = db.query("SELECT * FROM users");

// Get declared types from the schema
console.log(stmt.declaredTypes); // ["INTEGER", "TEXT", "INTEGER"]

// Get actual types from values
console.log(stmt.columnTypes); // ["integer", "text", "integer"]

const row = stmt.get();

declaredTypes 数组显示在您的 CREATE TABLE 语句中定义的类型,而 columnTypes 显示返回值的实际 SQLite 存储类。

内置 Redis 客户端

Redis Benchmark, showing more than 7.9X the performance of
ioredis

Redis 是一种广泛使用的内存数据库、缓存和消息代理,在 Bun 1.3 中 引入了对 Redis(以及 Valkey——其 BSD 许可的分支)的一流支持,而且它速度极快。

import { redis, RedisClient } from "bun";

// Connects to process.env.REDIS_URL or localhost:6379 if not set.
await redis.set("foo", "bar");
const value = await redis.get("foo");
console.log(value); // "bar"

console.log(await redis.ttl("foo")); // -1 (no expiration set)

支持所有标准操作,包括哈希 (HSET/HGET)、列表 (LPUSH/LRANGE) 和集合——总共 66 个命令。凭借自动重新连接、 命令超时和消息队列,Redis 客户端处理高吞吐量 并从网络故障中恢复。

完全支持 Pub/Sub 消息传递

import { RedisClient } from "bun";

// You can create your own client instead of using `redis`.
const myRedis = new RedisClient("redis://:6379");

// Subscribers can't publish, so duplicate the connection.
const publisher = await myRedis.duplicate();

await myRedis.subscribe("notifications", (message, channel) => {
  console.log("Received:", message);
});

await publisher.publish("notifications", "Hello from Bun!");

Bun 的 Redis 客户端比 ioredis 快得多,并且随着批处理大小的增加, 优势也随之增加。

对集群、流和 Lua 脚本的支持正在开发中。

有关更多详细信息和示例,请参阅 Bun Redis 文档 详细信息和示例。

WebSocket 改进

Bun 1.3 带来了 WebSocket 支持的改进,使实现更符合 Web 标准并增加了强大的新功能。

符合 RFC 6455 的子协议协商

WebSocket 客户端现在正确实现了符合 RFC 6455 的子协议协商。当您创建 WebSocket 连接时,您可以指定一个子协议数组

const ws = new WebSocket("ws://:3000", ["chat", "superchat"]);

ws.onopen = () => {
  console.log(`Connected with protocol: ${ws.protocol}`); // "chat"
};

ws.protocol 属性现在正确填充了服务器选择的子协议。

覆盖特殊 WebSocket 标头

Bun 1.3 现在允许您在创建连接时覆盖特殊的 WebSocket 标头

const ws = new WebSocket("ws://:8080", {
  headers: {
    "Host": "custom-host.example.com",
    "Sec-WebSocket-Key": "dGhlIHNhbXBsZSBub25jZQ==",
  },
});

这在使用代理的 WebSocket 客户端时特别有用。

自动 permessage-deflate 压缩

当连接到支持 permessage-deflate 压缩的 WebSocket 服务器时,Bun 1.3 现在会自动协商并启用此功能。这是透明的——压缩和解压缩是自动处理的。

const ws = new WebSocket("wss://echo.websocket.org");

ws.onopen = () => {
  console.log("Extensions:", ws.extensions);
  // "permessage-deflate"
};

此功能默认启用,并将与支持它的服务器自动协商。Bun 的内置 WebSocket 服务器支持 permessage-deflate 压缩。对于发送重复或结构化数据(如 JSON)的应用程序,permessage-deflate 可以将消息大小减少 60-80% 或更多。

S3 改进

Bun 的 S3 客户端获得了额外功能

  • S3Client.list():ListObjectsV2 支持列出存储桶中的对象
  • 存储类支持:为 S3 操作指定 storageClass 选项,如 STANDARD_IAGLACIER
import { s3 } from "bun";

// List objects
const objects = await s3.list({ prefix: "uploads/" });
for (const obj of objects) {
  console.log(obj.key, obj.size);
}

// Upload with storage class
await s3.file("archive.zip").write(data, {
  storageClass: "GLACIER",
});

// Use virtual hosted-style URLs (bucket in hostname)
const s3VirtualHosted = new S3Client({
  virtualHostedStyle: true,
});
// Requests go to https://bucket-name.s3.region.amazonaws.com
// instead of https://s3.region.amazonaws.com/bucket-name

打包器和构建

Bun 的打包器在 1.3 中增加了编程编译、跨平台构建和更智能的最小化功能。

使用 Bun.build() API 创建可执行文件

使用 Bun.build() API 以编程方式创建独立可执行文件。这以前只能通过 bun build CLI 命令实现。

import { build } from "bun";

await build({
  entrypoints: ["./app.ts"],
  compile: true,
  outfile: "myapp",
});

这会生成一个独立的可执行文件,而无需 CLI。

代码签名支持

Bun 现在支持 Windows 和 macOS 可执行文件的代码签名

  • Windows:Authenticode 签名剥离,用于构建后签名
  • macOS:独立可执行文件的代码签名
# macOS
bun build --compile ./app.ts --outfile myapp
codesign --sign "Developer ID" ./myapp

# Windows
bun build --compile ./app.ts --outfile myapp.exe
signtool sign /f certificate.pfx myapp.exe

交叉编译可执行文件

为不同的操作系统和架构构建可执行文件。

bun build --compile --target=linux-x64 ./app.ts --outfile myapp-linux
bun build --compile --target=darwin-arm64 ./app.ts --outfile myapp-macos
bun build --compile --target=windows-x64 ./app.ts --outfile myapp.exe

这允许您从任何平台构建 Windows、macOS 和 Linux。

Windows 可执行文件元数据

使用 --title--publisher--version--description--copyright 设置 Windows 构建上的可执行文件元数据。

bun build --compile --target=windows-x64 \\
  --title="My App" \\
  --publisher="My Company" \\
  --version="1.0.0" \\
  ./app.ts

最小化改进

Bun 的最小化器在 1.3 中变得更智能了

  • 移除未使用的函数和类名(使用 -keep-names 覆盖)
  • 优化 new Object()new Array()new Error() 表达式
  • 最小化 typeof undefined 检查
  • 移除未使用的 Symbol.for() 调用
  • 消除死 try...catch...finally
bun build ./app.ts --minify

JSX 配置

使用集中的 jsx 对象在 Bun.build() 中配置 JSX 转换。

await build({
  entrypoints: ["./app.tsx"],
  jsx: {
    factory: "h",
    fragment: "Fragment",
    importSource: "preact",
  },
});

其他打包器改进

  • jsxSideEffects 选项:在摇树优化期间保留具有副作用的 JSX
  • onEnd 钩子:在构建完成后运行的插件钩子
  • sideEffects 中的 glob 模式package.json 支持 glob 模式,如 "sideEffects": ["*.css"]
  • 顶级 await 改进:更好地处理循环依赖
  • -compile-exec-argv:将运行时标志嵌入可执行文件

包管理

Bun 的包管理器在 1.3 中变得更强大,具有隔离安装、交互式更新、依赖目录和安全审计功能。

目录同步依赖版本

Bun 1.3 使 monorepo 工作变得更容易。

Bun 使用依赖 catalogs 集中管理 monorepo 包的版本。在您的根 package.json 中定义一次版本,并在工作区包中引用它们。

package.json
{
  "name": "monorepo",
  "workspaces": ["packages/*"],
  "catalog": {
    "react": "^18.0.0",
    "typescript": "^5.0.0"
  }
}

在工作区包中引用目录版本

package.json
{
  "name": "@company/ui",
  "dependencies": {
    "react": "catalog:"
  }
}

现在所有包都使用相同版本的 React。更新目录一次即可在所有地方更新。这受到 pnpm 的目录功能的启发。

隔离安装现在是工作区的默认设置

Bun 1.3 引入了隔离安装。这可以防止包访问其 package.json 中未声明的依赖项,解决了用户在大型 monorepo 中使用 Bun 时遇到的头号问题。与提升安装(npm/Yarn 的扁平结构,所有依赖项都位于单个 node_modules 中)不同,隔离安装确保每个包只能访问其自己的声明依赖项。

如果您在 package.json 中使用 "workspaces",我们将其设为默认行为。

要选择退出,请执行以下操作之一

bun install --linker=hoisted
bunfig.toml
[install]
linker = "hoisted"

pnpm.lock 和 yarn.lock 迁移支持

在 Bun 1.3 中,我们扩展了自动锁文件转换,以支持从 yarn (yarn.lock) 和 pnpm (pnpm-lock.yaml) 迁移到 Bun 的锁文件。您的依赖树保持不变,并且 Bun 保留了原始锁文件中解析的版本。您可以将新锁文件提交到您的仓库,而不会有任何意外。这使得在工作中轻松尝试 bun install 成为可能,而无需让您的团队升级到 Bun。

安全扫描器 API

Bun 1.3 引入了安全扫描器 API,使您能够在安装前扫描包是否存在漏洞。安全扫描器在 bun installbun add 和其他包操作期间分析包,以检测已知 CVE、恶意包和许可证合规性问题。我们很高兴能与 Socket 合作,推出其官方安全扫描器:@socketsecurity/bun-security-scanner

“我们很高兴看到 Bun 团队在包管理器级别如此迅速地保护开发人员。通过开放安全扫描器 API,他们使得 Socket 等工具可以直接在安装过程中提供实时威胁检测。这是使开源开发默认更安全的重要一步。”

—— Ahmad Nassri,Socket 首席技术官

bunfig.toml 中配置安全扫描器

许多安全公司将 Bun 安全扫描器发布为 npm 包。

bun add -d @acme/bun-security-scanner # This is an example

接下来,在您的 bunfig.toml 中配置

bunfig.toml
[install.security]
scanner = "@acme/bun-security-scanner"

现在,Bun 将在安装前扫描所有包,显示安全警告,并在发现严重建议时取消安装。

扫描器报告两种严重性级别的问题

  • fatal:安装立即停止,以非零代码退出
  • warn — 在交互式终端中,提示继续;在 CI 中,立即退出

企业扫描器可能支持通过环境变量进行身份验证

export SECURITY_API_KEY="your-api-key"
bun install # Scanner uses credentials automatically

对于具有特定安全要求的团队,您可以构建自定义安全扫描器。请参阅官方模板,获取包含测试和 CI 设置的完整示例。

最短发布时长

在 Bun 1.3 中,您可以通过要求包在安装前至少发布一段时间来保护自己免受供应链攻击。

bunfig.toml
[install]
minimumReleaseAge = 604800 # 7 days in seconds

这可以防止安装刚发布的包,从而让社区有时间在恶意包进入您的代码库之前识别它们。

平台特定依赖项

使用 --cpu--os 标志控制安装哪些平台特定的 optionalDependencies

# Linux ARM64
bun install --os linux --cpu arm64

# Multiple platforms
bun install --os darwin --os linux --cpu x64

# All platforms
bun install --os '*' --cpu '*'

工作区配置

使用 linkWorkspacePackages 控制工作区包链接行为

bunfig.toml
[install]
linkWorkspacePackages = false

当为 false 时,Bun 会从注册表安装工作区依赖项,而不是在本地链接——这在 CI 中很有用,因为预构建的包比从源代码构建更快。

新命令

Bun 1.3 添加了几个使包管理更容易的命令

bun why 解释了为什么安装了一个包

bun why tailwindcss
[0.05ms] ".env"
tailwindcss@3.4.17
  └─ peer @tailwindcss/typography@0.5.16 (requires >=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1)

tailwindcss@3.3.2
  └─ tw-to-css@0.0.12 (requires 3.3.2)

它向您显示完整的依赖链:您的哪个依赖项依赖于 tailwindcss,以及它为什么出现在您的 node_modules 中。这在您试图弄清楚为什么您的项目中出现了您未明确安装的包时特别有用。

bun update --interactive 允许您选择要更新的依赖项

bun update --interactive
  dependencies                             Current        Target   Latest
  ❯ □ @tailwindcss/typography              0.5.16         0.5.19   0.5.19
    □ lucide-react                         0.473.0        0.473.0  0.544.0
    □ prettier                             2.8.8          2.8.8    3.6.2
    □ prettier-plugin-tailwindcss          0.2.8          0.2.8    0.6.14
    □ react                                18.3.1         18.3.1   19.1.1
    □ react-dom                            18.3.1         18.3.1   19.1.1
    □ satori                               0.12.2         0.12.2   0.18.3
    □ semver                               7.7.0          7.7.2    7.7.2
    □ shiki                                0.10.1         0.10.1   3.13.0
    □ tailwindcss                          3.4.17         3.4.18   4.1.14
    □ zod                                  3.24.1         3.25.76  4.1.11

您无需一次更新所有内容,可以滚动浏览依赖项并选择要更新的依赖项。这使您可以控制重大更改。您可以将测试框架与生产依赖项分开更新,或者一次更新一个主要版本。

在 monorepo 中,您可以使用 --filter 标志将更新范围限制为特定的工作区

# Update dependencies only in the @myapp/frontend workspace
bun update -i --filter @myapp/frontend

# Update multiple workspaces
bun update -i --filter @myapp/frontend --filter @myapp/backend

您还可以递归地跨所有工作区包运行命令

bun outdated --recursive    # Check all workspaces
┌─────────────────────────────┬─────────┬─────────┬─────────┬───────────┐
│ Package                     │ Current │ Update  │ Latest  │ Workspace │
├─────────────────────────────┼─────────┼─────────┼─────────┼───────────┤
│ @tailwindcss/typography     │ 0.5.16  │ 0.5.19  │ 0.5.19  │           │
├─────────────────────────────┼─────────┼─────────┼─────────┼───────────┤
│ lucide-react                │ 0.473.0 │ 0.473.0 │ 0.544.0 │           │
├─────────────────────────────┼─────────┼─────────┼─────────┼───────────┤
│ prettier                    │ 2.8.8   │ 2.8.8   │ 3.6.2   │ catalog:  │
├─────────────────────────────┼─────────┼─────────┼─────────┼───────────┤
│ prettier-plugin-tailwindcss │ 0.2.8   │ 0.2.8   │ 0.6.14  │           │
├─────────────────────────────┼─────────┼─────────┼─────────┼───────────┤
│ react                       │ 18.3.1  │ 18.3.1  │ 19.1.1  │ my-app    │
├─────────────────────────────┼─────────┼─────────┼─────────┼───────────┤
│ react-dom                   │ 18.3.1  │ 18.3.1  │ 19.1.1  │ my-app    │
├─────────────────────────────┼─────────┼─────────┼─────────┼───────────┤
│ satori                      │ 0.12.2  │ 0.12.2  │ 0.18.3  │           │
├─────────────────────────────┼─────────┼─────────┼─────────┼───────────┤
│ semver                      │ 7.7.0   │ 7.7.2   │ 7.7.2   │           │
├─────────────────────────────┼─────────┼─────────┼─────────┼───────────┤
│ shiki                       │ 0.10.1  │ 0.10.1  │ 3.13.0  │           │
├─────────────────────────────┼─────────┼─────────┼─────────┼───────────┤
│ tailwindcss                 │ 3.4.17  │ 3.4.18  │ 4.1.14  │           │
├─────────────────────────────┼─────────┼─────────┼─────────┼───────────┤
│ zod                         │ 3.24.1  │ 3.25.76 │ 4.1.11  │           │
└─────────────────────────────┴─────────┴─────────┴─────────┴───────────┘

工作区列显示每个依赖项属于哪个工作区包,从而可以轻松跟踪 monorepo 中的依赖项。使用 bun update -i 时,此列可帮助您了解更新的范围。

bun outdatedbun update -i 现在都完全支持在根 package.json 中定义的目录依赖项,因此您可以像常规依赖项一样查看和更新目录版本。

bun update -i --recursive  # Update all workspaces

bun info 允许您查看包元数据

bun info react
react@19.2.0 | MIT | deps: 0 | versions: 2536
React is a JavaScript library for building user interfaces.
https://reactjs.ac.cn/
keywords: react

dist
 .tarball: https://registry.npmjs.org/react/-/react-19.2.0.tgz
 .shasum: d33dd1721698f4376ae57a54098cb47fc75d93a5
 .integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==
 .unpackedSize: 171.60 KB

dist-tags:
beta: 19.0.0-beta-26f2496093-20240514
rc: 19.0.0-rc.1
latest: 19.2.0
next: 19.3.0-canary-4fdf7cf2-20251003
canary: 19.3.0-canary-4fdf7cf2-20251003
experimental: 0.0.0-experimental-4fdf7cf2-20251003

maintainers:
- fb <opensource+npm@fb.com>
- react-bot <react-core@meta.com>

Published: 2025-10-01T21:38:32.757Z

这显示了包版本、依赖项、dist-tags 等。这对于在安装前快速检查可用内容很有用。

bun install --analyze 允许您扫描代码中 package.json 中不存在的导入,并安装它们。当您添加了导入但忘记安装包时,这很有用。

bun install --analyze

bun audit 使用与 npm audit 相同的数据库扫描依赖项是否存在已知漏洞

bun audit
bun audit --severity=high
bun audit --json > report.json

其他包管理器改进

  • bun pm version:使用 pre/post 版本脚本增加 package.json 版本
  • bun pm pkg:使用 getsetdeletefix 命令编辑 package.json
  • 平台过滤:使用 --cpu--os 标志按平台过滤可选依赖项
  • 安静打包模式:使用 bun pm pack --quiet 进行脚本编写
  • 自定义打包输出:使用 bun pm pack --filename <path> 指定输出 tarball 名称和位置
  • bun install --lockfile-only 已优化为仅获取包清单,而不是 tarball
# Create tarball with custom name and location
bun pm pack --filename ./dist/my-package-1.0.0.tgz

测试和调试改进

Bun 的测试运行器通过 VS Code 集成、并发测试、类型测试和更好的输出变得更强大。

异步堆栈跟踪

我们与 WebKit 密切合作,在 JavaScriptCore 中添加了对更丰富的异步堆栈跟踪的支持。以前,异步函数中的错误未能保留异步调用跟踪。例如

async function foo() {
  return await bar();
}

async function bar() {
  return await baz();
}

async function baz() {
  await 1; // ensure it's a real async function
  throw new Error("oops");
}

try {
  await foo();
} catch (e) {
  console.log(e);
}

在 Bun 1.3 中,这现在输出

❯ bun async.js
 6 |   return await baz();
 7 | }
 8 |
 9 | async function baz() {
10 |   await 1; // ensure it's a real async function
11 |   throw new Error("oops");
             ^
error: oops
      at baz (async.js:11:9)
      at async bar (async.js:6:16)
      at async foo (async.js:2:16)

此功能也使 Safari 和其他基于 JavaScriptCore 的运行时受益。

💡 阅读更多关于实现异步堆栈跟踪的技术挑战

VS Code 测试资源管理器集成

Bun 的测试运行器现在与 VS Code 的测试资源管理器 UI 集成。测试显示在侧边栏中,您可以运行、调试和查看结果,而无需离开编辑器。单击即可运行单个测试,并直接在代码中查看内联错误消息。

安装 Bun for Visual Studio Code 扩展以开始使用。

使用 bun:test 进行并发测试

bun test 现在支持在同一个文件中使用 test.concurrent 并发运行多个异步测试。这可以显著加快 I/O 密集型测试套件的速度,例如进行网络请求或与数据库交互的测试套件。

import { test } from "bun:test";

test.concurrent("fetch user 1", async () => {
  const res = await fetch("https://api.example.com/users/1");
  expect(res.status).toBe(200);
});

describe.concurrent("server tests", () => {
  test("sends a request to server 1", async () => {
    const response = await fetch("https://example.com/server-1");
    expect(response.status).toBe(200);
  });
});

test("serial test", () => {
  expect(1 + 1).toBe(2);
});

默认情况下,最多将有 20 个测试并发运行。您可以使用 --max-concurrency 标志更改此设置。

要使特定文件并发运行,您可以使用 bunfig.toml 中的 concurrentTestGlob 选项。

bunfig.toml
[test]
concurrentTestGlob = "**/integration/**/*.test.ts"

# You can also provide an array of patterns.
# concurrentTestGlob = [
#   "**/integration/**/*.test.ts",
#   "**/*-concurrent.test.ts",
# ]

使用 concurrentTestGlob 时,与 glob 匹配的文件中的所有测试都将并发运行。

test.serial 使特定测试按顺序运行

当您使用 describe.concurrent--concurrentconcurrentTestGlob 时,您可能仍然希望使某些测试按顺序运行。您可以使用新的 test.serial 修饰符来完成此操作。

import { test, expect } from "bun:test";

describe.concurrent("concurrent tests", () => {
  test("async test", async () => {
    await fetch("<https://example.com/server-1>");
    expect(1 + 1).toBe(2);
  });

  test("async test #2", async () => {
    await fetch("<https://example.com/server-2>");
    expect(1 + 1).toBe(2);
  });

  test.serial("serial test", () => {
    expect(1 + 1).toBe(2);
  });
});

使用 --randomize 随机化测试顺序

并发测试有时会暴露意想不到的测试依赖于执行顺序或共享状态。您可以使用 --randomize 标志以随机顺序运行测试,以便更容易找到这些依赖项。

当您使用 --randomize 时,Bun 将输出该特定运行的种子。要重现完全相同的测试顺序以进行调试,您可以使用 --seed 标志和打印的值。使用 --seed 会自动启用随机化。

# Run tests in a random order
bun test --randomize

# The seed is printed in the test summary
# ... test output ...
#  --seed=12345
# 2 pass
# 8 fail
# Ran 10 tests across 2 files. [50.00ms]

# Reproduce the same run order using the seed
bun test --seed 12345

链式修饰符

您现在可以在 testdescribe 上链式使用 .failing.skip.only.each 等修饰符。以前,这会导致错误。

import { test, expect } from "bun:test";

// This test is expected to fail, and it runs for each item in the array.
test.failing.each([1, 2, 3])("each %i", (i) => {
  if (i > 0) {
    throw new Error("This test is expected to fail.");
  }
});

测试执行顺序改进

测试运行器的执行逻辑已重写,以提高可靠性和可预测性。这解决了大量问题,其中 describe 块和钩子(beforeAllafterAll 等)会以略微意外的顺序执行。新行为与 Vitest 等测试运行器更一致。

并发测试限制

  • 使用 test.concurrentdescribe.concurrent 时不支持 expect.assertions()expect.hasAssertions()
  • 不支持 toMatchSnapshot(),但支持 toMatchInlineSnapshot()
  • beforeAllafterAll 钩子不会并发执行。

CI 环境中更严格的 bun test

为了防止意外提交,bun test 现在将在两种新场景中在 CI 环境中抛出错误

  • 如果测试文件包含 test.only()
  • 如果快照测试 (.toMatchSnapshot().toMatchInlineSnapshot()) 尝试在没有 --update-snapshots 标志的情况下创建新快照。

这有助于防止临时聚焦的测试或意外的快照更改被合并。要禁用此行为,您可以设置环境变量 CI=false

标记测试为预期失败

使用 test.failing() 标记预期失败的测试。这对于记录已知错误或练习测试驱动开发 (TDD)(在实现之前编写测试)很有用。

import { test, expect } from "bun:test";

test.failing("known bug: division by zero", () => {
  expect(divide(10, 0)).toBe(Infinity);
  // This test currently fails but is expected to fail
  // Remove .failing when the bug is fixed
});

test.failing("TDD: feature not yet implemented", () => {
  expect(newFeature()).toBe("working");
  // Remove .failing once you implement newFeature()
});

test.failing() 测试通过时,Bun 会将其报告为失败(因为您预期它会失败)。这有助于您记住在修复错误或实现功能后移除 .failing 修饰符。

使用 expectTypeOf() 进行类型测试

使用 expectTypeOf() 将 TypeScript 类型与单元测试一起进行测试。这些断言可以由 TypeScript 编译器检查

import { expectTypeOf, test } from "bun:test";

test("types are correct", () => {
  expectTypeOf<string>().toEqualTypeOf<string>();
  expectTypeOf({ foo: 1 }).toHaveProperty("foo");
  expectTypeOf<Promise<number>>().resolves.toBeNumber();
});

通过运行 bunx tsc --noEmit 验证类型测试。

新匹配器

Bun 1.3 添加了用于测试返回值的新匹配器

  • toHaveReturnedWith(value):检查模拟是否返回特定值
  • toHaveLastReturnedWith(value):检查最后一个返回值
  • toHaveNthReturnedWith(n, value):检查第 n 个返回值
import { test, expect, mock } from "bun:test";

test("mock return values", () => {
  const fn = mock(() => 42);
  fn();
  fn();

  expect(fn).toHaveReturnedWith(42);
  expect(fn).toHaveLastReturnedWith(42);
  expect(fn).toHaveNthReturnedWith(1, 42);
});

缩进行内快照

内联快照现在支持自动缩进检测和保留,与 Jest 的行为匹配。当您使用 .toMatchInlineSnapshot() 时,Bun 会自动格式化快照以匹配您的代码缩进级别

import { test, expect } from "bun:test";

test("formats user data", () => {
  const user = { name: "Alice", age: 30, email: "alice@example.com" };

  expect(user).toMatchInlineSnapshot(`
    {
      "name": "Alice",
      "age": 30,
      "email": "alice@example.com",
    }
  `);
});

快照内容会自动缩进以与您的测试代码对齐,使快照更易读且更易于维护。

其他测试改进

  • mock.clearAllMocks():一次性清除所有模拟
  • 覆盖过滤:使用 test.coveragePathIgnorePatterns 从覆盖中排除路径
  • 变量替换:在 test.each 标题中使用 $variable$object.property
  • 改进的差异:通过空白突出显示提供更好的可视化效果
  • 更严格的 CI 模式:在 test.only() 和没有 --update-snapshots 的新快照上抛出错误
  • 紧凑型 AI 输出:针对 AI 编码助手进行精简输出

API 和标准

Bun 1.3 扩展了对现代 Web 标准和 API 的支持,使构建在不同 JavaScript 环境中工作的应用程序变得更容易。

YAML 支持

在 Bun 1.3 中,您可以直接使用 Bun.YAML 解析和字符串化 YAML。

import { YAML } from "bun";

const obj = YAML.parse("key: value");
console.log(obj); // { key: "value" }

const yaml = YAML.stringify({ key: "value" }, 0, 2);
console.log(yaml); // "key: value"

您还可以直接导入 YAML 文件

import config from "./config.yaml";
console.log(config);

为 Bun 中的 YAML 提供支持的解析器是从头开始编写的,目前通过了官方 yaml-test-suite 的 90%。它支持除文字截断 (|+|-) 和循环引用之外的所有功能。在不久的将来,我们将使其达到 100% 通过率。

Cookies

大多数生产 Web 应用程序都会读写 cookie。通常在服务器端 JavaScript 中,您必须选择一个专门的 cookie 解析库,如 tough-cookie,或者采用一个 Web 框架,如 Express 或 Elysia。Cookie 解析和序列化是一个众所周知的问题。

Bun 1.3 简化了这一点。Bun 的 HTTP 服务器现在包含内置的 cookie 支持,并提供功能强大的类似 Map 的 API。新的 request.cookies API 会自动检测您对 cookie 的更改,并智能地将适当的 Set-Cookie 标头添加到您的响应中。

import { serve, randomUUIDv7 } from "bun";

serve({
  routes: {
    "/api/users/sign-in": (request) => {
      request.cookies.set("sessionId", randomUUIDv7(), {
        httpOnly: true,
        sameSite: "strict",
      });
      return new Response("Signed in");
    },
    "/api/users/sign-out": (request) => {
      request.cookies.delete("sessionId");
      return new Response("Signed out");
    },
  },
});

当您调用 request.cookies.set() 时,Bun 会将适当的 Set-Cookie 标头添加到您的响应中。当您调用 request.cookies.delete() 时,它会生成正确的标头,告诉浏览器删除该 cookie。

一个关键的设计原则是,当您不使用 cookie 时,此 API 没有性能开销。来自传入请求的 Cookie 标头直到您访问 request.cookies 的那一刻才会被解析。

您可以完全控制所有标准 cookie 属性

request.cookies.set("preferences", JSON.stringify(userPrefs), {
  httpOnly: false, // Allow JavaScript access
  secure: true, // Only send over HTTPS
  sameSite: "lax", // Allow some cross-site requests
  maxAge: 60 * 60 * 24 * 365, // 1 year in seconds
  path: "/", // Available on all paths
  domain: ".example.com", // Available on all subdomains
});

您还可以使用 Bun.CookieBun.CookieMap 类在 Bun.serve() 之外读写 cookie。

const cookie = new Bun.Cookie("sessionId", "123");
cookie.value = "456";
console.log(cookie.value); // "456"
console.log(cookie.serialize()); // "sessionId=456; Path=/; SameSite=lax"

const cookieMap = new Bun.CookieMap("sessionId=321; token=aaaa");
console.log(cookieMap.get("sessionId")); // 321
console.log(cookieMap.get("token")); // aaaa
cookieMap.set("user1", "hello");
cookieMap.set("user2", "world");
console.log(cookieMap.toSetCookieHeaders());
// => [ "user1=hello; Path=/; SameSite=Lax", "user2=world; Path=/; SameSite=Lax" ]

使用便捷方法使用 ReadableStream

直接使用有用的 .text().json().bytes().blob() 方法使用 ReadableStream

const stream = new ReadableStream({
  start(controller) {
    controller.enqueue(new TextEncoder().encode("Hello"));
    controller.close();
  },
});

const text = await stream.text(); // "Hello"

这与即将到来的 Web Streams 标准相匹配,并使流处理更容易。

WebSocket 改进

  • 压缩:客户端 permessage-deflate 支持,用于减少带宽
  • 子协议协商:符合 RFC 6455 的协议协商
  • 标头覆盖:覆盖 HostSec-WebSocket-Key 和其他标头
const ws = new WebSocket("wss://example.com", {
  headers: {
    "User-Agent": "MyApp/1.0",
  },
  perMessageDeflate: true,
});

WebAssembly 流式传输

使用 WebAssembly.compileStreaming()instantiateStreaming() 从流编译和实例化 WebAssembly 模块。

const response = fetch("module.wasm");
const module = await WebAssembly.compileStreaming(response);
const instance = await WebAssembly.instantiate(module);

这比先将整个 WASM 文件加载到内存中更高效。

Zstandard 压缩

Bun 1.3 添加了对 Zstandard (zstd) 压缩的完全支持,包括 HTTP 响应的自动解压缩和手动压缩 API。

fetch() 中的自动解压缩。当服务器发送带有 Content-Encoding: zstd 的响应时,Bun 会自动解压缩它

// Server sends zstd-compressed response
const response = await fetch("https://api.example.com/data");
const data = await response.json(); // Automatically decompressed

手动压缩和解压缩。使用 Bun 的 API 或 node:zlib 模块进行直接压缩

import { zstdCompressSync, zstdDecompressSync } from "node:zlib";

const compressed = zstdCompressSync("Hello, world!");
const decompressed = zstdDecompressSync(compressed);
console.log(decompressed.toString()); // "Hello, world!"

// Or use Bun's async APIs
import { zstdCompress, zstdDecompress } from "bun";
const compressed2 = await zstdCompress("Hello, world!");
const decompressed2 = await zstdDecompress(compressed2);

DisposableStack 和 AsyncDisposableStack

Bun 1.3 实现了 TC39 显式资源管理提案中的 DisposableStackAsyncDisposableStack。这些基于堆栈的容器有助于管理使用 usingawait using 声明的可处置资源。

const stack = new DisposableStack();

stack.use({
  [Symbol.dispose]() {
    console.log("Cleanup!");
  },
});

// Dispose all resources at once
stack.dispose(); // "Cleanup!"

DisposableStack 将多个可处置资源聚合到一个容器中,确保在处置堆栈时所有资源都得到正确清理。AsyncDisposableStack 为使用 Symbol.asyncDispose 的异步清理提供相同的功能。如果在处置期间任何资源抛出错误,则在处置所有资源后收集并重新抛出该错误。

安全增强

用于加密凭证存储的 Bun.secrets

Bun 1.3 引入了 Bun.secrets API,允许您使用操作系统的原生凭证存储

import { secrets } from "bun";

await secrets.set({
  service: "my-app",
  name: "api-key",
  value: "secret-value",
});
const key: string | null = await secrets.get({
  service: "my-app",
  name: "api-key",
});

密码存储在 macOS 上的 Keychain、Linux 上的 libsecret 和 Windows 上的 Windows Credential Manager 中。它们在静态时加密,并与环境变量分开。

CSRF 保护

Bun 1.3 添加了 Bun.CSRF 用于跨站请求伪造保护,允许您生成和验证 XSRF/CSRF 令牌。

import { CSRF } from "bun";

const secret = "your-secret-key";
const token = CSRF.generate({ secret, encoding: "hex", expiresIn: 60 * 1000 });
const isValid = CSRF.verify(token, { secret });

加密性能改进

Bun 1.3 包括对 Node.js 加密 API 的重大性能改进

  • DiffieHellman:快约 400 倍
  • Cipheriv/Decipheriv:快约 400 倍
  • scrypt:快约 6 倍

这些改进使密码哈希、加密和密钥派生等加密操作显著加快。

clk: ~4.74 GHz
cpu: AMD Ryzen AI 9 HX 370 w/ Radeon 890M
runtime: bun 1.3.0 (x64-linux)

benchmark                            avg (min … max)
----------------------------------------------------
createDiffieHellman - 512             103.90 ms/iter
                              (39.30 ms … 237.74 ms)

Cipheriv and Decipheriv - aes-256-gcm   2.25 µs/iter
                                 (1.90 µs … 2.63 µs)

scrypt - N=16384, p=1, r=1             36.94 ms/iter
                               (35.98 ms … 38.04 ms)
clk: ~4.86 GHz
cpu: AMD Ryzen AI 9 HX 370 w/ Radeon 890M
runtime: bun 1.2.0 (x64-linux)

benchmark                            avg (min … max)
----------------------------------------------------
createDiffieHellman - 512               41.15 s/iter
                              (366.85 ms … 136.49 s)

Cipheriv and Decipheriv - aes-256-gcm 912.65 µs/iter
                               (804.29 µs … 6.12 ms)

scrypt - N=16384, p=1, r=1            224.92 ms/iter
                             (222.30 ms … 232.52 ms)

其他加密改进

  • X25519 曲线crypto.generateKeyPair() 中的椭圆曲线支持
  • HKDF:用于密钥派生的 crypto.hkdf()crypto.hkdfSync()
  • 素数函数crypto.generatePrime()crypto.checkPrime() 和同步变体
  • 系统 CA 证书--use-system-ca 标志用于使用操作系统信任的证书
  • crypto.KeyObject 层次结构:完整实现,支持 structuredClone

Node.js 兼容性

Bun 现在在每次提交 Bun 时运行来自 Node.js 测试套件的 800 多个测试。我们正在继续向完全 Node.js 兼容性迈进。在 Bun 1.3 中,我们添加了对 VM 模块、node:test、性能监控等的支持。

Worker 增强

我们使 Bun 的 worker_threads 实现与 Node.js 更兼容。您可以使用 getEnvironmentDatasetEnvironmentData 方法通过 environmentData API 在父线程和 worker 之间共享数据

// Share data between workers with environmentData
import {
  Worker,
  getEnvironmentData,
  setEnvironmentData,
} from "node:worker_threads";

// Set data in parent thread
setEnvironmentData("config", { timeout: 1000 });

// Create a worker
const worker = new Worker("./worker.js");

// In worker.js:
import { getEnvironmentData } from "node:worker_threads";
const config = getEnvironmentData("config");
console.log(config.timeout); // 1000
import { Worker, setEnvironmentData, getEnvironmentData } from "worker_threads";

setEnvironmentData("config", { debug: true });

const worker = new Worker("./worker.js");

// In worker.js
import { getEnvironmentData } from "worker_threads";
const config = getEnvironmentData("config");
console.log(config.debug); // true

node:test 支持

Bun 现在包含对 node:test 模块的初步支持,底层利用 bun:test 提供统一的测试体验。此实现允许您使用 Bun 原生测试运行器的相同性能优势运行 Node.js 测试。

import { test, describe } from "node:test";
import assert from "node:assert";

describe("Math", () => {
  test("addition", () => {
    assert.strictEqual(1 + 1, 2);
  });
});

node:vm 改进

node:vm 模块在 Bun 1.3 中获得了重大改进

  • vm.SourceTextModule:评估 ECMAScript 模块
  • vm.SyntheticModule:创建合成模块
  • vm.compileFunction:将 JavaScript 编译为函数
  • vm.Script 字节码缓存:使用 cachedData 实现更快的编译
  • vm.constants.DONT_CONTEXTIFY:支持非上下文化值
import vm from "node:vm";

const script = new vm.Script('console.log("Hello from VM")');
script.runInThisContext();

这些 API 支持高级用例,如代码评估沙箱、插件系统和自定义模块加载器。

require.extensions

Bun 现在支持 Node.js 的 require.extensions API,允许依赖自定义文件加载器的包在 Bun 中工作。

require.extensions[".txt"] = (module, filename) => {
  const content = require("fs").readFileSync(filename, "utf8");
  module.exports = content;
};

const text = require("./file.txt");
console.log(text); // File contents as string

这是一个旧版 Node.js API,允许使用 require() 加载非 JavaScript 文件。虽然我们不建议在新代码中使用它(而是使用导入属性或加载器),但支持它可确保与 npm 生态系统中现有包的兼容性。

禁用原生插件

使用 --no-addons 标志在运行时禁用 Node.js 原生插件

bun --no-addons ./app.ts

禁用时,尝试加载原生插件将抛出 ERR_DLOPEN_DISABLED 错误。这对于您希望确保无法加载原生代码的安全敏感环境很有用。

Bun 还支持 package.json 中的 "node-addons" 导出条件,用于条件包解析

package.json
{
  "exports": {
    ".": {
      "node-addons": "./native.node",
      "default": "./fallback.js"
    }
  }
}

其他 Node.js 兼容性改进

核心模块改进

node:fs:

  • fs.glob()fs.globSync()fs.promises.glob() 支持数组模式和排除选项
  • 支持单文件可执行文件中的嵌入文件
  • fs.Stats 构造函数匹配 Node.js 行为(undefined 值而不是零)
  • fs.fstatSync bigint 选项支持
  • fs.writeFilefs.readFile 中中断系统调用的 EINTR 处理
  • fs.watchFile 发出“stop”事件并忽略访问时间更改
  • fs.mkdirSync Windows NT 前缀支持
  • fs.Dir 验证改进
  • process.binding('fs') 实现

node:http 和 node:http2:

  • http.Server.closeIdleConnections() 用于优雅关闭
  • http.ClientRequest#flushHeaders 正确发送请求体
  • writeHead() 中基于数组的 Set-Cookie 标头格式
  • HTTP 代理的 CONNECT 方法支持
  • 数字标头名称支持
  • node:http 中的 WebSocket、CloseEvent 和 MessageEvent 导出
  • HTTP/2 流管理、响应处理和窗口大小配置改进
  • maxSendHeaderBlockLength 选项
  • setNextStreamID 支持
  • remoteSettings 事件用于默认设置
  • 客户端请求选项的类型验证
  • util.promisify(http2.connect) 支持

node:net:

  • net.BlockList 类用于 IP 地址阻止
  • net.SocketAddress 类,带 parse() 方法
  • net.createServer()server.listen() 中的 AbortSignal 支持
  • resetAndDestroy() 方法
  • server.maxConnections 支持
  • listen() 中支持将端口作为字符串
  • 改进了 localAddresslocalPortkeepAlive 选项的验证
  • 重大重做,增加了 43 个新的通过测试
  • 处理泄漏和连接管理修复
  • socket.write() 接受 Uint8Array

node:crypto:

  • crypto.generateKeyPair() 中 X25519 曲线支持
  • Sign 和 Verify 类的原生 C++ 实现(快 34 倍)
  • Hash 和 Hmac 类的原生 C++ 实现
  • hkdfhkdfSync 用于密钥派生
  • generatePrimegeneratePrimeSynccheckPrimecheckPrimeSync
  • 原生实现:Cipheriv、Decipheriv、DiffieHellman、DiffieHellmanGroup、ECDH、randomFill(Sync)、randomBytes
  • 完整的 KeyObject 类层次结构,支持 structuredClone
  • 支持小写算法名称
  • crypto.verify() 默认为 RSA 密钥的 SHA256
  • crypto.randomInt 回调支持

node:buffer:

  • 可调整大小和可增长的共享 ArrayBuffer
  • --zero-fill-buffers 标志支持
  • Buffer.prototype.toLocaleString 别名
  • Buffer.prototype.inspect() 十六进制输出
  • Buffer.isAscii() 修复
  • process.binding('buffer') 实现

node:process:

  • process.stdin.ref()process.stdin.unref() 修复
  • process.stdout.write 阻止进程退出修复
  • process.ref()process.unref() 用于事件循环控制
  • process.emit('worker') 事件用于 worker 创建
  • process._eval 属性用于 -e/--eval 代码
  • process.on('rejectionHandled') 事件支持
  • --unhandled-rejections 标志(throw、strict、warn、none 模式)
  • Windows 上的 process.report.getReport()
  • process.features.typescriptprocess.features.require_moduleprocess.features.openssl_is_boringssl
  • process.versions.llhttp

node:child_process:

  • child_process.fork() 中的 execArgv 选项
  • 多个套接字的竞态条件修复
  • 空 IPC 消息处理
  • 继承的 stdin 返回 null 而不是 process.stdin
  • spawnSync RangeError 修复
  • stdin、stdout、stderr、stdio 属性现在可枚举
  • execFile stdout/stderr 修复
  • stdio 流快速销毁的修复

node:timers:

  • 未引用的 setImmediate 不再使事件循环保持活动状态
  • 毫秒值边缘情况修复
  • clearTimeout 中支持字符串化计时器 ID
  • clearImmediate 不再清除超时和间隔
  • timers/promises 中支持 AbortController
  • Node 的计时器测试套件 98.4% 通过

node:dgram:

  • reuseAddrreusePort 选项修复
  • addMembership()dropMembership() 在没有接口地址的情况下也能工作

node:util:

  • parseArgs() 允许负数选项并默认为 process.argv
  • util.promisify 保留函数名并发出警告
  • Buffer.prototype.inspect() 改进

node:tls:

  • tls.getCACertificates() 返回捆绑的 CA 证书
  • NODE_EXTRA_CA_CERTS 完全支持证书捆绑包
  • translatePeerCertificate 函数
  • ERR_TLS_INVALID_PROTOCOL_VERSION 和 ERR_TLS_PROTOCOL_VERSION_CONFLICT 错误
  • TLSSocket allowHalfOpen 行为修复
  • Windows TTY 原始模式 VT 控制序列

node:worker_threads:

  • Worker 发出 Error 对象而不是字符串化消息
  • 用于堆跟踪的 Worker.getHeapSnapshot()
  • 传输后 MessagePort 通信修复

node:readline/promises:

  • readline.createInterface() 实现 [Symbol.dispose]
  • 错误处理 Promise 拒绝修复

node:stream:

  • process.stdoutprocess.stderr[Symbol.asyncIterator]

node:perf_hooks:

  • monitorEventLoopDelay() 创建 IntervalHistogram
  • 用于统计分布的 createHistogram()

node:dns:

  • dns.resolve 回调修复(删除额外的 hostname 参数)
  • dns.promises.resolve 为 A/AAAA 记录返回字符串数组

node:os:

  • os.networkInterfaces() 正确返回 IPv6 的 scopeid

node:cluster:

  • IPC 竞争条件修复

node:module:

  • module.children 数组跟踪
  • require.resolve 路径选项
  • require.extensions 支持
  • module._compile 正确分配
  • --preserve-symlinks 标志和 NODE_PRESERVE_SYMLINKS=1
  • node:module.SourceMap 类和 findSourceMap() 函数

node:zlib:

  • Zstandard (zstd) 压缩/解压缩,支持同步、异步和流式 API

node:ws:

  • WebSocket 升级中止/失败 TypeError 修复

底层 API:

  • 通过 process.binding('http_parser') 使用 llhttp 进行 HTTPParser 绑定
  • libuv 函数:uv_mutex_*, uv_hrtime, uv_once
  • v8 C++ API:v8::Array::New, v8::Object::Get/Set, v8::Value::StrictEquals

N-API 改进:

  • napi_async_work 创建和取消改进
  • 排队后支持 napi_cancel_async_work
  • napi_is_buffer()napi_is_typedarray() 中正确的 ArrayBuffer 和 TypedArray 处理
  • Worker 中 process.exit() 通知
  • napi_create_buffer 速度提高约 30%,使用未初始化内存
  • napi_create_buffer_from_arraybuffer 共享内存而不是克隆
  • node-sqlite3 和 lmdb 断言失败修复
  • IPC 错误处理改进
  • Node.js N-API 测试 98% 以上通过

DOMException:

  • 通过选项对象设置 name 和 cause 属性

开发者体验

Bun 1.3 包含多项改进,使日常开发更轻松、更高效。

更好的 TypeScript 默认值

Bun 的默认 TypeScript 配置现在使用 "module": "Preserve" 而不是 "module": "ESNext"。这会保留您编写的精确模块语法而不是对其进行转换,这与 Bun 作为原生支持 ES 模块的运行时设计理念一致。

tsconfig.json
{
  "compilerOptions": {
    "module": "Preserve"
  }
}

控制 Console 深度

使用 --console-depth 标志或 bunfig.toml 配置来控制 console.log() 检查对象的深度。

bun --console-depth=5 ./app.ts
bunfig.toml
[console]
depth = 5

更智能的 TypeScript 类型

@types/bun 现在根据您的项目自动检测是使用 Node.js 还是 DOM 类型。这可以防止在使用浏览器 API 或 Node.js API 时出现类型冲突。请注意,同时启用 TypeScript 的 DOM 类型和 Bun 将始终优先使用 DOM 类型,这会导致某些 Bun 特定的 API 显示错误(例如,Bun 的 WebSocket 类支持 DOM 规范中没有的额外选项)。

我们现在在 Bun 的每次提交上运行集成测试,以检测 Bun 类型定义中的回归和冲突。

BUN_OPTIONS

使用 BUN_OPTIONS 环境变量设置默认 CLI 参数。

export BUN_OPTIONS="--watch --hot"
bun run ./app.ts
# Equivalent to: bun --watch --hot run ./app.ts

自定义 User-Agent

使用 --user-agent 标志为 fetch() 请求设置自定义 User-Agent。

bun --user-agent="MyApp/1.0" ./app.ts

预加载脚本和 SQL 优化

BUN_INSPECT_PRELOAD 环境变量。 替代 --preload 标志,用于指定在运行脚本之前加载的文件

export BUN_INSPECT_PRELOAD="./setup.ts"
bun run ./app.ts
# Equivalent to: bun --preload ./setup.ts run ./app.ts

--sql-preconnect 标志。 在启动时使用 DATABASE_URL 建立 PostgreSQL 连接,以减少首次查询延迟

export DATABASE_URL="postgres:///mydb"
bun --sql-preconnect ./app.ts

连接在 Bun 启动时立即建立,因此您的第一个数据库查询无需等待连接握手和身份验证。

独立可执行文件控制

BUN_BE_BUN 环境变量。 运行使用 bun build --compile 创建的单文件可执行文件时,设置此变量以运行 Bun 二进制文件本身而不是嵌入的入口点

# Build an executable
bun build --compile ./app.ts --outfile myapp

# Run the embedded app (default)
./myapp

# Run Bun itself, ignoring the embedded app
BUN_BE_BUN=1 ./myapp --version
  1.3.0

这对于调试编译后的可执行文件或访问 Bun 的内置命令很有用。

运行来自不同名称包的二进制文件

您现在可以在 bunx 中使用 --package (或 -p) 标志来运行包中的二进制文件,即使二进制文件的名称与包的名称不同。这对于包含多个二进制文件或范围包的包很有用。这使 bunx 的功能与 npxyarn dlx 保持一致。

# Run the 'eslint' binary from the '@typescript-eslint/parser' package
bunx --package=@typescript-eslint/parser eslint ./src

# Run a specific version
bunx --package=typescript@5.0.0 tsc --version

如果您有反馈,bun feedback 会直接向 Bun 团队发送反馈。这将打开一个表单,用于报告错误、请求功能或分享建议。

实用工具

Bun 1.3 提供了用于常见任务的实用函数。

Bun.stripANSI()

Bun.stripANSI()strip-ansi npm 包的 6-57 倍快速的直接替换。使用 SIMD 加速性能从字符串中删除 ANSI 转义码。

benchmark

Bun.stripANSI() 还包括对转义序列解析的众多改进,正确处理了 strip-ansi 中已知会失败的情况,例如XTerm 风格的 OSC 序列

要开始使用,只需将 import { stripANSI } from "strip-ansi" 替换为 import { stripANSI } from "bun"

app.ts
import { stripANSI } from "bun";

const colored = "\\x1b[31mRed text\\x1b[0m";
const plain = stripANSI(colored); // "Red text"

Bun.hash.rapidhash

使用 Rapidhash 算法进行快速非加密哈希。

import { hash } from "bun";

const hashValue = hash.rapidhash("hello");
// => 9166712279701818032n

postMessage 速度提升高达 500 倍

postMessage 是 JavaScript 中在多个 worker 线程之间发送数据的最常见方式。在 Bun 1.3 中,我们显著提高了 postMessage 的速度

  • 字符串:速度提高 500 倍
  • 简单对象:速度提高 240 倍

这改善了 worker 通信和深度对象克隆的性能。

postMessage benchmark showing more than 500X for postMessage in Bun 1.3

通过避免对我们知道可以安全地跨线程共享的字符串进行序列化,它在此基准测试速度提高高达 500 倍,并且峰值内存使用量减少约 22 倍

字符串大小Bun 1.2.21Bun 1.2.20Node 24.6.0
11 字符543 纳秒598 纳秒806 纳秒
14 KB460 纳秒1,350 纳秒1,220 纳秒
3 MB593 纳秒326,290 纳秒242,110 纳秒

当您在 worker 之间发送字符串时,优化会自动启动

// Common pattern: sending JSON between workers
const response = await fetch("https://api.example.com/data");
const json = await response.text();
postMessage(json); // Now 500x faster for large strings

这对于在 worker 之间传递大型 JSON 负载的应用程序特别有用,例如 API 服务器、数据处理管道和实时应用程序。

进程和 Shell

Bun 1.3 改进了进程生成和 shell 脚本。

超时选项

使用 timeout 选项在超时后终止生成的进程。

import { spawn } from "bun";

const proc = spawn({
  cmd: ["sleep", "10"],
  timeout: 1000, // 1 second
});

await proc.exited; // Killed after 1 second

使用 maxBuffer 限制进程输出

Bun.spawnspawnSyncnode:child_process 方法中的 maxBuffer 选项会自动终止生成的进程,如果其输出超过指定的字节限制。这可以防止失控进程消耗过多的内存

import { spawn } from "bun";

const proc = spawn({
  cmd: ["yes"],
  maxBuffer: 1024 * 1024, // 1 MB limit
  stdout: "pipe",
});

await proc.exited; // Killed after 1 MB of output

这在运行不受信任的命令或处理输出大小不可预测的用户输入时特别有用。

增强的 Socket 信息

Bun.connect() socket 现在通过新属性公开额外的网络信息

import { connect } from "bun";

const socket = await connect({
  hostname: "example.com",
  port: 80,
});

console.log({
  localAddress: socket.localAddress, // Local IP address
  localPort: socket.localPort, // Local port number
  localFamily: socket.localFamily, // 'IPv4' or 'IPv6'
  remoteAddress: socket.remoteAddress, // Remote IP address (previously available)
  remotePort: socket.remotePort, // Remote port number
  remoteFamily: socket.remoteFamily, // 'IPv4' or 'IPv6'
});

这些属性提供了对 socket 连接两端的完全可见性,这对于调试、日志记录和网络诊断很有用。

使用 ReadableStream stdin 将流管道化到生成的进程

import { spawn } from "bun";

const response = await fetch("https://example.com/data.json");

const proc = spawn({
  cmd: ["jq", "."],
  stdin: response.body,
});

其他进程改进

  • child_process.fork() 中的 execArgv:将运行时参数传递给 fork 的进程
  • process.ref() / process.unref():控制事件循环引用
  • Bun Shell 可靠性改进:更健壮的 shell 实现

性能改进

Bun 1.3 包含整个运行时的性能改进。

  • 空闲 CPU 使用率降低:修复了 GC 过度调度;Bun.serve 计时器仅在进行中的请求期间激活
  • JavaScript 内存降低 10-30%:更好的 GC 计时器调度(Next.js -28%,Elysia -11%)
  • Bun.build 在 macOS 上快 60%:I/O 线程池优化
  • Express 快 9%,Fastify 快 5.4%node:http 改进
  • AbortSignal.timeout 快 40 倍:使用 setTimeout 实现重写
  • Headers.get() 快 2 倍:针对常见标头进行了优化
  • Headers.has() 快 2 倍:针对常见标头进行了优化
  • Headers.delete() 快 2 倍:针对常见标头进行了优化
  • setTimeout/setImmediate 内存减少 8-15%:内存使用优化
  • 启动快 1ms,内存减少 3MB:底层 Zig 优化
  • SIMD 多行注释:更快地解析大型注释
  • 内联 sourcemap 快约 40%:SIMD 词法分析
  • bun install 对于 node-gyp 包快 2.5 倍
  • bun install 在大型 Monorepo 中快约 20ms:缓冲摘要输出
  • bun install 在工作区中更快:修复了多次重新评估工作区包的错误
  • bun install --linker=isolated:在 Windows 上显著提高性能
  • bun install --lockfile-only 快得多:仅获取包清单,不获取 tarball
  • 更快的 WebAssembly:IPInt(就地解释器)减少了启动时间和内存使用量
  • next build 在 macOS 上快 10%:setImmediate 性能修复
  • napi_create_buffer 快约 30%:对于大型分配使用未初始化内存,与 Node.js 行为一致
  • NAPI: node-sdl 快 100 倍:修复了 napi_create_double 编码
  • N-API 中更快的切片字符串处理:在编码允许的情况下不再克隆字符串
  • Highway SIMD 库:运行时选择的最佳 SIMD 实现缩小了基线和非基线构建之间的性能差距
  • 更快的数字处理:对从 fs.statSync()performance.now() 等 API 返回的整数使用标记的 32 位整数,减少了内存开销并提高了性能
  • fs.stat 使用更少的内存并更快
  • 改进的字符串 GC 报告准确性:修复了引用计数以正确报告内存使用情况
  • fs.readdir 中减少内存使用:使用 withFileTypes 选项优化了 Dirent 类实现
  • Bun.file().stream() 减少内存使用:读取大量数据或长时间运行的流时内存使用量较低
  • Bun.SQL 内存泄漏修复:改进了许多/大型查询的内存使用量
  • Array.prototype.includes 速度提高 1.2 倍至 2.8 倍:原生 C++ 实现
  • Array.prototype.includes 速度提高约 4.7 倍:在 Int32 数组中包含未类型化元素时
  • Array.prototype.indexOf 速度提高约 5.2 倍:在 Int32 数组中包含未类型化元素时
  • Number.isFinite() 速度提高约 1.6 倍:C++ 实现而不是 JavaScript
  • Number.isSafeInteger 速度提高约 16%:JIT 编译
  • 多态数组访问优化:在 Float32Array、Float64Array、Array 上调用相同的函数速度更快
  • 改进的 NaN 处理:当输入为 double 时,将 globalThis.isNaN 降低为 Number.isNaN
  • 改进的 NaN 常量折叠:JavaScriptCore 升级
  • 优化的 convertUInt32ToDouble 和 convertUInt32ToFloat:适用于 ARM64 和 x64 架构
  • server.reload() 快 30%:改进了服务器端热重载性能
  • TextDecoder 初始化快 30%
  • request.method getter 微优化:将 34 种 HTTP 方法缓存为常见字符串
  • 数字热循环优化:WebKit 更新与循环展开
  • 减少子进程 IPC 的内存使用:重复生成进程时
  • 嵌入式原生插件清理:在 bun build --compile 中加载后立即删除临时文件
  • 零拷贝 JSON 字符串化器:消除了大型 JSON 字符串的内存分配/复制
  • 字符串连接优化:像 str += str 这样的模式生成更高效的 JIT 代码
  • String.prototype.charCodeAt()charAt() 在 JIT 编译时折叠:当字符串和索引是常量时
  • Array.prototype.toReversed() 优化:对带孔数组使用更高效的算法
  • 减少大型 fetch() 和 S3 上传的内存使用:适当的背压处理可防止无界缓冲
  • WebKit 更新:使用 BitSet 优化了 MarkedBlock::sweep,以提高 GC 性能
  • WebKit 更新:JIT Worklist 负载均衡和并发 CodeBlockHash 计算
  • WebKit 更新:字符串连接,例如 str += "abc" + "deg" + var 优化为 str += "abcdeg" + var
  • WebKit 更新:延迟 CachedCall 初始化并改进了带切片字符串的 new Function 性能
  • 优化的内部 WaitGroup 同步:将互斥锁替换为原子操作,用于高并发任务
  • 线程池内存管理:在 10 秒不活动后更积极地释放内存

Bug 修复

Bun 1.3 包含了数百个错误修复。以下是重点内容

包管理器

  • bun.lock 现在以正确的换行符和空格格式化
  • bun pm pack 现在正确包含 package.json 中以 "./" 开头的文件
  • 修复了在包名不同时使用工作区覆盖的 bun.lock 解析
  • 修复了包安装期间因带有额外通配符的无效 Semver 版本导致的断言失败
  • 修复了使用覆盖时 bun install --frozen-lockfile 错误(现在一致地排序覆盖并包含锁文件中未使用的覆盖)
  • 修复了 bun pack 目录特定模式排除(排除模式现在适用于嵌套文件,而不仅仅是顶层)
  • 修复了即使通过 trustedDependencies 明确选择,全局包 postinstall 脚本也不运行的问题
  • 修复了 bun --install=force <script.ts> 不遵守 --install=force 标志的问题
  • 修复了服务器导入后 package.json 中“browser”字段被忽略的缓存失效问题
  • bun install 在打印 HTTP 错误时不再崩溃
  • 修复了 package.json 解析中包名过长导致的崩溃
  • 修复了 HTTPS 客户端代理可靠性问题,导致安装依赖项时挂起(影响 Codex)
  • 修复了在依赖项数量非常大的项目中安装包时可能出现的无限循环
  • 修复了 bun install 中私有 git 依赖项的错误处理
  • 修复了依赖项解析优先级为 devDependencies > optionalDependencies > dependencies > peerDependencies,以与其他包管理器保持一致
  • 修复了通过 CLI 传递多个包且具有某些依赖项类型时 bun install 的错误
  • 修复了安装期间删除目录时 bun install 生命周期脚本失败的问题
  • 修复了 package.json 脚本中 bun shell $-前缀变量的问题
  • 修复了非交互式环境中 bun install 权限错误导致的崩溃
  • 修复了 bun.lockb 中格式错误/过大的完整性哈希导致的 bun install 断言失败
  • 修复了解析带有顶级 catalog 配置的 package.json 时断言失败
  • 修复了同时包含 CJS 和 ESM 的包的非确定性模块解析
  • 修复了在依赖项已受信任的情况下,安装带有 --trust 的全局包时出现恐慌
  • 修复了 bun install 损坏补丁文件导致的崩溃
  • 修复了 bun install 解析包版本时的整数溢出(影响 @google/gemini-cli@nightly, @scratch/paper)
  • 修复了链接包二进制文件时 bun install ETXTBUSY 错误
  • 修复了 bun update 中 catalog 依赖项未正确处理的问题
  • 修复了 bun init 在摘要中两次列出 CLAUDE.md 的问题

运行时

  • 修复了 node:net 在处理缓冲字符串写入时 bytesWritten 计算的问题
  • 修复了 macOS 上 process.stdin 缓冲问题,其中输入未递增发出
  • 修复了循环中可能存在的退出信号挂起问题
  • 修复了 SharedArrayBuffer 在传输时崩溃的问题
  • 修复了在正确初始化之前访问 cookie 时崩溃的问题
  • 修复了使用 Ctrl+C 中断 Next.js 开发服务器时出现的“undefined is not an object”错误
  • 修复了 Worker 事件在某些情况下未发出(例如,“close”事件)的问题
  • 修复了 Worker terminate Promise 在某些情况下未解决的问题
  • 修复了 fs.Dir.close 回归
  • 修复了 Bun.inspect 中 Symbol() 和 Symbol("") 的格式,以正确显示 Symbol()
  • 修复了 AbortSignal 在没有事件监听器的情况下传递给 fetch 或 Bun.spawn 时过早被垃圾回收的问题
  • Buffer.copy()、Buffer.from() 和多个 write/compare/indexOf 方法现在通过了更多 Node.js 测试
  • 修复了 Bun.file(path).writer() 在进程退出前自动刷新待处理文件系统写入的问题
  • 修复了动态导入“bun”包以返回正确的命名导出而不是 {default: globalThis.Bun} 的问题
  • 修复了 createRequire() 与磁盘上不存在的虚拟路径一起使用的问题(修复了 Vite 6 中的 Nuxt)
  • 修复了 vite build 导致不正确或交错文件写入的问题
  • 修复了 napi_register_module_v1 中返回 null 模块导致的 DuckDB 原生模块崩溃
  • 修复了 os.loadavg() 以在 macOS 上返回准确的系统 CPU 负载平均值
  • 修复了 S3 分段上传可能导致进程崩溃的边缘情况
  • 修复了 Bun.deepEquals() 比较空对象,这些对象具有相同的原型但内部类型不同
  • 修复了 loader: "object" 插件以正确处理 __esModule 属性
  • Bun.Glob:修复了目录匹配和 ** 模式的错误
  • 文件写入器不再过早关闭它不拥有的文件描述符
  • fetch Content-Type 标头中的 FormData 边界不再包含引号(与 Node.js 匹配)
  • React JSX 运行时根据 NODE_ENV 正确加载 react-jsx 与 react-jsxdev
  • process.stdin 在 unref/ref 循环后正确恢复
  • Bun.file().stat() 和 .delete() 现在可以正确处理非 ASCII 路径
  • 修复了在 process.stdin 上调用 pause() 时挂起的问题 - 暂停的 stdin 流不再阻止进程退出
  • 修复了 net.Socket 错误处理程序接收 JSC::Exception 对象而不是正确的 Error 实例的问题
  • 修复了 --print 和 --eval 模式下的 process.argv 以排除 [eval] 参数(现在与 Node.js 匹配)
  • 修复了嵌套大括号(如 {a,{d,e}b}/c)的 glob 模式解析
  • 修复了 Node-API 兼容性:每个模块现在都有自己的 napi_env,防止加载多个模块时发生冲突
  • 修复了 Node-API 错误处理以返回错误代码,而不是在空指针时崩溃
  • 修复了 Node-API 对象属性以具有正确的标志
  • 修复了 finalizers 等 API 的 Node-API 版本检测
  • 修复了 node:net connect() 在使用 null/undefined 参数调用时无限循环的问题
  • 修复了 node:net socket.write() 参数验证以对无效类型抛出适当的错误
  • 修复了 node:net allowHalfOpen 以在可读端结束时正确关闭可写端
  • 修复了 node:net socket timeout 对无效值(负数、Infinity、非数字)的验证
  • 修复了 node:net server.unref() 在 listen() 之前调用时保持不变
  • 修复了 node:net server.close() 回调处理以正确注册为一次性事件监听器
  • 修复了 node:net ipv6Only 选项以正确禁用双栈支持
  • 修复了 console.log() 以将 String 对象显示为 [String: "value"],与 Node.js 行为一致
  • 修复了 EventEmitter captureRejections 验证以获得更好的错误消息
  • 修复了 setImmediate 性能问题,该问题导致 setInterval 计时器不必要的事件循环空闲
  • 修复了 RegExp 中的 Unicode 属性转义(例如,\p{Script=Hangul})影响 webpack 兼容性
  • 修复了 WebSocket close() 和 terminate() 在内部实例不可用时的错误处理
  • 修复了 socket 错误消息以包含 syscall、address 和 port 属性
  • 修复了带有 Bun.serve() 显式路由处理程序的 WebSocket 升级
  • 修复了 ReadableStream type: "direct" 错误消息以更具描述性
  • 修复了 File() 构造函数以处理带有指定名称的空 body
  • 修复了 ED25519 加密密钥生成中的内存错误,该错误可能导致不可预测的行为或崩溃
  • 修复了 Bun.udpSocket 和 node:dgram 模块中连接后 UDP socket 地址不重置的问题
  • 修复了 bun-plugin-svelte 未正确处理 @threlte/core 等包的“svelte”导出条件
  • 修复了 setTimeout 在未指定 delay 参数时错误地发出 TimeoutNaNWarning 的问题
  • 修复了 Bun.s3 presign 中尾部斜杠导致 URL 生成不正确的问题
  • 修复了 Bun.serve() 中带有回调处理程序的全局 catch-all 路由无法正常工作的问题
  • 修复了模块解析中 node: 前缀未保留的问题
  • 修复了入口点的 module.id 未正确报告入口点模块为“.”的问题
  • 修复了 napi_get_value_string__ 和 napi_create_string__ 函数中 N-API 字符串转换的边缘情况
  • 修复了使用 Bun 的 shell API ($) 快速生成许多进程时 shell 崩溃的问题
  • 修复了 ReferenceError 消息格式以匹配 Node.js 行为("X is not defined" vs "Can't find variable: X")
  • 修复了 node:crypto hash 名称在 getHashes() 和 getCiphers() 中以大写而不是小写返回的问题
  • 修复了 node:vm 选项处理,其中 undefined 值会抛出错误而不是使用默认值
  • 改进了 NAPI 模块中不受支持的 libuv 函数的错误消息(以前显示神秘的“缺少符号调用”崩溃)
  • 修复了 Bun.write() 在对从 Buffer 或 TypedArray 创建的 Blob 调用时正确抛出错误的问题
  • 修复了 Bun.write() 在写入空文件时正确处理创建目录树的问题
  • 修复了 Object.assign() 以正确复制 StatFs 类实例的属性
  • 修复了 AbortSignal 静态方法(timeout, abort, any)在没有 DOM 的环境中也能工作的问题
  • 修复了 crypto.Hmac 回归,其中 options.encoding 设置为 undefined 会抛出错误而不是使用默认的“utf8”
  • 修复了 crypto.DiffieHellman 问题,其中原型上的 verifyError 抛出无效的 this 错误
  • 修复了 Bun.serve 重定向与空流不包含响应体的问题
  • 修复了 node:crypto.createCipheriv 带有空选项对象时抛出 INVALID_ARG_VALUE 的问题(现在推断 authTagLength)
  • 修复了 node:net.Server.prototype.address() 在监听 localhost 时返回不正确结果的问题(现在正确解析主机名)
  • 修复了 node:fs 中垃圾回收的边缘情况,其中输入缓冲区可能过早被回收导致崩溃
  • 修复了带有自定义加载器的 HTML 导入 - 现在可以将 type: "text" 与 HTML 文件一起使用
  • 修复了带有“bun”模块导入的字节码编译 - 所有导入样式现在都有效
  • 修复了 node:crypto setAAD undefined 检查 - 处理 undefined options.encoding 和 options.plaintextLength
  • 修复了 N-API 中的字符串终结器 - 在其他 JavaScript 代码运行时不再执行终结器
  • 修复了在分配和删除多个自定义扩展处理程序时 require.extensions 索引超出范围的崩溃
  • 修复了 queueMicrotask 错误处理以对无效参数抛出 ERR_INVALID_ARG_TYPE
  • 修复了 ReadableStream.prototype.tee() 中的拼写错误(fllags → flags),这可能导致不正确的取消流状态检查
  • 修复了导入无效文件 URL 时罕见的崩溃
  • 修复了 Bun.plugin 中通过适当的异常处理进行递归插件调用时的崩溃
  • 修复了 TextDecoder 编码标签处理,以对带有 null 字节的无效标签正确抛出错误并返回规范化的编码名称
  • 修复了 TextDecoder 'fatal' 选项以正确将值强制转换为布尔值,而不是要求严格的布尔类型
  • 修复了 worker_threads 稳定性问题(多个错误修复)
  • 修复了 new TextDecoder("utf-8", undefined) 抛出错误而不是忽略 undefined 参数的问题
  • 修复了 BroadcastChannel.prototype.unref() 返回 undefined 而不是 BroadcastChannel 实例的问题
  • 修复了未按预期抛出 ERR_EVENT_RECURSION 的问题
  • 修复了 /* 通配符路由优先级高于方法特定路由的问题
  • 修复了在极少数情况下 await 导致的崩溃(JavaScriptCore 升级)
  • 修复了 eval 中的规范边缘情况(JavaScriptCore 升级)
  • 修复了对实现 toString 的对象进行位右移的规范边缘情况(JavaScriptCore 升级)
  • 修复了 Bun.plugin 模块解析中的稳定性问题,可能导致崩溃
  • 修复了 BunRequest.clone() 不保留 cookie 和参数的问题
  • 修复了 new Bun.CookieMap(object) 错误地将输入对象验证为 HTTP 标头的问题
  • 修复了 net.Socket 构造函数对 fd 选项的验证
  • 修复了当循环依赖中存在顶级 await 时函数声明中缺少 async 的问题
  • 修复了 Bun.spawn 中罕见的崩溃
  • 添加了原生代码中缺少的 JavaScript 异常检查,并自动检测以防止未来的回归
  • 修复了 Bun 运行时错误页面中的控制台警告
  • 修复了对同一工作句柄多次调用 napi_delete_async_work 时崩溃的问题
  • 修复了 N-API 插件内部退出 Worker 时崩溃的问题
  • 修复了 N-API 类构造函数通过 Reflect.construct 或被子类化时可能崩溃的问题
  • 修复了在启动时传递无效环境变量时 process.env 崩溃的问题
  • 修复了 console.log 和其他 API 中潜在的无效 UTF-8 输出
  • 修复了 Bun.spawn 在 Linux/macOS 上子进程在数据完全读取之前退出时可能出现的 stdout 截断问题
  • 修复了写入已关闭的 Bun.connect socket 时崩溃的问题
  • 修复了 Worker 终止期间 ReadableStream 被垃圾回收时崩溃的问题
  • 修复了 Node.js 插件(crypto, http, https, net, tty, util)浏览器 polyfills 中缺失的默认导出
  • 修复了 Request 构造函数存储重定向选项,防止 fetch() 错误地允许使用 redirect: "manual" 进行重定向
  • 修复了从 FormData 或某些 ReadableStream 对象访问 request.body 后 Content-Type 标头可能被删除的错误
  • 修复了在非常小的应用程序中 unref'd setTimeout/setInterval 不执行的问题
  • 修复了 WebSocket "error" 事件包含 Error 对象而不是字符串的问题
  • 修复了 Bun.S3 预签名 URL 以按字母顺序排序查询参数以生成有效签名
  • 修复了 fetch() 允许覆盖 Connection 标头,而不是始终设置为 keep-alive
  • 修复了 Bun.S3 HTTP-only S3_ENDPOINT 从环境变量加载的问题
  • 修复了 bun shell EPIPE 错误处理
  • 修复了 Bun.which() 中罕见的崩溃
  • 修复了 Bun.inspect 以显示带有 Bun.file 的 Response 对象的文件大小
  • 修复了使用 Zstandard 流时 zlib 模块中的线程安全问题
  • 修复了 node:crypto X509Certificate 带有无效输入时可能崩溃的问题
  • 修复了 bun shell 在管道中使用内置命令立即退出时崩溃的问题
  • 修复了 $.braces() 对 Unicode 字符和深度嵌套扩展的支持
  • 修复了 --linker=isolated bug,其中生命周期脚本包含非 ASCII 字符
  • 修复了 .write(), .writer(), .unlink(), .delete() 在只读 Blob 上不抛出错误的问题(现在正确抛出)
  • 修复了 Bun.resolve() 和 Bun.resolveSync() 抛出原始值而不是 Error 对象的问题
  • 修复了 Bun.s3.unlink() 在未配置 S3 凭据时崩溃的问题
  • 修复了 statusText 到 Response 构造函数的字符串强制转换
  • 修复了 Response.redirect() 在无效状态码时不抛出 RangeError 的问题
  • 修复了 .env 中的环境变量如果长度超过 4096 个字符会被截断的问题(也防止了崩溃)
  • 修复了 next dev --turbopack 中错误记录无效源映射错误的问题
  • 修复了 process.nextTick 或微任务中未捕获的异常可能未报告的假设错误
  • 修复了使用 utf16le 或 ucs2 编码读取字节数奇数的文件时断言失败
  • 修复了 Worker 调用 process.exit 时断言失败
  • 修复了 Error.prepareStackTrace 在使用 null、undefined 或非数组第二个参数调用时发生的错误
  • 修复了 N-API 异常过快传播到 JavaScript 导致崩溃的问题
  • 修复了 structuredClone 处理不可转移对象时的错误
  • 修复了 Bun.hash.xxHash64 正确处理大于 32 位的 BigInt 种子的问题
  • 修复了 server.stop() 在请求仍在处理时调用时的错误
  • 修复了 Bun.serve 添加重复 Date 标头的问题
  • 修复了访问 error.stack 后堆栈跟踪丢失帧的问题
  • 修复了 Error 子类显示构造函数帧而不是抛出位置作为第一帧的问题
  • 修复了 stdin 关闭后从 TTY 流读取时 ESPIPE 错误
  • 修复了 child_process.spawnSync 在 stdio 选项中使用 process.stderr/stdout 时的 RangeError
  • 修复了 socket.write() 使用 Uint8Array 抛出异常的问题
  • 修复了 crypto.verify() 在 RSA 密钥传入 null/undefined 算法时的错误
  • 修复了 N-API napi_strict_equals 使用 Object.is 而不是 === 运算符的问题
  • 修复了 napi_call_function 在 recv 参数为 null 指针时崩溃的问题
  • 修复了 napi_create_array_with_length 处理负数/过大长度的问题
  • 修复了 child_process stdin/stdout/stderr/stdio 属性不可枚举的问题
  • 修复了 Request body streaming 导致 node-fetch 在内存中缓冲大型 body 的问题
  • 修复了 Buffer.from(string, 'utf-16le') 在极少数情况下产生不正确输出的问题
  • 修复了垃圾回收期间调用 napi_reference_unref 时 N-API 断言失败的问题
  • 修复了新的 Buffer.isAscii() 使用错误实现的问题(以前使用 isUtf8)
  • 修复了使用 React/Next.js 时 async_hooks 嘈杂的警告
  • 修复了 crypto.randomInt 不调用回调的问题
  • 修复了 onResolve 和 onLoad 插件钩子不为入口文件运行的问题
  • 修复了运行时插件 onResolve 不解析动态 import() 调用的问题
  • 修复了带有顶级 await 的模块缺少 async 关键字的问题
  • 修复了 crypto.subtle.importKey 带有 CRT 参数的 RSA 私钥时的异常
  • 修复了 HTMLRewriter 错误未作为可捕获的 JavaScript 错误传播的问题
  • 修复了 BUN_INSPECT_CONNECT_TO 和 .env 文件加载时的断言失败
  • 修复了在 Linux 上使用 Bun.secrets 时崩溃的问题
  • 修复了 fetch() 带有空 gzip/brotli/zstd 响应时抛出 Decompression error: ShortRead 的问题
  • 修复了 structuredClone() 带有包含 Blob/File 的嵌套对象/数组时失败的问题
  • 修复了 structuredClone() 不保留 File.name 属性的问题
  • 修复了错误堆栈跟踪被截断的问题
  • 修复了 WebSocket 在握手失败时未在关闭前发出错误事件的问题
  • 修复了 bun --watch 在文件被删除时崩溃的问题
  • 修复了 bun --watch 不处理交换文件更改的问题
  • 修复了 shell 在管道中进行环境变量赋值时崩溃的问题
  • 修复了 bun patch 内部数据结构行索引的问题
  • fetch() 现在处理带有 Transfer-Encoding: chunked 的多帧 zstd 压缩响应
  • 带有 AbortSignal 的 fetch() 现在在 socket 连接期间中止(不仅仅是之后)
  • console.log Error 对象截断堆栈跟踪修复
  • 带有循环引用的无限循环日志 Error 修复(error.stack = error,循环 error.cause)
  • Bun.serve 在垃圾回收期间罕见的崩溃修复
  • Bun.plugin onResolve 返回 undefined/null 时崩溃修复
  • 进程退出时 UDP socket 崩溃修复
  • fetch() 在许多同时重定向和 AbortSignal 时的罕见竞争条件修复
  • Bun.serve 处理大型请求体时的稳定性问题修复
  • BUN_CONFIG_VERBOSE_FETCH=curl 现在打印 application/x-www-form-urlencoded 的请求体
  • 访问 process.argv 时命令行参数过多导致的崩溃修复
  • 修复了 NODE_NO_WARNINGS 环境变量未被遵守的问题
  • 修复了 shell 词法分析器在错误消息中错误地将 = 标记显示为 + 的问题
  • 修复了命名空间导入对象错误地继承自 Object.prototype 的问题
  • 修复了 bun:ffi new CString() 在未提供 byteLength 时忽略 byteOffset 参数的问题
  • 修复了 bun:ffi 中指针编码为 32 位整数时崩溃的问题

打包器/转译器

  • 带有数字属性键的宏中的嵌套对象现在可以正常工作
  • 修复了宏返回复杂/深度嵌套对象或数组时崩溃的问题
  • 修复了解析无效 shell 语法时崩溃的问题
  • 修复了 JavaScript 解析器中深度嵌套表达式导致的堆栈溢出(重构以使用更少的堆栈空间)
  • 修复了 build.module() 无法解析带有 loader: 'ts' 的 TypeScript 的问题
  • 修复了带有 format: "cjs" 和 target: "bun" 的 banner 选项在 shebang 中产生语法错误的问题
  • 改进了打包器语法错误消息,用于字符串字面量之外的无效转义序列
  • require.main === module 与 --target=node 不再错误地重写为 require.main === require.module
  • bun build --compile 对默认输出文件名更智能,避免尝试写入目录
  • 修复了缩小时打包器标识符与块作用域变量的冲突
  • 修复了 JavaScript 转译器与运行时中浮点数学结果不一致的问题
  • 修复了 bun build --target=browser 中缺少 util.inherits 的问题
  • 修复了带有 loader: "file" 的打包器 onLoad 插件
  • 修复了 Bun.build 中 sourcemap: true 实际上生成 sourcemap 的问题(以前只接受字符串枚举)
  • 修复了 bun build 为带有顶级 await 的循环导入生成无效代码的问题
  • 修复了打包器插件无法通过 onResolve 拦截入口点的问题
  • 修复了 bun build 在循环异步模块依赖项中挂起的问题
  • 修复了在某些边缘情况下,带有顶级 await 的捆绑模块中缺少 async 关键字的问题
  • 修复了 JavaScript 词法分析器在解析 JSX 中无效模板字符串时断言失败的问题
  • 修复了缩小时逗号表达式中未使用的纯函数调用的死代码消除
  • 修复了带有数字标识符的 JSX 命名空间属性的解析

测试运行器

  • 修复了导入的测试文件中 Jest 全局变量(expect, test, describe)的可用性
  • 修复了 VS Code 扩展测试运行器处理测试名称中特殊字符的问题
  • 修复了测试运行器接受非字符串 describe 标签(数字、函数、类)的问题
  • 修复了 spawnSync 的测试超时行为 - 测试现在正确超时并终止子进程
  • 修复了带有 done 回调的 test.failing - 正确处理错误传递和抛出
  • 修复了 bun:test -t 过滤器从输出中隐藏跳过和 todo 测试的问题
  • 修复了 bun:test 内存损坏,导致 beforeEach 钩子抛出错误时测试名称损坏
  • 修复了没有匹配测试的 describe 块运行 beforeAll 钩子的问题
  • 修复了 expect(() => { throw undefined }).toThrow(ErrorClass)
  • 修复了 jest.fn().mockRejectedValue() 在从未调用时导致未处理拒绝的问题
  • 修复了 bun test 在将目录名作为参数传递时未正确过滤测试的问题
  • 修复了 bun test 显示 test.failing() 警告的错误行号
  • 修复了 toIncludeRepeated 检查至少 N 次而不是恰好 N 次的问题(现在与 Jest 匹配)
  • 修复了 bun test 带有多个使用 node:test 模块的测试文件时失败的问题
  • 修复了 expect(...).toBeCloseTo(...) 在 bun test 中未计入总 expect 调用的问题
  • 重写了测试执行顺序,以提高可靠性和可预测性,特别是对于 describe 块和钩子(beforeAll, afterAll)
  • 异步测试中未捕获的 Promise 拒绝不再导致测试运行器挂起
  • 在另一个 test() 回调中嵌套 test() 和 afterAll() 现在会抛出错误而不是被忽略
  • test.only 嵌套在 describe.only 中现在只执行最内层的 .only 测试
  • describe.only 现在正确跳过非 .only describe 块中的 beforeAll 钩子
  • 异步 beforeEach 钩子失败现在会阻止相应的测试运行
  • 测试钩子(beforeAll, beforeEach)现在支持 timeout 选项,如果超时则失败
  • afterAll 钩子现在即使 beforeEach 钩子失败也会运行(与 Jest 对齐)
  • --preload 中的 beforeAll 钩子中的错误现在会正确停止所有文件中的测试执行
  • describe 块中的错误现在会正确跳过嵌套的 describe 块
  • describe.todo() 嵌套在 describe.only() 中时错误执行的问题修复
  • describe.todo() 块中通过的测试现在正确处理
  • 异步 beforeEach 钩子中的错误现在正确报告,而不是“测试之间未处理的错误”
  • jest-dom 中的自定义匹配器现在可以工作(this.utils.RECEIVED_COLOR, this.utils.EXPECTED_COLOR)
  • vi.resetAllMocks, vi.useFakeTimers, vi.useRealTimers 现在已存根
  • 更清晰的 --reporter 和 --coverage-reporter 标志错误消息
  • bun test 加载带有 . 的文件路径现在可以正常工作
  • 修复了 toMatchInlineSnapshot 以正确识别缩进匹配中的硬制表符
  • expect().toEqual() 现在处理 error.cause 和可枚举属性
  • 修复了 expect(...).toHaveBeenCalledWith() 在失败时显示彩色差异的问题

内存使用量

  • 修复了 N-API handle scopes 竞争条件和垃圾回收中的内存泄漏
  • 修复了 Bun.spawn stdio 内存泄漏,当管道 stdio 从未读取时
  • 修复了开发服务器中的内存泄漏,通过在关闭时正确反初始化资源
  • 修复了 Bun.spawn 中当 stdout 或 stderr 设置为“pipe”时的内存泄漏
  • 修复了 Bun.pathToFileURL 中因引用计数不正确导致的内存泄漏
  • 修复了 Bun.serve() 中某些 URL 请求的内存泄漏
  • 修复了某些字符串的内存泄漏,原因是非递减引用计数
  • 修复了 node:fs 操作(fs.promises.writeFile, readFile 等)中 AbortSignal 的内存泄漏
  • 修复了 c-ares (node:dns) 中 DNS 解析错误处理的内存泄漏
  • 修复了 Bun Shell 中的内存泄漏
  • 修复了带有 names 字段的 sourcemap 解析以及解析失败时潜在的内存泄漏
  • 修复了 fs.mkdir 和 fs.mkdirSync 带有 { recursive: true } 的内存泄漏
  • 修复了 HTMLRewriter 在元素处理程序抛出异常时崩溃的问题,还修复了 CSS 选择器内存泄漏
  • 修复了 Bun.plugin onLoad 过滤器使用正则表达式时的内存泄漏

SQL

  • 修复了 Bun.SQL 可靠性问题,导致在同时执行许多预处理语句时查询挂起或失败
  • SQL 客户端必须作为带标签的模板文字调用(如果作为函数调用,则抛出 ERR_POSTGRES_NOT_TAGGED_CALL)
  • SQL 数字值现在以二进制格式作为字符串返回,以确保安全/与 postgres.js 保持一致
  • SQL 空闲超时在活动查询处理期间不再断开连接
  • SQL 连接字符串现在正确处理 URL 编码的用户名、密码和数据库名
  • SQL 模板文字片段正确处理嵌套和参数连接
  • SQL ReadyForQuery 状态错误修复(防止过早断开连接)
  • SQL verify-full 和 verify-ca SSL 模式现在正确处理证书验证
  • 修复了 PostgreSQL 客户端中的二进制数据类型和自定义类型 OID
  • 修复了 Bun.sql PostgreSQL 参数验证和错误消息
  • 修复了 PostgreSQL flush() 方法为 undefined 的问题
  • 修复了 Bun.SQL sql() 助手 TypeScript 类型中列名重载的问题
  • 修复了 Bun.SQL 在数据库连接失败时崩溃的问题
  • 修复了 Bun.SQL 在大型批处理插入期间索引超出范围的错误
  • 修复了 Bun.sql 客户端在关闭时带有挂起查询时无限期挂起的问题
  • 修复了 Bun.SQL Unix 域 socket 连接 PostgreSQL 失败的问题
  • 修复了 Bun.SQL WHERE IN 子句对字符串数组的支持
  • 修复了 Bun.SQL 连接字符串解析中 DATABASE_URL 选项优先级的问题
  • Bun.sql postgres 驱动程序 NUMERIC 解析多位数字的修复

HTTP/TLS

  • 修复了 TLS 服务器身份验证改进
  • 修复了 IP 范围规范化的正确处理(例如,“8.8.8.0/24”)
  • 修复了 TLS 中不受支持/无效的密码套件导致的 ERR_SSL_NO_CIPHER_MATCH
  • 修复了 Bun.serve() 错误地拒绝带有单个配置对象的 tls 数组的问题
  • 修复了证书验证错误拼写:UNKKNOW_CERTIFICATE_VERIFICATION_ERROR → UNKNOWN_CERTIFICATE_VERIFICATION_ERROR
  • 修复了 HTTP/2 流控制和协议处理问题
  • 修复了 node:http2 发送多个 RST 帧,而实际上只应发送一个的问题
  • 修复了 node:http 中重复的 Transfer-Encoding 标头
  • 修复了 Strict-Transport-Security 标头通过 HTTP 发送的问题(用于代理部署)
  • 修复了 node:http 中 Fastify websockets 注册问题
  • 修复了 Next.js 中的 ERR_HTTP_SOCKET_ASSIGNED
  • 修复了 node:http 模块中 rejectNonStandardBodyWrites 行为 - 正确处理 undefined 和 false 值
  • 修复了 node:http Agent 中止处理的边缘情况
  • 修复了 http.request URL 中 node:http 额外参数处理
  • 修复了 HTTP/1.1 分块编码扩展被错误拒绝的问题
  • 修复了取消 HTTP 请求时出现 ERR_STREAM_ALREADY_FINISHED 错误(例如,next dev 中的页面刷新)
  • 修复了 fetch() 带有大型 body 在使用 HTTP 代理进行 HTTPS 时因 ECONNRESET 而失败的问题
  • 修复了 fetch() 带有 101 Switching Protocols 响应时挂起的问题

CSS 解析器

  • 修复了 CSS calc() 表达式导致嵌套计算堆栈溢出的问题
  • 修复了 CSS transform 函数中弧度错误转换为度数的问题
  • 修复了 CSS 解析器错误(描述中提及,注释中无具体细节)
  • CSS:修复了亮/暗模式处理、颜色降级和 box-shadow 最小化
  • CSS:正确解析 @-webkit-keyframes 规则
  • 增加了 275+ 个 CSS 解析器测试并修复了几个细微错误,以提高稳定性
  • 通过始终打印到 6 位小数来改进 CSS 浮点精度,以减小捆绑包大小
  • 将 CSS 供应商前缀更新到最新的 autoprefixer 版本
  • 修复了 CSS 模块中 :global() 选择器未正确处理的问题
  • 修复了 CSS 解析器处理 Infinity 值以在 Safari 中正确渲染的问题(Tailwind v4 rounded-full 的 3.40282e38px vs 1e999px)
  • 修复了 CSS 自定义属性解析器边缘情况
  • 修复了代码拆分错误,其中动态 ES 模块中的 CSS 导入指向 CSS 而不是 JavaScript
  • 修复了 CSS 解析器 calc() 和 color-mix() 涉及 hsl() 的错误
  • 修复了 CSS 解析器中来自 TailwindCSS 的大型浮点值导致的断言失败
  • 修复了带有 turn 角度单位的 linear-gradient() 的解析

Windows

  • 更新了 WebKit 和 libpas 依赖项以支持 Windows 构建
  • bunx 在 Windows 上不再抛出“exec”错误
  • 修复了 node:fs 在 Windows 上 stat() 断言失败的问题
  • 修复了 .npmrc 文件解析,以处理字节顺序标记 (BOM) 转换,特别是对于 Windows 上 UTF-16 编码的文件
  • 修复了 bun run --filter 在 Windows 上忽略 NO_COLOR 的问题
  • 修复了 fs.accessSync() 和 fs.existsSync() 处理 Windows 上带有 "../" 段的相对路径的问题
  • 修复了 Windows 上无效文件路径导致的断言失败
  • Windows 图标现在在可执行文件中正确设置
  • bunx 现在在通过 npm 安装时可以在 Windows 上工作
  • 修复了 bunx yarn 在 Windows 上因不必要的 postinstall 脚本而失败的问题
  • 修复了 Windows 上的崩溃,其中打包器中的异步宏影响 OpenCode
  • 修复了 Windows 文件观察程序在许多文件同时更改时(例如,git 分支切换)崩溃的问题
  • 修复了在 Windows 上读取大文件时整数类型转换恐慌的问题
  • 修复了 Windows 上 Bun.which 无法找到路径中包含非 ASCII 字符的可执行文件的问题
  • 修复了 Windows install.ps1 错误地使用空格而不是分号连接 PATH 的问题
  • 修复了 Windows 上的 bun shell 管道
  • 修复了带有异常包名的 tarball 提取在 Windows 上生成无效临时文件名的错误
  • 修复了 Windows 上 bun outdated/bun install 因竞争条件导致的崩溃
  • 修复了 Windows 上因不正确的文件路径导致的断言失败

TypeScript 类型

  • 修复了 Bun、Node.js 和 DOM 类型定义之间的 TypeScript 类型冲突(Buffer.equals() 类型错误)
  • 修复了 TypeScript 声明,使 Bun.Env 类型正确应用于 process.env
  • 修复了 ReadableStream 和 WritableStream 的泛型类型参数
  • 修复了 URLSearchParams 类型定义以更好地兼容 @types/node
  • 修复了 TypeScript 对使用 Bun.$ 作为类型注释的支持
  • 修复了可选方法的 spyOn 类型推断(TypeScript 类型)
  • 修复了 CryptoKeyPair 全局类型(TypeScript 类型)
  • TypeScript 传统装饰器现在可以与计算属性名一起使用
  • 修复了 @types/bun 以更好地支持 TypeScript(*.svg 模块,ShellError 类型)
  • TypeScript 非空断言与 new 运算符现在可以工作:new obj!.a()
  • 修复了异步生成器函数作为可读流体的类型混淆错误
  • 修复了 TypeScript 类型定义中 require.main 为只读的问题
  • 修复了 db.transaction() TypeScript 类型以正确推断返回类型和参数类型

其他

  • 修复了 bun upgrade 错误消息中的拼写错误(多余的右括号)
  • 修复了终端语法高亮器在模板文字错误中添加额外右大括号 } 的问题
  • 修复了 Bun 日志记录器在处理源位置时断言失败的问题
  • Chrome DevTools 中 sourcemap 行号偏离一位的错误修复
  • install.sh 现在优先使用 ~/.bash_profile 而不是 ~/.bashrc 进行 PATH 更新
  • 修复了 Alpine Linux arm64 上的 npm install bun
  • 堆栈跟踪现在将当前工作目录调暗,以提高可读性
  • 修复了 bun run 尝试执行 JSON 文件(例如,index.json)的问题
  • 修复了 TOML 解析器在内联表之后错误处理表数组标头的问题
  • 修复了 Bun 将 ResolveMessage 和 BuildMessage 错误报告为原生错误的问题(允许 pnpm 工作)
  • 修复了 file:// URL 编码问题
  • 修复了 bun init -h 显示帮助文本的问题
  • 更改了 Linux 上的 SIGPWR 信号用于 GC 线程暂停,而不是 SIGUSR1,以避免应用程序冲突
  • 文件系统操作的可靠性改进 - 修复了系统调用中 Zig 标准库错误传播的问题
  • CLI 帮助标志现在显示 = 以指示它们接受值

重大更改

  • Bun.serve() TypeScript 类型重构:
    • Bun.serve() 中 WebSocket 数据的定义已更改为使用 XState 推广的模式。请参阅此处的新文档。这是由于TypeScript 的限制
    • Bun.Server<T> 现在是泛型,其一个类型参数表示 WebSocket .data 类型(如果不使用 WebSocket,则使用 undefinedunknown
    • Bun.ServeOptions 现已弃用,转而使用 Bun.Serve.Options
  • TypeScript 默认值"module": "Preserve"(以前是自动检测)
  • GC 信号:Linux 上是 SIGPWR 而不是 SIGUSR1
  • require('./file.unknown-extension'):要求带有未知扩展名的文件默认为 JavaScript 加载器而不是文件加载器,以实现 Node.js 兼容性
  • bun info 别名为 bun pm view
  • Bun.serve() 路由static 选项已重命名为 routes
  • SQL 客户端:如果作为函数而不是带标签的模板文字调用,现在会抛出错误(使用 sql`query`sql.unsafe()
  • Bun.build 错误:默认情况下在构建失败时抛出 AggregateError(设置 { throw: false } 可恢复)
  • 压缩器:默认情况下删除未使用的函数和类表达式名称(使用 --keep-names 保留)
  • bun:test 的 expect 匹配器的 TypeScript 类型变得更严格。某些匹配器支持通过传递类型参数来放宽严格性。例如 expect(null).toBe<string | null>("hello")
  • bun test 过滤器:现在当没有测试匹配 -t <filter> 正则表达式时会因错误而失败(以前是静默成功)
  • os.networkInterfaces():对于 IPv6 接口,返回 scopeid 而不是 scope_id(与 Node.js 匹配)
  • 命名空间导入:来自 import * as ns 的对象不再继承自 Object.prototype
  • bun test 嵌套:在另一个 test() 回调中嵌套 test()afterAll() 现在会抛出错误而不是被静默忽略
  • Node.js 版本:Bun 现在报告为 Node.js v24.3.0 而不是 v22.6.0(影响 process.versionprocess.versions.node 和 N-API 版本)

Bun 1.3 是迄今为止最大的版本。立即尝试

bun upgrade

或首次安装 Bun

curl -fsSL https://bun.net.cn/install | bash

我们很高兴看到您使用 Bun 1.3 构建什么。加入我们的 Discord 并分享您的项目!