Bun aims for complete Node.js API compatibility. Most npm
packages intended for Node.js
environments will work with Bun out of the box; the best way to know for certain is to try it.
This page is updated regularly to reflect compatibility status of the latest version of Bun. The information below reflects Bun's compatibility with Node.js v20. If you run into any bugs with a particular package, please open an issue. Opening issues for compatibility bugs helps us prioritize what to work on next.
Built-in modules
node:assert
🟢 Fully implemented.
node:async_hooks
🟡 Only AsyncLocalStorage
, and AsyncResource
are implemented. AsyncResource
is missing bind
.
node:buffer
🟢 Fully implemented.
node:child_process
🟡 Missing proc.gid
proc.uid
. Stream
class not exported. IPC cannot send socket handles. Node.js <> Bun IPC can be used with JSON serialization.
node:cluster
🟡 Handles and file descriptors cannot be passed between workers, which means load-balancing HTTP requests across processes is only supported on Linux at this time (via SO_REUSEPORT
). Otherwise, implemented but not battle-tested.
node:console
🟢 Fully implemented.
node:crypto
🟡 Missing Certificate
ECDH
X509Certificate
checkPrime
checkPrimeSync
diffieHellman
generatePrime
generatePrimeSync
getCipherInfo
getFips
hkdf
hkdfSync
secureHeapUsed
setEngine
setFips
Some methods are not optimized yet.
node:dgram
🟡 Missing setBroadcast
setTTL
setMulticastTTL
setMulticastLoopback
setMulticastInterface
addMembership
dropMembership
addSourceSpecificMembership
dropSourceSpecificMembership
node:diagnostics_channel
🟢 Fully implemented.
node:dns
🟡 Missing cancel
setServers
getDefaultResultOrder
node:domain
🟡 Missing Domain
active
node:events
🟡 events.addAbortListener
& events.getMaxListeners
do not support (web api) EventTarget
node:fs
🟡 Missing statfs
statfsSync
, opendirSync
. Dir
is partially implemented.
node:http
🟢 Fully implemented. Outgoing client request body is currently buffered instead of streamed.
node:http2
🟡 Client & server are implemented (95.25% of gRPC's test suite passes). Missing options.allowHTTP1
, options.enableConnectProtocol
, ALTSVC extension, and http2stream.pushStream
.
node:https
🟢 APIs are implemented, but Agent
is not always used yet.
node:inspector
🔴 Not implemented.
node:module
🟡 Missing runMain
syncBuiltinESMExports
, Module#load()
. Overriding require.cache
is supported for ESM & CJS modules. module._extensions
, module._pathCache
, module._cache
are no-ops. module.register
is not implemented and we recommend using a Bun.plugin
in the meantime.
node:net
🟡 SocketAddress
class not exposed (but implemented). BlockList
exists but is a no-op.
node:os
🟢 Fully implemented.
node:path
🟢 Fully implemented.
node:perf_hooks
🟡 Missing createHistogram
monitorEventLoopDelay
. It's recommended to use performance
global instead of perf_hooks.performance
.
node:process
🟡 See process
Global.
node:punycode
🟢 Fully implemented. Deprecated by Node.js.
node:querystring
🟢 Fully implemented.
node:readline
🟢 Fully implemented.
node:repl
🔴 Not implemented.
node:stream
🟡 Missing getDefaultHighWaterMark
setDefaultHighWaterMark
toWeb
node:string_decoder
🟢 Fully implemented.
node:sys
🟡 See node:util
.
node:test
🔴 Not implemented. Use bun:test
instead.
node:timers
🟢 Recommended to use global setTimeout
, et. al. instead.
node:tls
🟡 Missing tls.createSecurePair
.
node:trace_events
🔴 Not implemented.
node:tty
🟢 Fully implemented.
node:url
🟢 Fully implemented.
node:util
🟡 Missing MIMEParams
MIMEType
debug
getSystemErrorMap
transferableAbortController
transferableAbortSignal
stripVTControlCharacters
node:v8
🔴 serialize
and deserialize
use JavaScriptCore's wire format instead of V8's. Otherwise, not implemented. For profiling, use bun:jsc
instead.
node:vm
🟡 Core functionality works, but experimental VM ES modules are not implemented, including vm.Module
, vm.SourceTextModule
, vm.SyntheticModule
,importModuleDynamically
, and vm.measureMemory
. Options like timeout
, breakOnSigint
, cachedData
are not implemented yet. There is a bug with this
value for contextified options not having the correct prototype.
node:wasi
🟡 Partially implemented.
node:worker_threads
🟡 Worker
doesn't support the following options: stdin
stdout
stderr
trackedUnmanagedFds
resourceLimits
. Missing markAsUntransferable
moveMessagePortToContext
getHeapSnapshot
.
node:zlib
🟡 Partially optimized, but brotli uses too much memory right now.
Globals
The table below lists all globals implemented by Node.js and Bun's current compatibility status.
AbortController
🟢 Fully implemented.
AbortSignal
🟢 Fully implemented.
Blob
🟢 Fully implemented.
Buffer
🟢 Fully implemented.
ByteLengthQueuingStrategy
🟢 Fully implemented.
__dirname
🟢 Fully implemented.
__filename
🟢 Fully implemented.
atob()
🟢 Fully implemented.
BroadcastChannel
🟢 Fully implemented.
btoa()
🟢 Fully implemented.
clearImmediate()
🟢 Fully implemented.
clearInterval()
🟢 Fully implemented.
clearTimeout()
🟢 Fully implemented.
CompressionStream
🔴 Not implemented.
console
🟢 Fully implemented.
CountQueuingStrategy
🟢 Fully implemented.
Crypto
🟢 Fully implemented.
SubtleCrypto (crypto)
🟢 Fully implemented.
CryptoKey
🟢 Fully implemented.
CustomEvent
🟢 Fully implemented.
DecompressionStream
🔴 Not implemented.
Event
🟢 Fully implemented.
EventTarget
🟢 Fully implemented.
exports
🟢 Fully implemented.
fetch
🟢 Fully implemented.
FormData
🟢 Fully implemented.
global
🟢 Implemented. This is an object containing all objects in the global namespace. It's rarely referenced directly, as its contents are available without an additional prefix, e.g. __dirname
instead of global.__dirname
.
globalThis
🟢 Aliases to global
.
Headers
🟢 Fully implemented.
MessageChannel
🟢 Fully implemented.
MessageEvent
🟢 Fully implemented.
MessagePort
🟢 Fully implemented.
module
🟢 Fully implemented.
PerformanceEntry
🟢 Fully implemented.
PerformanceMark
🟢 Fully implemented.
PerformanceMeasure
🟢 Fully implemented.
PerformanceObserver
🟢 Fully implemented.
PerformanceObserverEntryList
🟢 Fully implemented.
PerformanceResourceTiming
🔴 Not implemented.
performance
🟢 Fully implemented.
process
🟡 Missing domain
initgroups
setegid
seteuid
setgid
setgroups
setuid
allowedNodeEnvironmentFlags
getActiveResourcesInfo
setActiveResourcesInfo
moduleLoadList
setSourceMapsEnabled
. process.binding
is partially implemented.
queueMicrotask()
🟢 Fully implemented.
ReadableByteStreamController
🟢 Fully implemented.
ReadableStream
🟢 Fully implemented.
ReadableStreamBYOBReader
🟢 Fully implemented.
ReadableStreamBYOBRequest
🟢 Fully implemented.
ReadableStreamDefaultController
🟢 Fully implemented.
ReadableStreamDefaultReader
🟢 Fully implemented.
require()
🟢 Fully implemented, including require.main
, require.cache
, require.resolve
Response
🟢 Fully implemented.
Request
🟢 Fully implemented.
setImmediate()
🟢 Fully implemented.
setInterval()
🟢 Fully implemented.
setTimeout()
🟢 Fully implemented.
structuredClone()
🟢 Fully implemented.
SubtleCrypto
🟢 Fully implemented.
DOMException
🟢 Fully implemented.
TextDecoder
🟢 Fully implemented.
TextDecoderStream
🟢 Fully implemented.
TextEncoder
🟢 Fully implemented.
TextEncoderStream
🟢 Fully implemented.
TransformStream
🟢 Fully implemented.
TransformStreamDefaultController
🟢 Fully implemented.
URL
🟢 Fully implemented.
URLSearchParams
🟢 Fully implemented.
WebAssembly
🟢 Fully implemented.
WritableStream
🟢 Fully implemented.
WritableStreamDefaultController
🟢 Fully implemented.
WritableStreamDefaultWriter
🟢 Fully implemented.