Article

包管理器 bun

更新于:2026-07-09

第一章:Bun 概述

1.1 什么是 Bun?

概念名称说明注意事项
Bun 定义Bun 是一个用 Zig 语言编写的 JavaScript 运行时和包管理器,旨在替代 Node.js,提供更快的启动速度、内置工具链和高度兼容 npm 生态的能力。Bun 并非仅是包管理器,而是集运行时、测试工具、打包器、服务器于一体的全栈工具。
开发背景由 Jarred Sumner 于 2022 年首次发布,目标是解决 Node.js 在启动速度、依赖安装效率和现代 Web 开发体验方面的痛点。Bun 仍处于快速迭代阶段(截至 2026 年),部分 API 可能尚未稳定。
核心目标极致性能(尤其是冷启动)、零配置 TypeScript/JSX 支持、无缝兼容现有 npm 包、简化开发工作流。不追求 100% Node.js 兼容,但对主流库(如 Express、React)有良好支持。

1.2 Bun 的核心特性

特性名称说明注意事项
极速包安装使用自研的 bun install 引擎,比 npm/yarn/pnpm 快数倍,支持 .bun 二进制缓存格式。首次安装后生成 bun.lockb(二进制 lockfile),不可人工编辑。
内置运行时原生支持 ES 模块、CommonJS、TypeScript、JSX,无需 Babel 或 tsc 预编译。JSX 默认启用 React 模式;若用于其他框架需配置。
一体化 CLI单一 bun 命令涵盖 initaddruntestservebuild 等功能。减少项目中工具链依赖(如不再需要 webpack、jest 等)。
原生 fetch 与 WebSocket全局提供 fetchWebSocketBuffer 等 Web 标准 API,无需导入。Buffer 是全局对象,行为与 Node.js 兼容。
热重载(--watchbun run --watch 自动监听文件变更并重启脚本。适用于开发服务器或长期运行脚本。
原生测试框架bun test 提供轻量级测试 runner,支持 Jest 风格断言。不支持所有 Jest 功能(如 transformcoverage 需额外配置)。
零依赖打包bun build 可将项目打包为单个可执行 JS 文件,支持 tree-shaking。打包目标目前主要为 Bun 运行时,非浏览器环境。

1.3 Bun 与其他运行时(Node.js、Deno)对比

对比维度BunNode.jsDeno
语言实现Zig(高性能系统语言)C++(V8 + libuv)Rust(Tokio + V8)
启动速度极快(毫秒级)较慢(需加载模块系统)快(但首次运行需下载依赖)
包管理内置 bun add,兼容 npm registry依赖 npm/yarn/pnpm内置,通过 URL 导入(也支持 npm: 前缀)
模块系统ESM + CommonJS(自动转换)CommonJS 为主,ESM 实验性原生 ESM,URL 导入
TypeScript 支持原生,无需编译需 tsc 或 ts-node原生,内置编译器
全局 APIfetchWebSocketBuffer 等 Web 标准require('node:xxx') 或 polyfillfetchWebSocket 原生,无 Buffer(有 Uint8Array
安全模型默认无沙箱(类似 Node.js)无沙箱默认安全(需显式授予权限)
生态兼容高度兼容 npm(>90% 主流包)完整 npm 生态通过 npm: 前缀兼容部分 npm 包
适用场景高性能后端服务、全栈应用、快速原型企业级后端、成熟生态项目安全敏感脚本、现代 ESM 项目

注意事项:

  • Bun 对 Node.js 内置模块(如 fspath)提供兼容层,但部分边缘 API 可能缺失。
  • Deno 的安全模型更严格,适合脚本分发;Bun 更注重开发体验与性能。
  • 在 CI/CD 或 Docker 中使用 Bun 时,建议固定版本以避免兼容性波动。

第二章:安装与环境配置

2.1 安装 Bun(各平台)

平台安装方法命令示例注意事项
macOS (Intel/Apple Silicon)使用官方安装脚本(推荐)curl -fsSL https://bun.sh/install | bash自动检测架构,安装到 ~/.bun/bin;需确保 PATH 包含该路径
Linux (x86_64/aarch64)使用官方安装脚本curl -fsSL https://bun.sh/install | bash依赖 glibc ≥ 2.28;Alpine Linux(musl libc)暂不支持
Windows (WSL2)在 WSL2 的 Ubuntu/Debian 中运行安装脚本curl -fsSL https://bun.sh/install | bash仅支持 WSL2,原生 Windows 尚未正式支持(截至 2026 年)
Windows (PowerShell, 实验性)通过 PowerShell 脚本(社区方案)iwr https://bun.sh/install.ps1 -useb | iex非官方支持,稳定性有限,不推荐生产使用
Docker使用官方镜像docker run -it oven/bun:latest bun --version适用于 CI/CD 或隔离环境;镜像基于 Alpine(但 Bun 二进制为 glibc 编译)
Homebrew (macOS/Linux)通过 brew 安装brew tap oven-sh/bun && brew install bun适合已使用 Homebrew 的用户;更新可能略滞后于官方脚本

通用注意事项:

  • 安装后需重启终端或手动执行 source ~/.bashrc(或对应 shell 配置文件)以生效 PATH。
  • 不建议使用 sudo 安装,Bun 默认安装到用户目录。
  • 若安装失败,可尝试设置代理或使用国内镜像(见 2.3 节)。

2.2 验证安装与版本管理

操作名称操作细节命令示例注意事项
验证是否安装成功检查 bun 命令是否可用并输出版本bun --version应返回类似 “1.1.0” 的版本号
查看详细版本信息显示 Bun、JavaScript 引擎、Zig 编译器等信息bun --help可查看所有子命令及版本元数据
升级 Bun重新运行安装脚本(覆盖安装)curl -fsSL https://bun.sh/install | bash自动替换旧版本;保留全局缓存
降级 Bun手动下载指定版本 tarball 并解压见官网 releases 页面替换 ~/.bun 目录需谨慎操作,避免破坏现有项目依赖
多版本管理(实验性)使用 bun upgrade --version 切换bun upgrade --version canary支持 latestcanary、具体版本号(如 1.0.0
检查兼容性运行诊断命令bun -v && bun eval "console.log(Bun.version)"确保运行时与 CLI 版本一致

注意事项:

  • bun upgrade 是官方推荐的升级方式(Bun ≥1.0 后引入)。
  • 不支持类似 nvm 的自动多版本切换;如需隔离,建议使用 Docker 或 asdf(社区插件)。
  • Canary 版本包含最新特性但可能不稳定,仅用于测试。

2.3 配置全局缓存与镜像源

配置项配置方法示例值注意事项
全局缓存目录通过环境变量 BUN_INSTALL 设置export BUN_INSTALL="$HOME/.cache/bun"默认为 ~/.bun;可自定义以节省主目录空间
npm 镜像源配置 registry 字段(类似 npm)bun config set registry https://registry.npmmirror.com影响 bun add 下载源;支持 .npmrc 文件
使用 .npmrc 文件在项目根目录或用户目录创建 .npmrcregistry=https://registry.npmmirror.comBun 会自动读取该文件中的 registry 配置
清理全局缓存删除缓存目录或使用命令rm -rf ~/.bun/install/cachebun pm clearbun pm clear 为实验性命令,可能随版本变化
禁用二进制锁文件优化强制使用文本 lockfile(不推荐)暂无官方支持bun.lockb 是核心性能优化,不可替换为 package-lock.json
代理配置通过环境变量设置 HTTP 代理export HTTP_PROXY=http://proxy.example.com:8080支持 HTTP_PROXY / HTTPS_PROXY,与 curl 行为一致

注意事项:

  • Bun 的缓存机制高度依赖 ~/.bun/install/cache,清理后首次安装会变慢。
  • 国内用户强烈建议配置淘宝 NPM 镜像(https://registry.npmmirror.com)以加速依赖下载。
  • .npmrc 中的 tokenscope 等配置目前部分支持,私有包需测试兼容性。

第三章:包管理(bun install / add / remove

3.1 初始化项目(bun init

操作名称操作细节命令示例注意事项
交互式初始化启动向导,配置 package.json 字段bun init默认生成最小 package.json;可选 TypeScript、测试框架等
静默初始化(非交互)跳过提问,使用默认值bun init -ybun init --yes适用于自动化脚本;生成字段较少
指定模块类型设置 type"module""commonjs"在交互中选择,或手动编辑 package.jsonBun 默认推荐 "module"(ESM)
生成 tsconfig.json若选择 TypeScript,自动创建配置文件bun init → 选择 TypeScript配置包含 jsx: "preserve"target: "ESNext"
跳过 git 初始化不自动创建 .gitignore 和 git repo目前无法通过参数跳过,需手动删除bun init 会自动运行 git init(若 git 可用)

注意事项:

  • bun init 不会安装依赖,仅生成配置文件。
  • 生成的 .gitignore 包含 node_modules/.bun/*.log 等常见忽略项。
  • 若项目已存在 package.jsonbun init 会报错,需手动编辑。

3.2 安装依赖(bun add

方法名称语法用途代码示例注意事项
安装生产依赖bun add <pkg>添加到 dependenciesbun add lodash自动写入 package.json 并更新 bun.lockb
安装开发依赖bun add -dbun add --dev添加到 devDependenciesbun add -d typescript支持简写 -d
安装可选依赖bun add -obun add --optional添加到 optionalDependenciesbun add -o fsevents仅在支持平台安装(如 macOS)
安装全局依赖bun add -g全局安装 CLI 工具bun add -g http-server全局包位于 ~/.bun/bin,需确保 PATH 包含
安装特定版本bun add <pkg>@<version>指定版本号或标签bun add react@18.2.0bun add react@latest支持语义化版本、tag(如 beta)、Git URL
从 Git 安装bun add <git-url>安装 Git 仓库中的包bun add https://github.com/user/repo.git支持 #branch#commit 等后缀
从本地路径安装bun add file:../my-lib链接本地包bun add file:./packages/utils类似 npm link,但为硬拷贝(非符号链接)
安装并保存精确版本bun add --exact锁定具体版本(无 ^bun add --exact zod默认使用 ^ 前缀,--exact 禁用范围匹配

注意事项:

  • bun add 会自动运行安装(等效于 bun install),无需额外命令。
  • 不支持 --save(默认即保存),也不支持 --no-save
  • 安装速度极快,得益于二进制缓存和并发下载。

3.3 卸载依赖(bun remove

方法名称语法用途代码示例注意事项
卸载生产依赖bun remove <pkg>dependencies 移除bun remove lodash同时从 bun.lockbnode_modules 删除
卸载开发依赖bun remove -ddevDependencies 移除bun remove -d typescript必须指定 -d,否则可能误删生产依赖
卸载全局依赖bun remove -g移除全局 CLI 工具bun remove -g http-server仅删除 ~/.bun/bin 下的可执行文件
批量卸载bun remove pkg1 pkg2一次移除多个包bun remove express cors body-parser支持混合生产/开发包(需分别加 -d

注意事项:

  • bun remove 不会自动清理未引用的传递依赖(transitive deps),需手动运行 bun install 优化。
  • 若包同时存在于 dev 和 prod,需分别用 bun removebun remove -d 移除。
  • 不支持 --no-save 类选项,卸载即更新 package.json

3.4 锁定依赖(bun.lockb 文件说明)

概念名称说明注意事项
bun.lockbBun 使用的二进制格式 lockfile,替代 package-lock.jsonyarn.lock文件不可读、不可编辑;由 Bun 自动生成和维护
作用精确锁定所有依赖(包括嵌套依赖)的版本、完整性哈希、解析地址确保团队成员和 CI 环境安装完全一致的依赖树
生成时机首次 bun addbun install 时自动生成若删除,下次安装会重建
与 npm 兼容性不兼容 npm/yarn/pnpm 的 lockfile;反之亦然项目若需多工具协作,建议统一使用 Bun
完整性校验每个包包含 SHA256 哈希,防止篡改下载时自动验证,失败则中断安装
版本冲突处理自动解析依赖图,避免重复或冲突若出现冲突,Bun 会报错并提示手动干预

注意事项:

  • 必须提交 bun.lockb 到 Git,以保证可重现构建。
  • 不要尝试手动修改或转换该文件。
  • CI 环境中应使用 bun install --frozen-lockfile(若支持)确保锁文件未被更改(截至 2026 年,该选项仍在规划中)。

3.5 使用工作区(Workspaces)

操作名称操作细节配置示例注意事项
启用工作区在根 package.json 中添加 workspaces 字段"workspaces": ["packages/*"]支持 glob 模式(如 packages/**/*
添加子包在工作区目录下运行 bun initcd packages/utils && bun init子包需有独立 package.json
安装工作区依赖在根目录运行 bun installbun install自动链接所有工作区包(软链接行为)
引用工作区包在其他子包中直接 add 包名bun add utils(假设 utils 是子包名)Bun 自动识别为本地工作区依赖,不从 registry 下载
运行工作区脚本使用 bun run -wbun run -w build-w 表示在所有工作区包中运行
过滤运行脚本bun run -w --filterbun run -w --filter "api-*" test支持通配符过滤包名
发布工作区包需手动进入子包目录发布cd packages/utils && npm publishBun 暂无内置 publish 命令

注意事项:

  • 工作区包之间的依赖关系由 Bun 自动解析,无需 npm link
  • 所有工作区共享根目录的 bun.lockb
  • 不支持 Yarn/NPM 的 nohoist 功能(截至 2026 年)。
  • 子包的依赖仍会安装到各自 node_modules(若未提升)。

第四章:脚本运行(bun run

4.1 运行本地脚本

方法名称语法用途代码示例注意事项
运行 JS/TS 脚本bun <file>执行本地 JavaScript/TypeScript 文件bun index.jsbun app.ts自动识别 .js.ts.jsx.tsx 后缀
运行无后缀脚本bun <file>执行无扩展名但含 shebang 的脚本bun my-script文件首行需为 #!/usr/bin/env bun
支持 ESM 模块直接运行import { foo } from "./lib.js"; console.log(foo());Bun 默认启用 ESM;无需 --experimental-modules
支持 CommonJS直接运行const foo = require("./lib.cjs"); console.log(foo());自动转换 require 为 ESM 等效逻辑
启用热重载bun run --watch监听文件变更并自动重启bun run --watch server.ts适用于开发服务器或长期任务
传递脚本参数bun <file> [args...]向脚本传入命令行参数bun script.js --port 3000参数可通过 process.argv 获取

注意事项:

  • 不需要预编译 TypeScript,Bun 内置 transpiler。
  • JSX 默认按 React 处理;若用于其他库(如 Preact),需配置 /** @jsx h */
  • --watch 模式会监听脚本及其直接依赖的文件。

4.2 运行 package.json 中的 scripts

方法名称语法用途代码示例注意事项
运行命名脚本bun run <script>执行 package.json 中定义的脚本bun run dev等效于 npm run dev,但更快
列出所有脚本bun run无参数时列出可用脚本bun run显示 scripts 字段中的所有键
并行运行多个脚本bun run --parallel同时执行多个脚本(实验性)bun run --parallel build:js build:css输出可能交错,适合独立任务
顺序运行脚本bun run <a> && bun run <b>串行执行(shell 方式)bun run clean && bun run build非 Bun 原生功能,依赖 shell
覆盖脚本命令bun run <script> -- <args>向脚本追加参数bun run test -- --watch双横线后内容透传给原始命令
运行带空格的脚本名bun run "my script"支持带空格的脚本键名{"my script": "node x.js"}bun run "my script"需用引号包裹

注意事项:

  • Bun 会优先使用本地 node_modules/.bin 中的 CLI,无需 npx
  • 脚本中可直接使用 buntsc 等命令(若已安装)。
  • 不支持 npm 的 pre/post 钩子(如 predev),需手动组合。

4.3 直接运行远程/URL 脚本

方法名称语法用途代码示例注意事项
运行 HTTPS 脚本bun <url>直接执行远程 JavaScript 文件bun https://example.com/script.js仅支持 HTTPS(不支持 HTTP)
运行 GitHub Gistbun <url>执行公开 Gistbun https://gist.githubusercontent.com/.../raw/.../test.jsURL 需指向原始文件(raw)
缓存远程脚本自动缓存首次下载后缓存至 ~/.bun/cachebun https://cdn.example/lib.js相同 URL 不重复下载
清除远程缓存手动删除缓存目录rm -rf ~/.bun/cache暂无 bun 命令清理远程脚本缓存,缓存按 URL 哈希存储
传递参数给远程脚本bun <url> [args]向远程脚本传参bun https://ex.com/cli.js --help参数通过 process.argv 传递

注意事项:

  • 远程脚本以严格模式运行,无沙箱,存在安全风险,仅用于可信源。
  • 不支持动态 import() 加载远程模块(仅限主入口)。
  • 若 URL 返回非 JS 内容(如 HTML),Bun 会报错。

4.4 环境变量与参数传递

操作名称操作细节示例注意事项
设置环境变量(Linux/macOS)在命令前声明PORT=3000 bun server.js仅对当前命令生效
设置环境变量(Windows PowerShell)$env:PORT="3000"; bun server.js$env:NODE_ENV="production"; bun startPowerShell 语法
.env 文件加载Bun 不内置支持需手动读取或使用第三方库(如 dotenv与 Node.js 行为一致;Bun 无自动加载 .env
读取环境变量process.env.KEYconsole.log(process.env.PORT)全局 process 对象可用
传递命令行参数通过 process.argvbun script.js arg1 arg2process.argv[2] === "arg1"argv[0] 为 bun 路径,argv[1] 为脚本路径
使用 minimist 解析参数需自行引入或使用内置逻辑const args = process.argv.slice(2)Bun 未内置参数解析器,推荐使用 yargs 或自定义
透传参数到子进程在 scripts 中使用 "$@"(shell)"start": "node server.js $@"适用于封装脚本

注意事项:

  • Bun 不自动加载 .env.env.local 等文件,需显式处理。
  • 环境变量在 Windows CMD 中使用 set VAR=value && bun ...
  • 所有脚本共享同一 V8 实例,环境变量修改会影响全局状态。

第五章:Bun 的 JavaScript 运行时

5.1 模块系统支持(ESM、CommonJS)

特性名称说明代码示例注意事项
默认模块系统Bun 默认使用 ESM(ECMAScript Modules)// index.js
import { foo } from "./lib.js";
文件扩展名必须显式写出(如 .js
CommonJS 自动转换require()module.exports 被自动转译为 ESM// lib.cjs
module.exports = { x: 1 };
// index.js
const { x } = require("./lib.cjs");
转换在加载时完成,性能开销极低
混合模块导入ESM 文件可导入 CommonJS 模块import cjs from "./lib.cjs"; console.log(cjs.x);CommonJS 模块作为 default 导出对象
动态 import()支持异步模块加载const mod = await import("./dynamic.js");返回 Promise,符合标准
Node.js 内置模块兼容支持 require("fs")require("path")import fs from "fs";const fs = require("fs");通过 bun:ffi 和内置 polyfill 实现
文件扩展名省略不支持自动补全扩展名import "./lib"; → ✅ import "./lib.js";必须显式指定 .js/.ts/.json 等后缀
JSON 模块导入直接导入 .json 文件import pkg from "./package.json"; console.log(pkg.name);返回解析后的对象,非字符串

注意事项:

  • 不支持 --experimental-modules 标志(Bun 原生启用 ESM)。
  • __dirname__filename 在 ESM 中不可用;需通过 import.meta.url 构造。
  • 循环依赖处理与 Node.js 行为一致,但可能因转译逻辑略有差异。

5.2 内置 API(如 fetchWebSocketBuffer

API 名称语法用途代码示例注意事项
fetchfetch(url, options)发起 HTTP(S) 请求const res = await fetch("https://api.example.com");全局可用,无需 import;基于 Web 标准
WebSocketnew WebSocket(url)创建 WebSocket 客户端const ws = new WebSocket("wss://echo.websocket.org");全局构造函数;事件驱动(onopen, onmessage
BufferBuffer.from(str), Buffer.alloc(size)处理二进制数据const buf = Buffer.from("hello");全局对象,API 与 Node.js 完全兼容
setTimeout / setIntervalsetTimeout(fn, delay)定时器setTimeout(() => console.log("done"), 1000);全局可用,行为同浏览器/Node.js
processprocess.env, process.argv访问环境与参数console.log(process.env.NODE_ENV);提供有限 Node.js process 兼容层
Crypto全局 crypto 对象生成随机值、哈希等const arr = new Uint8Array(16); crypto.getRandomValues(arr);符合 Web Crypto API 标准
TextEncoder / TextDecodernew TextEncoder().encode(str)字符串与 Uint8Array 转换const bytes = new TextEncoder().encode("hello");全局可用,Web 标准

注意事项:

  • 所有 Web 标准 API(fetchWebSocketcrypto)均为原生实现,无 polyfill 开销。
  • 不支持 Node.js 特有模块如 child_processcluster(截至 2026 年)。
  • Buffer 是全局变量,但建议优先使用 Uint8Array 以保持 Web 兼容性。

5.3 TypeScript 原生支持

特性名称说明代码示例注意事项
无需编译直接运行.ts 文件可直接由 bun 执行bun app.ts自动忽略类型注解,保留运行时代码
tsconfig.json 支持读取项目根目录 tsconfig.json{ "compilerOptions": { "target": "ES2022" } }仅部分字段生效(如 jsxpathsbaseUrl
类型检查Bun 不执行类型检查需配合 tsc --noEmit 单独校验运行时不报类型错误
路径映射(paths支持 compilerOptions.paths{ "paths": { "@/*": ["src/*"] } }import "@/utils"需配合 baseUrl 使用
声明文件(.d.ts自动识别同名 .d.ts 文件utils.ts + utils.d.ts → 类型提示仅用于编辑器,不影响运行
JSX 支持默认启用 React JSX 转换const el = <h1>Hello</h1>;需安装 react 包,或配置 jsxFactory

注意事项:

  • Bun 的 TS 解析基于自研引擎,速度远快于 tsc,但不保证 100% 语法兼容。
  • 不支持 emitDecoratorMetadataexperimentalDecorators 等实验性选项。
  • tsconfig.json 不存在,Bun 使用默认配置(target: ESNext, module: ESNEXT)。

5.4 JSX 与宏支持

特性名称说明代码示例注意事项
默认 JSX 转换自动将 JSX 转为 React.createElementconst el = <h1>Hello</h1>;React.createElement("h1", null, "Hello");需在作用域中存在 React 变量
自定义 jsxFactory通过注释或 tsconfig 指定/** @jsx h */ const el = <div />;h("div", null);支持 /* @jsx h *//* @jsxFrag Empty */
Fragment 支持<>...</> 语法const frag = <><span>A</span><span>B</span></>;默认转为 React.Fragment
宏(Macro)支持?macro 后缀导入的文件视为编译时宏import macro from "./build.macro?macro";宏在构建时执行,返回替换 AST 的函数
宏用途代码生成、条件编译、静态分析// build.macro.js
export default function() { return { code: "console.log('built at ' + Date.now())" }; }
宏必须是 ESM 模块,导出 default 函数
JSX 与 TSX.tsx 文件自动启用 JSX// component.tsx
const C = () => <div />;
无需额外配置

注意事项:

  • 宏功能为实验性(截至 2026 年),API 可能变更。
  • 若未引入 React,JSX 会报 ReferenceError;可改用 Preact 并配置 jsxFactory
  • 不支持 Babel 风格的插件系统;宏是 Bun 特有的编译时扩展机制。

第六章:测试(bun test

6.1 编写测试用例

概念名称说明代码示例注意事项
测试文件命名Bun 自动识别 *.test.js*.spec.tsmath.test.jsutils.spec.tsx支持 .js/.ts/.jsx/.tsx 后缀
全局 test 函数使用 test() 定义单个测试test("adds 1 + 1", () => { expect(1 + 1).toBe(2); });无需 import,全局可用
描述性分组使用 describe() 组织测试套件describe("Math", () => { test("add", ...) });支持嵌套 describe
异步测试直接返回 Promise 或使用 async/awaittest("fetches data", async () => { const res = await fetch(...); expect(res.ok).toBe(true); });无需 done 回调
测试仅运行(skip/only)使用 .only.skip 修饰test.only("critical test", ...)test.skip("wip", ...)适用于调试或临时禁用
测试超时设置通过 options.timeout 指定test("slow op", () => {...}, { timeout: 5000 });默认超时 5000ms

注意事项:

  • 不支持 Jest 的 beforeEach/afterAll 等钩子(截至 2026 年)。
  • 所有测试默认并行执行;若需串行,需使用 --serial(见 6.3 节)。
  • 测试文件可直接导入被测模块,无需额外配置。

6.2 断言与 mock

方法名称语法用途代码示例注意事项
expectexpect(value)创建断言对象expect(result).toBe(42);全局可用,无需 import
toBeexpect(a).toBe(b)严格相等(===expect(name).toBe("Alice");适用于原始值
toEqualexpect(a).toEqual(b)深度相等expect(obj).toEqual({ id: 1 });适用于对象/数组
toThrowexpect(fn).toThrow()验证函数抛出异常expect(() => badFn()).toThrow();可传入错误消息或正则
toMatchexpect(str).toMatch(pattern)字符串匹配正则或子串expect(msg).toMatch(/error/);pattern 可为字符串或 RegExp
toBeDefined / toBeNullexpect(x).toBeDefined()验证非 undefined / nullexpect(val).not.toBeNull();常用于 API 返回值检查
Mock 函数创建fn = jest.fn()fn = mock()创建可追踪调用的函数const cb = mock(); doSomething(cb); expect(cb).toHaveBeenCalled();mock() 是 Bun 别名,等效于 jest.fn()
Mock 返回值fn.mockReturnValue(val)设置 mock 函数返回值const fn = mock().mockReturnValue(42);支持链式调用
Mock 实现fn.mockImplementation(fnImpl)自定义 mock 行为fn.mockImplementation((x) => x * 2);可动态改变逻辑
清除 Mock 状态mockClear()重置调用记录beforeEach(() => { fn.mockClear(); });需手动管理(无自动 beforeEach

注意事项:

  • Bun 的断言 API 兼容 Jest 风格,但未实现全部 matcher(如 toHaveBeenCalledWith 简化版)。
  • mock()jest.fn() 是同一函数,保留 Jest 命名以降低迁移成本。
  • 不支持自动 mock(如 Jest 的 automock),需显式创建 mock。

6.3 测试命令与选项

命令/选项语法用途示例注意事项
运行所有测试bun test执行项目中所有匹配的测试文件bun test自动递归查找
运行指定文件bun test <files>仅运行特定测试文件bun test math.test.js支持 glob(如 bun test "src/**/*test.ts"
匹配测试名称bun test -t <pattern>运行名称匹配的测试bun test -t "addition"pattern 为正则子串
串行执行bun test --serial禁用并行,顺序运行测试bun test --serial适用于有状态测试
输出详细日志bun test --verbose显示每个测试结果bun test --verbose默认仅显示失败项
监听模式bun test --watch文件变更时自动重跑测试bun test --watch类似 bun run --watch
指定超时bun test --timeout <ms>设置全局测试超时bun test --timeout 10000覆盖单个测试的 timeout 选项
生成覆盖率(实验性)bun test --coverage输出代码覆盖率报告bun test --coverage截至 2026 年,功能有限,格式为 lcov
过滤文件bun test --exclude <glob>排除特定文件bun test --exclude "e2e/**"支持 glob 模式

注意事项:

  • bun test 不读取 jest.config.js;所有配置通过命令行参数完成。
  • 并行执行是默认行为,可显著提升大型测试套件速度。
  • --watch 模式会监听测试文件及其依赖的源文件。

第七章:Bun 服务器开发(Bun.serve

7.1 创建 HTTP 服务器

方法名称语法用途代码示例注意事项
Bun.serveBun.serve(options)启动高性能 HTTP/HTTPS 服务器const server = Bun.serve({ port: 3000, fetch(req) { return new Response("OK"); } });必须提供 fetch 处理函数
options.portnumber指定监听端口{ port: 8080 }默认为 3000
options.hostnamestring指定绑定主机{ hostname: "127.0.0.1" }默认为 "0.0.0.0"(所有接口)
options.fetch(req: Request) => Response | Promise<Response>处理每个请求fetch(req) { return new Response("Hello"); }核心处理函数,必须返回 Response
HTTPS 支持提供 keycert{ port: 443, key: "...", cert: "..." }需传入 PEM 格式的私钥和证书字符串,不支持 pfx;需自行读取文件
获取服务器信息server.port, server.hostname获取实际绑定地址console.log("Listening on ${server.hostname}:${server.port}");若 port 设为 0,系统分配可用端口
关闭服务器server.stop()停止监听并关闭连接setTimeout(() => server.stop(), 5000);返回 Promise,可 await

注意事项:

  • Bun.serve 是低层级 API,不包含路由、中间件等高级功能(需自行实现或使用框架)。
  • 所有请求均通过单一 fetch 函数处理,类似 Service Worker。
  • 性能极高,单核可处理数万 QPS(基于 Zig 和 epoll/kqueue)。

7.2 路由处理

方法名称说明代码示例注意事项
手动路径匹配使用 req.url 解析路径const url = new URL(req.url); if (url.pathname === "/api/users") { ... }需自行解析查询参数、路径段
方法判断检查 req.methodif (req.method === "POST") { ... }支持 GET、POST、PUT、DELETE 等
参数提取通过路径分割或正则const id = url.pathname.split("/")[3];无内置参数路由(如 /user/:id
JSON 请求体解析await req.json()const data = await req.json();仅可调用一次;后续调用抛错
表单数据解析await req.formData()const form = await req.formData();支持 multipart/form-data
返回 JSON 响应new Response(JSON.stringify(data), { headers: { "Content-Type": "application/json" } })return new Response(JSON.stringify({ ok: true }));需手动设置 Content-Type
错误处理try/catch 包裹逻辑try { ... } catch (e) { return new Response("Error", { status: 500 }); }未捕获异常会导致连接断开

注意事项:

  • Bun 不提供内置路由器;复杂路由建议使用 Elysia、Hono 等轻量框架。
  • req.json() 会消费请求流,不可重复读取。
  • 路径匹配区分大小写(/API/api)。

7.3 静态文件服务

方法名称语法用途代码示例注意事项
Bun.fileBun.file(path)创建文件引用对象const file = Bun.file("./public/index.html");返回 File 对象(Web 标准子类)
返回文件响应new Response(file)直接响应文件内容return new Response(Bun.file("./public/logo.png"));自动设置 Content-Type 和 Content-Length
检查文件是否存在await file.exists()判断文件是否可读if (await file.exists()) { ... } else { return new Response("Not Found", { status: 404 }); }exists() 是 Bun 扩展方法
目录列表(需自实现)fs.readdir + 手动生成 HTML使用 fs 模块读取目录并构建链接列表不推荐生产环境暴露目录结构,Bun 无内置目录浏览功能
静态中间件模式在 fetch 中拦截 /static/*if (url.pathname.startsWith("/static/")) { const filePath = "." + url.pathname; ... }需防止路径遍历(如 /static/../../../etc/passwd
缓存控制设置 Cache-Controlnew Response(file, { headers: { "Cache-Control": "max-age=3600" } })提升 CDN 和浏览器缓存效率

注意事项:

  • Bun.file() 不会立即读取文件,仅在 Response 被发送时流式读取。
  • 必须校验路径合法性,避免安全漏洞(建议使用 path.resolve + prefix 白名单)。
  • 大文件(如视频)可高效流式传输,内存占用低。

7.4 WebSocket 支持

方法名称语法用途代码示例注意事项
升级 WebSocket在 fetch 中返回 upgradeToWebSocket将 HTTP 请求升级为 WebSocketif (url.pathname === "/ws") { return upgradeToWebSocket(...); }必须在 fetch 处理函数中调用
upgradeToWebSocketupgradeToWebSocket(handler, options?)处理 WebSocket 连接return upgradeToWebSocket({ open(ws) { ws.send("hello"); }, message(ws, msg) { ws.send(msg); } });handler 需实现 open/message/close/error
发送消息ws.send(data)向客户端推送数据ws.send("ping");ws.send(new Uint8Array([1,2,3]));支持字符串、ArrayBuffer、TypedArray
广播消息遍历连接池for (const client of clients) client.send("news");需自行维护 WebSocket 实例集合,Bun 不提供内置广播机制
关闭连接ws.close(code?, reason?)主动断开连接ws.close(1000, "Going away");code 遵循 RFC 6455
处理二进制消息message(ws, msg) 中判断类型if (msg instanceof ArrayBuffer) { ... }客户端发送二进制时,msg 为 ArrayBuffer
自定义协议options.protocol响应 Sec-WebSocket-ProtocolupgradeToWebSocket(handler, { protocol: "json" })需与客户端协商一致

注意事项:

  • WebSocket 连接建立后,原 HTTP 请求结束,后续通信通过事件驱动。
  • 每个 WebSocket 实例是轻量级的,Bun 可轻松支持数万并发连接。
  • 不支持 WebSocket 扩展(如 permessage-deflate)。

第八章:性能与调试

8.1 启动速度与内存占用

指标/特性说明对比参考(Node.js)注意事项
冷启动时间执行 bun index.js 的首次启动耗时通常为 Node.js 的 1/5 ~ 1/10(毫秒级)得益于 Zig 编写的运行时和快速模块解析
热启动缓存首次运行后,Bun 缓存字节码至 ~/.bun/cacheNode.js 无内置字节码缓存(需 V8 code cache)缓存显著加速重复运行
内存占用(空进程)启动最小脚本的 RSS 内存~5–10 MB(Node.js 约 20–30 MB)更适合容器化或资源受限环境
依赖安装内存bun install 运行时内存峰值显著低于 npm/yarn(尤其大型项目)因避免 JavaScript 解析器开销
原生 TypeScript 加载无需 tsc 预编译,直接运行 .tsNode.js 需 ts-node(额外解析开销)减少工具链层级,提升开发体验
模块加载机制使用自研解析器,非 V8 ScriptCompilerNode.js 依赖 V8 编译每个模块Bun 的模块图构建更快

注意事项:

  • 性能优势在大型项目(数百依赖)中更为明显。
  • 内存数据基于典型 Linux/macOS 环境;Windows (WSL2) 表现接近。
  • 若使用大量动态 import()eval(),性能增益可能减弱。

8.2 使用 --watch 模式

操作名称操作细节命令示例注意事项
启用文件监听添加 --watch 标志运行脚本bun run --watch server.ts自动监听脚本及其直接依赖的文件
触发重启条件任一被依赖的 .js/.ts/.json 文件变更修改 lib/utils.tsserver.ts 重启仅监听已加载的模块,非整个目录
忽略特定文件暂不支持 .watchignore需通过文件结构隔离官方尚未提供忽略配置(截至 2026 年)
与测试结合监听并重跑测试bun test --watch测试文件或源文件变更时自动重测
输出清理重启时清屏并显示 “Restarting…”控制台自动刷新便于聚焦最新日志
性能影响监听使用系统原生 API(inotify / FSEvents)CPU 占用极低适用于长期开发会话

注意事项:

  • --watch 仅适用于 bun runbun test,不适用于 bun install
  • 不支持监听 node_modules(因 bun.lockb 锁定,通常无需监听)。
  • 若脚本崩溃,watch 模式会停止;需手动重启。

8.3 调试 Bun 应用(日志、inspect)

调试方式语法/操作用途示例注意事项
console.logconsole.log(value)基础日志输出console.log("User ID:", id);支持对象、数组、Error 等格式化
Bun.write (stderr)Bun.write(Bun.stderr, "msg\n")写入标准错误流Bun.write(Bun.stderr, JSON.stringify(err) + "\n");适用于结构化日志
环境变量控制日志process.env.DEBUG自定义日志级别开关if (process.env.DEBUG) console.log("Verbose log");需自行实现逻辑
Inspector(实验性)bun run --inspect[=port] script.js启用 V8 Inspector 兼容协议bun run --inspect=9229 server.ts可连接 Chrome DevTools
断点调试在 DevTools 中设置断点支持行断点、条件断点需启用 --inspect某些 Bun 特有 API(如 Bun.file)可能无法 inspect
堆栈跟踪自动捕获异常堆栈throw new Error("Oops");显示文件、行号、函数名,源码映射(.ts.js)自动处理
性能分析(实验性)bun run --cpuprofile out.cpuprofile script.js生成 CPU 性能剖析文件需配合外部工具(如 speedscope)查看功能尚不稳定,文档有限

注意事项:

  • --inspect 功能仍在完善中,部分 DevTools 功能(如 Memory Snapshot)可能不可用。
  • Bun 不支持 Node.js 的 --trace-warnings--abort-on-uncaught-exception 等标志。
  • 日志输出默认同步,高频率调用可能影响性能;生产环境建议使用异步日志库。

第九章:生态与兼容性

9.1 npm 兼容性

兼容特性说明支持状态注意事项
npm registry 访问可从 https://registry.npmjs.org 下载包✅ 完全支持默认源;可替换为私有源或镜像
package.json 字段读取 dependencies、devDependencies、scripts 等✅ 基本支持忽略 publishConfigengines(部分)等字段
bin 脚本安装自动链接 CLI 工具到 node_modules/.bin✅ 支持bun run 可直接调用,无需 npx
peerDependencies安装时解析并警告缺失⚠️ 部分支持不自动安装,需手动满足
optionalDependencies按平台选择性安装✅ 支持fsevents 仅在 macOS 安装
workspaces支持根 package.json 中的 workspaces 字段✅ 支持(见 3.5 节)使用 glob 模式匹配子包目录
.npmrc 配置读取 registry、token、scope 等✅ 支持支持用户目录和项目根目录的 .npmrc
shrinkwrap / lockfile使用 bun.lockb 替代 package-lock.json❌ 不兼容无法与 npm/yarn 共享 lockfile
npm scripts 生命周期pre/post 脚本钩子(如 prepublish❌ 不支持需手动组合脚本

注意事项:

  • Bun 的目标是”足够兼容”,而非 100% 兼容 npm 行为。
  • 若项目依赖 yarn/npm 特有功能(如 resolutions、nohoist),需重构。
  • 私有 npm 包(需认证)可通过 .npmrc 中的 _authToken 正常工作。

9.2 支持的 Node.js 内置模块

模块名称支持状态说明注意事项
fs✅ 部分支持提供 readFilewriteFilereaddir 等 Promise API不支持 sync 方法(如 readFileSync);无 watch
path✅ 完全支持joinresolvedirnameextname行为与 Node.js 一致
os✅ 部分支持homedir()platform()arch()缺少 loadavgnetworkInterfaces
events✅ 完全支持EventEmitter可用于自定义事件系统
stream⚠️ 有限支持基础 Readable/Writable不推荐用于高性能流处理
http / https❌ 不支持请使用 Bun.serveNode.js http.createServer 无法运行
child_process❌ 不支持spawnexec无法调用外部进程(截至 2026 年)
crypto✅ 部分支持createHashrandomBytes基于 Web Crypto,非完整 Node.js crypto
buffer✅ 完全支持Buffer 全局对象API 与 Node.js 兼容
util⚠️ 部分支持inspectpromisify(实验性)多数工具函数缺失
module❌ 不支持require.resolve模块解析由 Bun 内部处理

注意事项:

  • 所有支持的模块均可通过 import fs from "fs"require("fs") 使用。
  • 不支持的模块在导入时会抛出 Cannot find module 错误。
  • 建议优先使用 Web 标准 API(如 fetch 代替 http)。

9.3 第三方库兼容情况

库类别代表库兼容性说明注意事项
Web 框架Express, Koa, Fastify⚠️ 部分兼容可运行,但性能低于原生 Bun.serve依赖 http 模块,Bun 提供兼容层
现代框架Elysia, Hono, Polka✅ 推荐使用专为 Bun/现代运行时设计性能最佳,API 简洁
React 生态React, ReactDOM✅ 完全支持JSX、hooks、SSR 均正常需安装 react 包
构建工具Vite, esbuild✅ 支持可作为开发服务器或构建器Bun 可替代部分构建步骤
数据库驱动Prisma, Drizzle ORM✅ 支持通过 Bun 的 fetch/fs 运行Prisma 需启用 --experimental-engine
测试库Jest, Vitest⚠️ 有限支持建议改用 bun testJest 配置复杂,Vitest 更兼容
工具库Lodash, Zod, Day.js✅ 完全支持纯 JavaScript,无 Node 特性依赖可安全使用
文件处理Sharp, FFmpeg.wasm❌ 不支持依赖 native addon 或 child_process需寻找 WebAssembly 替代方案
WebSocket 库Socket.IO⚠️ 部分兼容可运行,但建议直接用 Bun 内置 WebSocket性能开销较大

注意事项:

  • 兼容性基于纯 ESM/CJS + 无 native addon + 无 child_process 原则。
  • 可通过 Bun 官方兼容性仪表盘查询具体包状态。
  • 若库使用 process.bindingeval('require') 等动态技巧,可能失败。

第十章:高级用法与未来方向

10.1 自定义加载器(Loader)

概念名称说明代码示例注意事项
Loader 作用控制如何解析特定扩展名的文件(如 .yaml.png.yaml 文件转为 JS 对象类似 Webpack loader,但运行于 Bun 加载时
配置方式通过 --loader 命令行参数指定bun run --loader .yaml=./yaml-loader.js app.ts每个扩展名对应一个 loader 模块
Loader 模块格式ESM 模块,导出默认函数// yaml-loader.js
export default (code, options) => { return "export default " + JSON.stringify(yaml.parse(code)) + ";" }
接收文件源码字符串,返回 JS 代码字符串
支持的钩子transform(无 resolve、emit 等)返回合法 JavaScript 代码即可不支持异步 loader(截至 2026 年)
内置 Loader.js/.ts/.jsx/.tsx/.json 已内置无需配置自定义 loader 仅用于非标准扩展名
错误处理抛出异常将终止加载throw new Error("Invalid YAML");错误会显示在控制台并中断执行

注意事项:

  • Loader 必须是同步函数;不支持 await。
  • Loader 仅影响 bun runbun test,不影响 bun install
  • 不支持链式 loader(如 .vue → template + script + style)。

10.2 插件系统(实验性)

特性名称说明代码示例注意事项
插件目的扩展 Bun 构建或运行时行为(如 CSS 处理、宏替换)bun build 中注入 CSS 提取逻辑目前仅用于 bun build,非运行时
插件结构对象含 setup 函数const cssPlugin = { setup(build) { build.onLoad({ filter: /\.css$/, args => ({ contents: "..." }) }); } };借鉴 esbuild 插件 API
注册插件通过 bun build --plugin ./my-plugin.jsbun build --plugin ./css.js entry.ts插件路径必须为本地文件
onLoad 钩子拦截文件加载并返回内容build.onLoad({ filter: /\.txt$/, ({ path }) => ({ contents: "export default " + JSON.stringify(path) }) });filter 为正则字符串(如 "\.css$"
onResolve 钩子自定义模块解析逻辑build.onResolve({ filter: /^mylib$/, () => ({ path: "./custom-mylib.js" }) });可重定向导入路径
插件状态实验性(截至 2026 年)API 可能变更不建议用于生产关键路径

注意事项:

  • 插件系统主要用于 bun build,对 bun run 无效。
  • 插件必须是 ESM 模块,且导出 plugin 对象。
  • 不支持热重载插件;修改后需重启构建。

10.3 Bun 的构建工具(bun build

方法名称语法用途代码示例注意事项
基本打包bun build <entry>将入口文件及其依赖打包为单文件bun build src/index.ts --outfile dist/app.js默认输出为 ESM
输出格式--format [esm | iife | cjs]指定输出模块格式bun build --format iife app.tsiife 适用于浏览器直接引入
最小化--minify启用代码压缩bun build --minify app.ts包含变量名缩短、死代码消除
目标环境--target [browser | bun | node]设置运行时目标bun build --target browser app.ts影响 polyfill 和 API 使用
外部依赖--external <pkg>排除特定包(不打包)bun build --external react app.ts适用于 CDN 引入的库
生成 sourcemap--sourcemap输出 .js.map 文件bun build --sourcemap app.ts支持 inline 或 external
启用插件--plugin <file>加载自定义插件(见 10.2)bun build --plugin ./css.js app.ts插件可处理非 JS 资源
打包为可执行文件--compile实验性:生成独立二进制bun build --compile app.ts -o myapp仅支持 Bun 运行时目标

注意事项:

  • bun build 不支持 code splitting(截至 2026 年)。
  • 不处理 CSS/图片等资源(需通过插件实现)。
  • 构建速度极快(通常 <100ms),适合开发期快速迭代。
  • --compile 生成的二进制仍依赖系统 glibc,非完全静态链接。