Runtimes
Node / Deno / Bun / edge2009 – todayJavaScript is no longer one host. The language spec is shared; the I/O, permissions, and module story are not — and that is where the real differences live.
An engine parses and executes JavaScript. A runtime adds everything the spec deliberately leaves out: timers, I/O, networking, module loading, a process model.
// Nothing here is in the ECMAScript specification:
setTimeout(() => {}, 0); // host-provided timer
console.log("hi"); // host-provided console
// fetch, fs, process, Deno.*, Bun.* — all host APIs, not language features.
// This is the language:
console.log(typeof Promise, typeof Symbol.asyncIterator, typeof globalThis);| V8 | Engine only: parser, Ignition interpreter, TurboFan/Maglev JITs, garbage collector. Embedded by Chrome, Node, Deno, Workers. |
|---|---|
| Node.js | V8 + libuv. CommonJS-first history, unrestricted filesystem and network access, the npm registry as its centre of gravity. |
| Deno | V8 + Tokio. Secure by default — filesystem, network, and env access each need an explicit permission flag. Web APIs first. |
| Bun | JavaScriptCore + Zig. Runtime, bundler, test runner, and package manager in one binary; optimised for startup and install speed. |