🏃 JS 运行时演进史

一句话定性

JavaScript 本来是浏览器里的”玩具语言”,一个引擎(V8)被搬出浏览器,就改写了整个后端、工具链乃至前端工程化的命运。这条线的主题是:性能 → 生态 → 反思 → 重做——同一个问题被三代人(其中两代是同一个人)反复回答。


一、它是什么 & 出现的时代

“JS 运行时(runtime)“指的是:让 JavaScript 能在浏览器之外执行的程序。它的核心是一个 JS 引擎(把 JS 变成机器能跑的东西)+ 一套宿主 API(文件、网络、进程……这些浏览器不给你的能力)。

运行时年份作者引擎语言一句话
Node.js2009Ryan DahlV8C++把 JS 带出浏览器,缔造前端工程化
Deno2020Ryan Dahl(同一人)V8Rust反思 Node 的十个遗憾,默认安全 + 原生 TS
Bun2022Jarred SumnerJavaScriptCoreZig运行时+包管理+打包+测试一体化,极致速度

一个有趣的史实

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.jsDenoBun
押注的本质”JS 该走出浏览器""Node 的默认值错了""速度和一体化才是痛点”
模块系统CommonJS(后补 ESM)ES-Modules + URL 导入ESM + CJS 都原生支持
安全模型默认全权限默认沙箱,显式授权默认全权限(随 Node)
TypeScript需要工具链转译原生执行原生执行
包管理npmURL / npm 兼容内置 bun install(极快)
杀手锏最大生态安全 + Web 标准速度 + All-in-one

四、带来的新问题 / 副作用

运行时内卷的代价

  1. 生态碎片化:Node / Deno / Bun 三分天下,库作者要考虑兼容多个运行时,CI 矩阵变复杂。
  2. “兼容 Node”成了硬约束:Deno 早期拒绝兼容 Node 生态,推广严重受阻,后来不得不补上 npm 兼容——证明生态惯性 > 设计纯洁性(二阶效应)。
  3. 标准之争: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 工程化时代