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.
Workers-style runtimes run V8 isolates, not processes. No filesystem, no long-lived globals across requests, and a strictly Web-standard API surface.
// The edge runtime contract, in one handler:
export default {
async fetch(request) {
const url = new URL(request.url);
return new Response(JSON.stringify({ path: url.pathname }), {
headers: { "content-type": "application/json" },
});
},
};
// No fs. No process. Request/Response/URL/fetch — Web APIs only.| V8 | The engine underneath most edge runtimes (Cloudflare Workers, Deno Deploy, Vercel Edge) — isolates, not processes. |
|---|---|
| Node.js | The opposite end: full filesystem, sockets, and child processes. The edge contract deliberately strips all of that away. |
| Deno | Deno Deploy runs Workers-style isolates; `Deno.serve((req) => new Response(...))` is the same fetch-handler model. |
| Bun | `Bun.serve` also accepts a `fetch` handler, but it runs the full Node API too — a superset of the edge surface. |