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_LENGTH2**32)。

node:console

🟢 完全实现。输出会直接写入 stdout/stderr 文件描述符,并使用 Bun 自己的检查器进行格式化,因此替换 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 客户端、http2dgram 内置通道。缺少 boundedChannel() 以及 http.server.*netmoduleconsolechild_processworker_threads 内置通道;Channel 不会因其订阅者而保持活动状态,因此请保留对它的引用。

node:dns

🟢 完全实现。缺少 resolveTlsaResolvermaxTimeout 选项会被忽略,并且回调风格的 Resolver 类无法被子类化(dns.promises.Resolver 可以)。

node:events

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

node:fs

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

node:http

🟢 完全实现。http.Server 不继承 net.Serverlisten(handle) 以及 listen()fdipv6Onlysignal 选项会被忽略,服务器上的 keepAlivekeepAliveInitialDelay 也不会执行任何操作。

node:https

🟡 已实现 requestgetAgentglobalAgent,包括连接池。https.Server 是带有 TLS 选项的 http.Server,而不是 tls.Server:请求套接字不是 tls.TLSSocketencryptedauthorizedservername 可用;缺少 getPeerCertificate()getCipher()),并且不支持 setSecureContext()addContext()SNICallbackhandshakeTimeout

node:os

🟢 完全实现。userInfo() 从环境变量(USERSHELLHOME)中读取 usernameshellhomedir,而不是从 passwd 数据库中读取;在 Linux arm64 上,machine() 返回 "arm64" 而不是 "aarch64"

node:path

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

node:punycode

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

node:querystring

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

node:readline

🟢 完全实现。

node:stream

🟢 完全实现。isReadableisWritableisErroredReadable.isDisturbed 只理解 Node.js 流,不理解 web 流。

node:string_decoder

🟢 完全实现。Node.js 测试套件 100% 通过。end() 不接受字符串参数,并且 StringDecoder 无法通过 class extends 进行子类化。

node:timers

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

node:tty

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

node:url

🟢 完全实现。

node:zlib

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

node:async_hooks

🟡 已实现 AsyncLocalStorageAsyncResourcecreateHookexecutionAsyncIdtriggerAsyncIdexecutionAsyncResource 是存根(不会调用钩子,除了 process.nextTickinit 外,并且异步 id 始终为 0);Node.js 强烈不建议使用这些 API,而应使用 AsyncLocalStorageAsyncLocalStorage 上下文不会传播到 MessagePortBroadcastChannelWorker 事件中。

node:child_process

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

node:cluster

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

node:crypto

🟡 缺少 encapsulatedecapsulate(ML-KEM 密钥可通过 crypto.subtle 使用);argon2() 和自定义引擎(setEngine())会抛出异常,setFips() 不执行任何操作,secureHeapUsed() 返回 undefined。Bun 的加密功能由 BoringSSL 支持,而 BoringSSL 缺少 ed448x448rsa-pssdsadh 密钥类型,除 P-224/256/384/521 之外的 EC 曲线(不支持 secp256k1),以及 CCM、OCB、XTS 和 chacha20-poly1305 密码。

node:domain

🟡 缺少 Domainmembers。domain 只会捕获在 run()bind() 内同步抛出的错误,或由传递给 add() 的 emitter 发出的错误;来自计时器、process.nextTick、promise 和其他异步回调的错误不会被路由到该 domain。

node:http2

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

node:module

🟡 缺少 Module#load()registerHooksfindPackageJSONstripTypeScriptTypesgetSourceMapsSupportsetSourceMapsSupport。支持覆盖 require.cacherequire.extensionsmodule._resolveFilenamesyncBuiltinESMExportsmodule._loadmodule._pathCachemodule.register 不执行任何操作(我们建议改用 Bun.plugin),并且 findSourceMap 始终返回 undefined

node:net

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

node:perf_hooks

🟡 已实现 monitorEventLoopDelay()createHistogram()timerify()PerformanceObservermarkmeasurefunctionnethttphttp2 条目)。不会发出 gcdnsresource 条目,eventLoopUtilization() 始终返回零,并且 performance.nodeTiming 包含占位值。只有导入 node:perf_hooks 后,全局 performance 对象中 Node 特有的新增内容才会出现。

node:process

🟡 见 process 全局变量部分。

node:sys

🟡 见 node:util

node:tls

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

node:util

🟡 缺少 difftransferableAbortSignaltransferableAbortControllerdebuglog() 会忽略其 callback 参数,返回的函数没有 enabled 属性。

node:v8

🟡 已实现 writeHeapSnapshotgetHeapSnapshotgetHeapStatisticsgetHeapSpaceStatisticsGCProfilerstartupSnapshot;堆统计描述的是 JavaScriptCore 的单一堆,并且 setFlagsFromString 会忽略传入的标志。serializedeserialize 使用 JavaScriptCore 的 wire 格式,而不是 V8 的格式。缺少 queryObjectsstartCpuProfilestartHeapProfileSerializerDeserializertakeCoveragestopCoveragepromiseHooks。如需进行性能分析,请改用 bun:jsc

node:vm

🟡 已实现核心功能和 ES 模块,包括 vm.Scriptvm.createContextvm.runInContextvm.runInNewContextvm.runInThisContextvm.compileFunctionvm.isContextvm.Modulevm.SourceTextModulevm.SyntheticModule(无需 --experimental-vm-modules 即可导出)以及对 importModuleDynamically 的支持。支持 timeoutbreakOnSigintcachedDatamicrotaskModecodeGeneration 选项。返回 vm.Module promise 的 importModuleDynamically 回调会将 import() 解析为模块对象,而不是其命名空间,并且 vm.measureMemory() 会为每个上下文报告整个堆的数值。

node:wasi

🟡 部分实现。WASI 支持 argsenvpreopenswasiImportstart(),并且 bun ./program.wasm 可以直接运行 WASI 命令。缺少 getImportObject()(请使用 wasiImport)、initialize()sock_accept 导入;versionreturnOnExitstdinstdoutstderr 选项会被忽略,因此 proc_exit 会退出 Bun 进程。

node:worker_threads

🟡 Worker 会忽略 resourceLimitstrackUnmanagedFds 选项,而 execArgv 只会在 worker 中设置 process.execArgvworker.performance.eventLoopUtilization() 是存根。缺少 moveMessagePortToContextlocks

node:inspector

🟡 部分实现。Session 支持 Profiler 域(包括精确覆盖率)、Runtime.enableNodeTracing,可通过 node:inspectornode:inspector/promises 使用;其他 Session 命令(例如 Runtime.evaluate)以及 HeapProfiler 域尚未实现。open()url()close()waitForDebugger() 已实现;open() 提供 DebuggerRuntime 域,并且在 worker 中会抛出异常。缺少 Network

node:repl

🟡 大部分已实现。bun --interactive 会启动兼容 Node.js 的 REPL。不会显示结果预览(该功能需要基于 V8 inspector 的无副作用求值),制表符补全会跳过 letconstclass 绑定,并且部分 V8 特有的错误消息和堆栈帧措辞有所不同。

node:sqlite

🟢 完全实现。backup() 会同步运行,并在复制期间阻塞事件循环(Node 会在工作线程上运行该操作)。作为数据库路径的 BufferUint8Array 必须是有效的 UTF-8(Node 会直接传递原始字节;Bun 会对非 UTF-8 内容拒绝并返回 ERR_INVALID_ARG_VALUE)。在 macOS 上,Bun 使用系统的 libsqlite3.dylibloadExtension()(以及在较旧的 macOS 版本上,createSession()applyChangeset())需要完整的 SQLite 构建版本——请在打开数据库前调用 require("bun:sqlite").Database.setCustomSQLite(path)

node:test

🟡 部分实现。在 bun test 下运行测试文件时,进程内 API 可以工作:测试、套件、子测试、钩子、t.plan()t.assertassert.register()t.waitFor()getTestContext()expectFailure 以及 t.mock(函数/方法/getter/setter/属性 mock 和 mock 计时器)。run() 需要显式的 files 列表,并会在 bun test 子进程中运行每个文件;其大多数选项(globPatternswatchcoverageshardonlytestNamePatterns 等)都会抛出 ERR_NOT_IMPLEMENTED。缺少 node:test/reporters、快照测试、mock.module()t.runOnly()、代码覆盖率、--test-only、测试级别的 signal 中止以及 Node 的 --test CLI runner 模式。test.only(){only: true} 会被接受,但不会进行筛选。concurrency 会被验证,但子测试始终串行运行。请改用 bun:test

node:trace_events

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

node:quic

🟢 已实现:listen()connect()QuicEndpointQuicSessionQuicStream。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_LENGTH2**32)。

ByteLengthQueuingStrategy

🟢 完全实现。

__dirname

🟢 完全实现。

__filename

🟢 完全实现。

atob()

🟢 完全实现。

Atomics

🟢 完全实现。

BroadcastChannel

🟢 完全实现。

btoa()

🟢 完全实现。

clearImmediate()

🟢 完全实现。

clearInterval()

🟢 完全实现。

clearTimeout()

🟢 完全实现。

CompressionStream

🟢 完全实现。

console

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

CountQueuingStrategy

🟢 完全实现。

Crypto

🟢 完全实现。

SubtleCrypto (crypto)

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

CryptoKey

🟢 完全实现。

CustomEvent

🟢 完全实现。

DecompressionStream

🟢 完全实现。

Event

🟢 完全实现。

EventTarget

🟢 完全实现。

exports

🟢 完全实现。

fetch

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

FormData

🟢 完全实现。

global

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

globalThis

🟢 是指向 global 的别名。

Headers

🟢 完全实现。

MessageChannel

🟢 完全实现。

MessageEvent

🟢 完全实现。

MessagePort

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

module

🟢 完全实现。缺少 module.isPreloading

PerformanceEntry

🟢 完全实现。

PerformanceMark

🟢 完全实现。

PerformanceMeasure

🟢 完全实现。

PerformanceObserver

🟡 可以观察 markmeasure 条目。Node 专属的条目类型(functionhttpnet 等)只会传递给 node:perf_hooksPerformanceObserver,并且永远不会发出 gcdnsresource 条目。

PerformanceObserverEntryList

🟢 完全实现。

PerformanceResourceTiming

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

performance

🟡 已实现 now()timeOriginmark()measure()getEntries()。Node.js 的新增内容(eventLoopUtilization()nodeTimingtimerify())只有在加载 node:perf_hooks 后才会存在;eventLoopUtilization() 始终返回零,而 nodeTiming 包含占位值。

process

🟡 大部分已实现。process.binding(部分依赖它的包所使用的 Node.js 内部绑定)已部分实现:bufferconfigconstantsfsnativestty_wraputiluv 可用,其余会抛出异常。在 macOS 和 Linux 上设置 process.title 不执行任何操作。getActiveResourcesInfo()_getActiveHandles()_getActiveRequests() 始终返回空数组,setSourceMapsEnabled() 不执行任何操作,process.report.writeReport() 不会写入任何内容。缺少 sourceMapsEnabledaddUncaughtExceptionCaptureCallback

queueMicrotask()

🟢 完全实现。

ReadableByteStreamController

🟢 完全实现。

ReadableStream

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

ReadableStreamBYOBReader

🟢 完全实现。

ReadableStreamBYOBRequest

🟢 完全实现。

ReadableStreamDefaultController

🟢 完全实现。

ReadableStreamDefaultReader

🟢 完全实现。

require()

🟢 完全实现,包括 require.mainrequire.cacherequire.resolve

Response

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

Request

🟡 缺少 keepaliveduplexcredentialsintegrityreferrerreferrerPolicy 选项会被接受但忽略。

setImmediate()

🟢 完全实现。

setInterval()

🟢 完全实现。

setTimeout()

🟢 完全实现。

structuredClone()

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

SubtleCrypto

🟢 完全实现,包括 supports()getPublicKey()encapsulate*()decapsulate*() 方法、ML-DSAML-KEM-768ML-KEM-1024SHA3-*ChaCha20-Poly1305。缺少 Ed448X448AES-OCBArgon2*cSHAKE*KMAC*KT128KT256TurboSHAKE*ML-KEM-512 算法(这些算法在 Node.js 中均为实验性功能)。

DOMException

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

TextDecoder

🟢 完全实现。

TextDecoderStream

🟢 完全实现。

TextEncoder

🟢 完全实现。

TextEncoderStream

🟢 完全实现。

TransformStream

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

TransformStreamDefaultController

🟢 完全实现。

URL

🟢 完全实现。

URLSearchParams

🟢 完全实现。

WebAssembly

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

WritableStream

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

WritableStreamDefaultController

🟢 完全实现。

WritableStreamDefaultWriter

🟢 完全实现。