Skip to main content
Bun 每天都在向实现 100% 的 Node.js API 兼容性迈进。Next.js、Express 等热门框架,以及数百万个面向 Node.js 的 npm 包,都可以在 Bun 中运行。为确保兼容性,我们会在每次发布 Bun 之前,运行 Node.js 测试套件中的数千项测试。 如果某个包在 Node.js 中可以运行,但在 Bun 中无法运行,我们会将其视为 Bun 的 bug。 提交问题,我们会修复它。 我们会定期更新此页面。它反映了 Bun 与 Node.js v26 兼容性的最新状态。

内置 Node.js 模块

node:assert

🟢 完全实现。旧版模式的 deepEqual 使用 Bun.deepEquals 语义,而不是 Node 的宽松 == 比较,并且函数值或 printf 风格的 message 参数不会进行格式化。

node:buffer

🟢 完全实现。单个 Buffer 的上限为 4 GiB(buffer.constants.MAX_LENGTH 为 2**32)。

node:console

🟢 完全实现。Bun 会直接将控制台输出写入 stdout/stderr 文件描述符,并使用自己的检查器进行格式化。因此,替换 process.stdout.write 无法捕获输出,并且对象布局与 util.inspect 不同。console.trace() 会写入 stdout,而 console.time*() 会写入 stderr。

node:dgram

🟢 完全实现。Node.js 测试套件通过率为 99%。addMembership() 不会隐式绑定未绑定的套接字;请先调用 bind()。

node:diagnostics_channel

🟡 已实现 channel()、subscribe()、tracingChannel() 以及 http 客户端、http2 和 dgram 内置通道。缺少 boundedChannel() 以及 http.server.*、net、module、console、child_process 和 worker_threads 内置通道。订阅者不会使 Channel 保持存活,因此请保留对它的引用。

node:dns

🟢 完全实现。缺少 resolveTlsa。Bun 会忽略 Resolver 的 maxTimeout 选项。

node:events

🟢 完全实现。Node.js 测试套件通过率为 95%。EventEmitterAsyncResource 底层使用 AsyncResource,因此其 asyncId 始终为 0。

node:fs

🟢 完全实现。Node.js 测试套件通过率为 98%。Stats 对象缺少 Temporal.Instant getter(atimeInstant 等)。

node:http

🟢 完全实现。http.Server 不会继承 net.Server。Bun 会忽略 listen(handle) 以及 listen() 的 fd、ipv6Only 和 signal 选项。服务器上的 keepAlive/keepAliveInitialDelay 不执行任何操作。

node:https

🟡 已实现 request、get、Agent 和 globalAgent,包括连接池。客户端套接字是 tls.TLSSocket。https.Server 是带有 TLS 选项的 http.Server,而不是 tls.Server。其请求套接字(req.socket)不是 tls.TLSSocket:encrypted、authorized 和 servername 可用,但缺少 getPeerCertificate() 和 getCipher()。不支持 setSecureContext()、addContext()、SNICallback 和 handshakeTimeout。

node:os

🟢 完全实现。userInfo() 从环境变量(USER、SHELL、HOME)中读取 username、shell 和 homedir,而不是从 passwd 数据库读取。在 Linux arm64 上,machine() 返回 "arm64" 而不是 "aarch64"。

node:path

🟢 完全实现。matchesGlob() 使用 Bun.Glob 语义,而不是 minimatch(* 会匹配点文件,不支持 extglobs)。在涉及设备路径和保留名称的少数边缘情况下,path.win32 与 Node 有所不同。

node:punycode

🟢 完全实现。Node.js 测试套件 100% 通过。已被 Node.js 弃用。

node:querystring

🟢 完全实现。Node.js 测试套件 100% 通过。

node:readline

🟢 完全实现。

node:stream

🟢 完全实现。isReadable、isWritable、isErrored 和 Readable.isDisturbed 只理解 Node.js 流,不理解 web 流。

node:string_decoder

🟢 完全实现。Node.js 测试套件 100% 通过。end() 不接受字符串参数。

node:timers

🟢 完全实现。导出的函数与全局函数相同。node:timers/promises(包括 scheduler.wait() 和 scheduler.yield())也已实现。

node:tty

🟢 完全实现。ReadStream 和 WriteStream 继承的是 fs 流,而不是 net.Socket;在非 TTY fd 上构造它们时,会返回 isTTY 设置为 false 的流,而不是抛出异常。

node:url

🟢 完全实现。

node:zlib

🟢 完全实现。Node.js 测试套件通过率为 98%。

node:async_hooks

🟡 已实现 AsyncLocalStorage 和 AsyncResource。createHook、executionAsyncId、triggerAsyncId 和 executionAsyncResource 是存根:除了 process.nextTick 的 init 事件之外,Bun 不会调用钩子,并且异步 ID 始终为 0。Node.js 强烈不建议使用这些 API,建议改用 AsyncLocalStorage。Bun 不会将 AsyncLocalStorage 上下文传播到 MessagePort、BroadcastChannel 或 Worker 事件中。

node:child_process

🟡 IPC 可以发送 net.Socket、net.Server 和 dgram.Socket 句柄(包括向 Node.js 进程发送和从 Node.js 进程接收),但不能发送 http 服务器套接字。serialization: "advanced" 仅适用于 Bun 进程之间,因此 Node.js 与 Bun 之间的 IPC 请使用 JSON 序列化。缺少 subprocess.channel.ref()/unref()。无法将某个子进程的 stdout/stderr 作为另一个子进程的 stdio 传入,并且 spawnSync 不会在 output 中返回额外的 stdio 管道。

node:cluster

🟡 worker 中的 net 和 dgram 服务器会像 Node.js 中一样通过 primary 共享(SCHED_RR 和 SCHED_NONE),并且可以通过 worker.send() 传递句柄。worker 中的 node:http/node:https 服务器会分别绑定自己的套接字,因此只有在 Linux 上(通过 SO_REUSEPORT)才支持跨进程对 HTTP 请求进行负载均衡。除此之外已实现,但尚未经过充分测试。

node:crypto

🟡 缺少 encapsulate/decapsulate(可以通过 crypto.subtle 使用 ML-KEM 密钥)。已实现 argon2() 和 argon2Sync()。自定义引擎(setEngine())会抛出异常,setFips() 不执行任何操作,而 secureHeapUsed() 返回 undefined。Bun 的加密功能基于 BoringSSL,后者不支持 ed448、x448、rsa-pss、dsa、dh 和 ml-kem-512 密钥类型;除 P-224/256/384/521 之外的 EC 曲线(不支持 secp256k1);以及 CCM、OCB、XTS 和 chacha20-poly1305 密码算法。DiffieHellman 类(createDiffieHellman()、getDiffieHellman())可用。

node:domain

🟡 缺少 Domain members。domain 只会捕获在 run()/bind() 内同步抛出的错误,或传递给 add() 的事件发射器发出的错误。Bun 不会将来自计时器、process.nextTick、promise 和其他异步回调的错误路由到 domain。

node:http2

🟢 客户端和服务器均已实现。Node.js 测试套件通过率为 94%。maxDeflateDynamicTableSize、peerMaxConcurrentStreams 和 streamResetBurst/streamResetRate 选项会被接受但忽略。

node:module

🟡 缺少 Module#load()、registerHooks、findPackageJSON、stripTypeScriptTypes、getSourceMapsSupport/setSourceMapsSupport。支持覆盖 require.cache、require.extensions 和 module._resolveFilename。syncBuiltinESMExports、module._load、module._pathCache 和 module.register 不执行任何操作(我们建议改用 Bun.plugin)。findSourceMap 始终返回 undefined。

node:net

🟢 完全实现,包括 BlockList、SocketAddress、autoSelectFamily、Unix 域套接字和 server.listen({ fd })。new net.Socket({ fd }) 无法从现有文件描述符读取(只能进行只写封装)。server.listen(handle) 只接受 { fd }。缺少 blockList.toJSON()/fromJSON()。

node:perf_hooks

🟡 已实现 monitorEventLoopDelay()、createHistogram()、timerify() 和 PerformanceObserver(mark、measure、function、net、http 和 http2 条目)。Bun 永远不会发出 gc、dns 或 resource 条目。eventLoopUtilization() 始终返回零,而 performance.nodeTiming 包含占位值。只有导入 node:perf_hooks 后,全局 performance 对象才会出现 Node 专属的扩展。

node:process

🟡 参见 process 全局变量部分。

node:sys

🟢 参见 node:util。

node:tls

🟡 缺少 pskCallback、OCSP 装订(requestOCSP)、服务器的 'newSession'/'resumeSession' 事件以及会话票据密钥(ticketKeys 会被忽略)。因此,跨进程的会话恢复无法使用。Bun 使用 BoringSSL,因此 tlsSocket.renegotiate() 始终会失败,而 getEphemeralKeyInfo()/getSharedSigalgs() 不会返回任何信息。

node:util

🟢 完全实现。缺少 diff(在 Node.js 中为实验性功能)、transferableAbortSignal 和 transferableAbortController。debuglog() 会忽略其 callback 参数,且返回的函数没有 enabled 属性。

node:v8

🟡 已实现 writeHeapSnapshot、getHeapSnapshot、getHeapStatistics、getHeapSpaceStatistics、GCProfiler 和 startupSnapshot。堆统计信息描述的是 JavaScriptCore 的单个堆,并且 setFlagsFromString 会忽略传入的标志。serialize 和 deserialize 使用 JavaScriptCore 的线格式,而不是 V8 的格式。缺少 queryObjects、startCpuProfile、startHeapProfile、Serializer/Deserializer、takeCoverage/stopCoverage 和 promiseHooks。如需性能分析,请改用 bun:jsc。

node:vm

🟢 完全实现,包括 vm.Script、vm.createContext、vm.runInContext、vm.runInNewContext、vm.runInThisContext、vm.compileFunction、vm.isContext、ES 模块类 vm.Module、vm.SourceTextModule 和 vm.SyntheticModule(无需 --experimental-vm-modules 即可导出),以及对 importModuleDynamically 的支持。支持 timeout、breakOnSigint、cachedData、microtaskMode 和 codeGeneration 选项。如果 importModuleDynamically 回调返回一个解析为 vm.Module 的 promise,import() 会解析为模块对象,而不是其命名空间。vm.measureMemory() 会报告每个上下文的整个堆数据。

node:wasi

🟡 部分实现。WASI 支持 args、env、preopens、wasiImport 和 start(),并且 bun ./program.wasm 可以直接运行 WASI 命令。缺少 getImportObject()(请使用 wasiImport)、initialize() 和 sock_accept 导入项。Bun 会忽略 version、returnOnExit、stdin、stdout 和 stderr 选项,因此 proc_exit 会退出 Bun 进程。

node:worker_threads

🟡 Worker 会忽略 resourceLimits 和 trackUnmanagedFds 选项。部分 execArgv 标志会在 worker 中生效,例如 --no-addons、--stack-trace-limit 和 --tls-min-v1.3。其他标志,例如 --conditions 和 --no-deprecation,只会设置 process.execArgv。worker.performance.eventLoopUtilization() 是存根。缺少 moveMessagePortToContext 和 locks。

node:inspector

🟡 部分实现。Session 支持 Profiler 域(包括精确覆盖率)、Runtime.enable 和 NodeTracing,可通过 node:inspector 和 node:inspector/promises 使用。调用 open() 后,Session 还会将 Debugger.enable 和 Debugger.setBreakpointByUrl 等 Debugger 配置命令转发到检查器服务器。不会返回诸如 breakpointId 之类的结果。其他 Session 命令(例如 Runtime.evaluate)和 HeapProfiler 域尚未实现。open()、url()、close() 和 waitForDebugger() 均已实现。open() 会提供 Debugger 和 Runtime 域,并且在 worker 中会抛出异常。缺少 Network。

node:repl

🟡 大部分已实现。bun --interactive 会启动兼容 Node.js 的 REPL。REPL 不会显示结果预览(这需要基于 V8 检查器的无副作用求值)。Tab 自动补全会跳过 let/const/class 绑定,并且部分 V8 专属错误消息和堆栈帧措辞有所不同。

node:sqlite

🟢 完全实现。backup() 同步运行,并会在复制期间阻塞事件循环(Node 会在 worker 线程中运行它)。Buffer/Uint8Array 数据库路径必须是有效的 UTF-8(Node 会原样传递原始字节;Bun 会对非 UTF-8 路径抛出 ERR_INVALID_ARG_VALUE)。在 macOS 上,Bun 使用系统的 libsqlite3.dylib。loadExtension() 需要完整的 SQLite 构建版本,较旧 macOS 版本上的 createSession()/applyChangeset() 也需要该版本。如需使用完整的 SQLite 构建版本,请在打开数据库前调用 require("bun:sqlite").Database.setCustomSQLite(path)。

node:test

🟡 部分实现。在测试文件通过 bun test 运行时,进程内 API 可用:tests、suites、subtests、hooks、t.plan()、t.assert、assert.register()、t.waitFor()、getTestContext()、expectFailure 和 t.mock(函数/方法/getter/setter/属性 mock 和 mock 计时器)。run() 需要显式的 files 列表,并会在 bun test 子进程中运行每个文件。其大多数选项(globPatterns、watch、coverage、shard、only、testNamePatterns 等)都会抛出 ERR_NOT_IMPLEMENTED。缺少 node:test/reporters、快照测试、mock.module()、t.runOnly()、代码覆盖率、--test-only、测试级别的 signal 中止功能,以及 Node 的 --test CLI 运行模式。虽然接受 test.only()/{only: true},但不会据此筛选测试。concurrency 会经过验证,但 subtests 始终串行运行。请改用 bun:test。

node:trace_events

🟢 完全实现。支持 createTracing()、getEnabledCategories() 以及 --trace-events-enabled、--trace-event-categories 和 --trace-event-file-pattern 标志。Bun 会在退出时写入跟踪数据。部分类别记录的信息少于 Node.js。例如,node.async_hooks 只记录计时器,而 v8 类别仅为占位项,因为 JavaScriptCore 没有 V8 GC 或编译事件。

node:quic

🟢 已实现:listen()、connect()、QuicEndpoint、QuicSession 和 QuicStream。Node.js 测试套件通过率为 99%。该 API 在 Node.js 中属于实验性功能,在 Bun 中导入它也会发出 ExperimentalWarning。

node:sea

🔴 未实现。请改用 bun build --compile 构建单文件可执行程序。

Node.js 全局变量

以下列表涵盖 Node.js 实现的全局变量,以及 Bun 对每一项的兼容状态。

AbortController

🟢 完全实现。

AbortSignal

🟢 完全实现。

Blob

🟢 完全实现。构造函数的 endings 选项会被忽略,并且 blob.stream() 不支持 BYOB reader。

Buffer

🟢 完全实现。单个 Buffer 的上限为 4 GiB(buffer.constants.MAX_LENGTH 为 2**32)。

ByteLengthQueuingStrategy

🟢 完全实现。

__dirname

🟢 完全实现。

__filename

🟢 完全实现。

atob()

🟢 完全实现。

Atomics

🟢 完全实现。

BroadcastChannel

🟢 完全实现。

btoa()

🟢 完全实现。

clearImmediate()

🟢 完全实现。

clearInterval()

🟢 完全实现。

clearTimeout()

🟢 完全实现。

CloseEvent

🟢 完全实现。

CompressionStream

🟢 完全实现。

console

🟢 完全实现。关于输出写入方式的差异,请参阅 node:console。

CountQueuingStrategy

🟢 完全实现。

Crypto

🟢 完全实现。

SubtleCrypto (crypto)

🟢 完全实现。Bun 不支持的算法请参阅 SubtleCrypto。

CryptoKey

🟢 完全实现。

CustomEvent

🟢 完全实现。

DecompressionStream

🟢 完全实现。

ErrorEvent

🟢 完全实现。

Event

🟢 完全实现。

EventTarget

🟢 完全实现。

exports

🟢 完全实现。

fetch

🟢 完全实现。integrity 选项会被忽略。

File

🟢 完全实现。File 对象会将 Blob 报告为其 constructor 和 Symbol.toStringTag。

FormData

🟢 完全实现。

global

🟢 已实现。global 是一个包含全局命名空间中所有对象的对象。它很少会被直接引用,因为其中的内容无需前缀即可使用,例如使用 console 而不是 global.console。

globalThis

🟢 是指向 global 的别名。

Headers

🟢 完全实现。

MessageChannel

🟢 完全实现。

MessageEvent

🟢 完全实现。

MessagePort

🟢 完全实现。Node.js 添加的 EventEmitter 风格方法(on()、once()、off() 等)只有在加载 node:worker_threads 后才会安装。

module

🟢 完全实现。缺少 module.isPreloading。 🟡 已实现 userAgent、platform 和 hardwareConcurrency。缺少 language、languages 和 locks。Navigator 类不是全局变量。

PerformanceEntry

🟢 完全实现。

PerformanceMark

🟢 完全实现。

PerformanceMeasure

🟢 完全实现。

PerformanceObserver

🟡 可以观察 mark 和 measure 条目。Bun 只会将 Node 专属条目类型(function、http、net 等)传递给 node:perf_hooks 的 PerformanceObserver,并且永远不会发出 gc、dns 或 resource 条目。

PerformanceObserverEntryList

🟢 完全实现。

PerformanceResourceTiming

🟡 该类存在,但永远不会创建条目:fetch() 不会记录资源计时信息,并且 performance.markResourceTiming() 不执行任何操作。

performance

🟡 已实现 now()、timeOrigin、mark()、measure() 和 getEntries()。只有加载 node:perf_hooks 后,Node.js 扩展项(eventLoopUtilization()、nodeTiming、timerify())才会存在。eventLoopUtilization() 始终返回零,而 nodeTiming 包含占位值。

process

🟡 大部分已实现。process.binding(某些包所依赖的 Node.js 内部绑定)部分实现:可用项包括 buffer、config、constants、crypto/x509、fs、http_parser、natives、tty_wrap、util 和 uv,其余项会抛出异常。在 macOS 和 Linux 上设置 process.title 不执行任何操作。getActiveResourcesInfo()、_getActiveHandles() 和 _getActiveRequests() 始终返回空数组,setSourceMapsEnabled() 不执行任何操作,并且 process.report.writeReport() 不会写入任何内容。缺少 sourceMapsEnabled 和 addUncaughtExceptionCaptureCallback。

queueMicrotask()

🟢 完全实现。

QuotaExceededError

🔴 未实现。

ReadableByteStreamController

🟢 完全实现。

ReadableStream

🟢 完全实现。无法通过 postMessage() 或 structuredClone() 传输流。

ReadableStreamBYOBReader

🟢 完全实现。

ReadableStreamBYOBRequest

🟢 完全实现。

ReadableStreamDefaultController

🟢 完全实现。

ReadableStreamDefaultReader

🟢 完全实现。

require()

🟢 完全实现,包括 require.main、require.cache、require.resolve。

Response

🟢 完全实现。由字符串构造的 Response 不会在 headers 中公开默认的 content-type 标头(Bun.serve() 仍会发送该标头)。

Request

🟡 缺少 keepalive 和 duplex。credentials、integrity、referrer 和 referrerPolicy 选项会被接受但忽略。

setImmediate()

🟢 完全实现。

setInterval()

🟢 完全实现。

setTimeout()

🟢 完全实现。

structuredClone()

🟢 完全实现。只有 ArrayBuffer 和 MessagePort 可以被传输,并且克隆的 Error 会丢失其 cause。

Storage

🔴 未实现。Bun 没有 Storage、localStorage 或 sessionStorage 全局变量。

SubtleCrypto

🟢 完全实现,包括 supports()、getPublicKey()、encapsulate*()/decapsulate*() 方法、ML-DSA、ML-KEM-768/ML-KEM-1024、SHA3-* 和 ChaCha20-Poly1305。缺少 Ed448、X448、AES-OCB、Argon2*、cSHAKE*、KMAC*、KT128/KT256、TurboSHAKE* 和 ML-KEM-512 算法(这些算法在 Node.js 中均为实验性功能)。

DOMException

🟢 完全实现。实例不是原生错误(Error.isError() 返回 false)。

TextDecoder

🟢 完全实现。

TextDecoderStream

🟢 完全实现。

TextEncoder

🟢 完全实现。

TextEncoderStream

🟢 完全实现。

TransformStream

🟢 完全实现。无法通过 postMessage() 或 structuredClone() 传输。

TransformStreamDefaultController

🟢 完全实现。

URL

🟢 完全实现。

URLPattern

🟢 完全实现。

URLSearchParams

🟢 完全实现。

WebAssembly

🟢 完全实现。Memory64 默认处于禁用状态(设置 BUN_JSC_useWasmMemory64=1 可启用)。

WebSocket

🟢 完全实现。binaryType 默认为 "nodebuffer",因此二进制消息会以 Buffer 的形式到达。Node.js 的默认值为 "blob"。

WritableStream

🟢 完全实现。无法通过 postMessage() 或 structuredClone() 传输。

WritableStreamDefaultController

🟢 完全实现。

WritableStreamDefaultWriter

🟢 完全实现。