Bun

Node.js compatibility

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 is supported, but server isn't yet.

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.