🏃 JS 运行时演进史
一句话定性
JavaScript 本来是浏览器里的”玩具语言”,一个引擎(V8)被搬出浏览器,就改写了整个后端、工具链乃至前端工程化的命运。这条线的主题是:性能 → 生态 → 反思 → 重做——同一个问题被三代人(其中两代是同一个人)反复回答。
一、它是什么 & 出现的时代
“JS 运行时(runtime)“指的是:让 JavaScript 能在浏览器之外执行的程序。它的核心是一个 JS 引擎(把 JS 变成机器能跑的东西)+ 一套宿主 API(文件、网络、进程……这些浏览器不给你的能力)。
| 运行时 | 年份 | 作者 | 引擎 | 语言 | 一句话 |
|---|---|---|---|---|---|
| Node.js | 2009 | Ryan Dahl | V8 | C++ | 把 JS 带出浏览器,缔造前端工程化 |
| Deno | 2020 | Ryan Dahl(同一人) | V8 | Rust | 反思 Node 的十个遗憾,默认安全 + 原生 TS |
| Bun | 2022 | Jarred Sumner | JavaScriptCore | Zig | 运行时+包管理+打包+测试一体化,极致速度 |
一个有趣的史实
Node 和 Deno 是同一个作者 Ryan Dahl 的作品。Deno 几乎是一封”给十年前的自己”的检讨信——很少有技术史能看到原作者亲手否定自己的代表作。
二、为什么会出现(解决上一代什么痛点)
这条线的起点不是”JS 不够好”,而是一个更朴素的事实:Chrome 的 V8 引擎太快了。
- 2008 年 Google 发布 Chrome,其 V8 引擎用 JIT 把 JS 执行速度提升了一个数量级。Ryan Dahl 看到了机会:如果 JS 这么快,为什么只能在浏览器里跑?
- 当时服务端的并发模型(Apache 一个请求一个线程)在高并发下内存爆炸。Dahl 想要一个事件驱动、非阻塞 IO 的服务器——而 JS 的”单线程 + 回调”模型天生适合这件事。
- 于是 2009 年:V8(执行) + libuv(事件循环 + 非阻塞 IO) + 一套 C++ 绑定 = Node.js。
后面每一代都是在”否定上一代”中诞生:
V8 太快了,不该只在浏览器里
│
▼
Node.js(2009)──► npm 生态爆炸,但也埋下一堆设计债
│
├──► 设计债积累(安全、模块系统、TS 支持……)
│ ▼
│ Deno(2020)──► 修正 Node 的"十个遗憾",但生态不兼容,推广受阻
│
└──► Node 又慢又臃肿,工具链碎片化
▼
Bun(2022)──► 用 Zig 追求极致速度 + 一体化,且兼容 Node 生态
三、核心机制 & 为什么流行
三者各自押注一个不同的”第一性”判断:
| 维度 | Node.js | Deno | Bun |
|---|---|---|---|
| 押注的本质 | ”JS 该走出浏览器" | "Node 的默认值错了" | "速度和一体化才是痛点” |
| 模块系统 | CommonJS(后补 ESM) | ES-Modules + URL 导入 | ESM + CJS 都原生支持 |
| 安全模型 | 默认全权限 | 默认沙箱,显式授权 | 默认全权限(随 Node) |
| TypeScript | 需要工具链转译 | 原生执行 | 原生执行 |
| 包管理 | npm | URL / npm 兼容 | 内置 bun install(极快) |
| 杀手锏 | 最大生态 | 安全 + Web 标准 | 速度 + All-in-one |
四、带来的新问题 / 副作用
运行时内卷的代价
- 生态碎片化:Node / Deno / Bun 三分天下,库作者要考虑兼容多个运行时,CI 矩阵变复杂。
- “兼容 Node”成了硬约束:Deno 早期拒绝兼容 Node 生态,推广严重受阻,后来不得不补上 npm 兼容——证明生态惯性 > 设计纯洁性(二阶效应)。
- 标准之争:Web 标准 API(Deno/Bun)vs Node 既有 API,谁是”正统”尚无定论,WinterCG 等组织正在拉齐。
五、现状 / 演化
- Node.js:仍是绝对主流,LTS 稳定,后补了 ESM、内置 test runner、
--experimental-strip-types等,正在”反向吸收” Deno/Bun 的好点子。 - Deno:Deno 2(2024)全面拥抱 npm 兼容,从”Node 杀手”转向”更好的 Node 体验”,主打
deno.json一体化与边缘部署。 - Bun:增长迅猛,以”最快的包管理器 + 测试器 + 打包器”切入,逐步蚕食工具链场景。
竞争的结果不是谁取代谁,而是整个 JS 运行时生态被迫向”更快、更安全、更标准、更一体化”演进——内卷推动了集体进步。
六、对后续技术的影响(因果链)
┌─────────────── V8([[Chrome]]) ───────────────┐
▼
Node.js(2009)
│
├──► npm 生态 ──► [[Webpack]]/[[Browserify]] 等工具诞生
│ ──► "前端工程化"成为可能(没有 Node 就没有现代前端)
│
├──► CommonJS ──► 后来与 [[ES-Modules]] 长期共存/冲突
│
├──► 反思 ──► Deno(2020)──► 推动 Web 标准 API、原生 TS 进入运行时
│
└──► 速度/一体化诉求 ──► Bun(2022,Zig)──► 倒逼 Node 内置测试器、提速
│
└──► 工具链"一体化"趋势(对抗碎片化)
历史地位
Node.js 是整个现代前端的地基:它让 JS 能写工具、跑构建、做服务,直接使 2018-2023 工程化时代 成为可能。Deno 和 Bun 则是”地基的自我修正”——一个修方向(安全、标准),一个修速度(Zig、一体化)。它们共同把 JS 从”浏览器脚本”变成了全栈通用语言。
🔗 相关:Node.js | Deno | Bun | Chrome | npm-Yarn-pnpm-包管理 | Browserify | ES-Modules | 2018-2023 工程化时代