← Research

Concept · 工具入门

Node 不是网络节点

这名字起得糟透了。它实质上是让 JavaScript 跑在你电脑上,而不是浏览器里的一个运行器。你刚才在活动监视器里看见的那 10 个 node 进程,本质上是 10 个独立的 JS 小程序在后台跑——只是恰好都用 node 启动罢了。

什么是 node? 读时~25 min
路线图

从一个糟糕的名字,一路下到为什么活动监视器里那么多 node

四站。第一站把名字的误会拆掉,第二站讲它真正是什么(这一站直接回答"什么是 node"),第三站讲为什么每个 node 进程都吃这么多内存,第四站讲你电脑里其实到处都是 node。最后回到那 10 个进程,把整件事关上。

直接回答原问题 01 名字坑 Node ≠ 节点 02 跑出浏览器 JS 的运行器 03 为什么吃内存 V8 + 进程隔离 04 满电脑都是 不只是服务器
Roadmap. 橙色那站是对"什么是 node"的直接回答,前后三站是把这个答案铺开来理解的语境。

这名字本来应该叫 web.js

你说 node 这事儿,名字本身就是个误会的开端。第一次听到的人,十个里有八个会想:"node?那是不是跟网络节点有关?"——再加上 .js 的后缀,听起来又像某种网络协议。

真不是。Node.js 是 Ryan Dahl 在 2009 年写的一个软件,最早的名字差点叫 web.js1。后来他发现这玩意儿能干的事远不止做网站,所以改成了更宽泛的 node。这里"node"指的是分布式系统里的"一个工作节点"——意思是"这个程序天生擅长跟别的程序通信"——跟你想到的"网络节点"沾点边,但根本不是一回事。

说白了,它就是个软件,跟你电脑上随便哪个软件没区别。本来应该叫 jsrunner 或者 web.js,叫了 node,大家就被名字带歪了十几年 🟡 med

你可能以为 node 是实际上它是
一种网络协议不是协议,是一个软件
网络拓扑里的某种节点跟网络拓扑无关
只有网站后台才用的东西满电脑都在用
跟 React / Vue 一样属于前端它让 JS 跑在电脑上,跟浏览器里的 JS 是两码事
常见错答

"node 是网络节点的意思,所以它跟分布式系统有关。"——错。它名字里的"节点"不是技术含义,只是 Ryan Dahl 当年随手起的一个有点贴近"网络通信"语感的词。今天你看到的绝大多数 node 进程,跟分布式半毛钱关系没有,就是个普通桌面工具。

把 Chrome 里那个 JS 引擎拆出来,单独拿来用

这一段是答案的核心。

2009 年之前,JavaScript 这门语言只能在浏览器里跑。你写出来的 JS 代码,只能放进网页,用户打开网页才会执行。换句话说,JS 是被关在浏览器这个笼子里的。

Ryan Dahl 干的事很简单:他把 Chrome 浏览器里负责跑 JS 的那个发动机——叫 V8——拆出来,加了点周边代码,弄成了一个独立的命令行工具24。从此 JS 就能像 Python、Ruby 那样,在你电脑上直接跑——不需要打开浏览器。

你写一个文件叫 hello.js,然后在终端里敲 node hello.js,它就执行了。

浏览器 V8 引擎(跑 JS) DOM / 网页 渲染器 鼠标 / 滚动 / 点击 node V8 引擎(跑 JS) 文件系统 网络 命令行 / stdin / stdout
Fig 1. 中间那块 V8 引擎是同一个东西。区别在外面:浏览器把它接到网页和鼠标上,node 把它接到文件、网络、命令行上。
举个具体的

新建一个文件 hello.js,里面写一行:

console.log('hello node');

然后在终端里敲 node hello.js,屏幕上会打出 hello node。这跟在浏览器 Console 里敲同一行 JS 干的事一样——但全程没有打开浏览器,没有网页,没有渲染。你电脑上跑的就是一个普通的命令行程序,只是它的"母语"恰好是 JavaScript。

为什么会有人想干这件事?

2009 年那时候网页越做越复杂,前端工程师写 JS 写得很熟,但后端服务器都用 PHP、Python、Ruby——前端的人写后端,得换一门语言。Ryan Dahl 的赌注是:如果让前端的人也能用 JS 写后端,他们的整个工具链能少一半。

这个赌赢了。今天你装 Claude Code、装 npm 包、跑 VS Code 插件、跟 AI Agent 通信——背后跑的全是 node。

每个 node 进程都是个独立小宇宙

那么——你刚才在活动监视器里看见,每个 node 进程吃 ~1.2GB,这是为什么?

因为每启动一个 node,操作系统都要在内存里完整复制一份 V8 引擎 + 自己的内存堆。node 进程之间默认不共享任何东西——这是操作系统的进程隔离的基本规则,跟 node 自己没关系。两个 node 进程之间,从内存层面看是两个完全陌生的程序3

V8 引擎给每个 node 进程留的"内存额度"叫堆 (heap)。从 Node 20 开始,这个额度会根据你电脑总内存自动算——一台 24GB 内存的 Mac 上,默认上限差不多在 2GB 上下3 🟡 med。也就是说一个 node 进程哪怕实际只用了几十兆,V8 也会预留差不多 2GB 给它备用。

飞书 MCP 这种长期跑的服务,会慢慢往这个额度里塞东西——缓存、待发请求、内部状态——你看到的 1.2GB 就是它跑了几小时甚至几天攒下来的。

一个 node 进程的内存花在哪儿大致多少
V8 引擎本体30–50 MB
JavaScript 堆(默认上限,Mac 24GB 内存)可达 ~2 GB
程序自己的数据(变量、缓存、对象)看程序怎么写,几 MB 到上百 MB 都正常
网络 / 文件 IO 缓冲区几 MB 到几十 MB
思考一下

为什么 node 不像浏览器那样,所有"标签页"共享一个引擎?——其实新版浏览器也已经把每个标签页拆成独立进程了,理由跟 node 一样:进程隔离。一个标签崩了不会拖垮整个浏览器。代价就是内存。10 个标签 = 10 份引擎 = 10 倍内存,这事儿和 10 个 node 是一回事。

反证

有人会说"node 那么吃内存,肯定是它写得烂"。其实不是。Python、Ruby 进程也吃,只是它们的运行时(CPython / MRI)比 V8 简单,启动开销小一些。但你只要跑长期服务,任何运行时都会慢慢攒内存。真要怪,得怪操作系统——每个进程都得自己装一份运行时,谁都躲不掉。这事儿不是 node 的锅。

你电脑里跑着的 node,比你以为的多 10 倍

普通人一提 Node.js,反应是"哦,网站后台"。这是十几年前的印象。现实里,你电脑上跑着的 node 进程,绝大多数跟网站后台没关系

你刚才看见那 10 个 node,全是飞书的 MCP 服务5——AI 模型用来读写飞书文档的小桥梁。再往下数,VS Code 你装的所有扩展都在 node 里跑;Discord、Slack、Notion 的桌面版,底层是 Electron(其实就是 Chrome + node 打包成一个桌面应用);你装 npm 包、跑 npx 命令、跑 prettier 格式化代码——全是 node。

能这么普及,是因为 node 出来之后,JavaScript 这门语言意外地变成了写小工具最方便的语言。包多、上手快、跨平台。十几年下来,大量原本会用 Bash 或 Python 写的工具,默默地全改成了 node 写——你看不到,但它们一直在你电脑上跑。

你电脑里可能在跑的 node 程序是什么
飞书 MCP / Claude Code MCPAI 模型读写外部工具的桥梁
VS Code 的 Extension Host你装的所有 VS Code 插件,全在这里面跑
npm / npx 命令每次你装 JS 工具,就拉一个 node 起来
Electron 桌面应用Discord / Slack / Notion / 飞书桌面版底层都是 node + Chrome
命令行工具Claude Code 本身、prettier、各种构建工具
举个具体的

想看你电脑里所有 node 在干什么,终端里敲:

ps -A -o pid,command | grep -i node | grep -v grep

每一行后面会写出来这个 node 是被哪个 JS 文件启动的。名字里带 lark-mcp 的是飞书,带 electron 的是 Electron 应用,带 node_modules 路径的多半是某个本地工具。看一眼你就知道它们都是干嘛的。

综合判断

所以你看见的那 10 个 node 是什么

绕完一圈,回头看你在活动监视器里看见的那 10 个 node 进程。

它们全是飞书的 MCP 服务——@larksuiteoapi/lark-mcp 这个 npm 包。MCP 是 Anthropic 定的一个协议,让 AI 模型(比如 Claude)能通过它跟外部工具说话。Claude Code 每次启动一个会话,如果你开了飞书 MCP,它就用 npm exec 拉一个 lark-mcp 起来,通过管道跟它沟通——"帮我查个飞书文档"、"帮我新建张表格"。

每个 lark-mcp 进程是独立的小程序,有自己的 V8 引擎,有自己的内存堆。10 个加起来吃 12GB,听着可怕,单个看 1.2GB,在长期跑的 node 服务里算正常。问题不在内存大,问题在它们该退却没退——Claude Code 关了,这些 MCP 服务没收到信号,挂在那儿成了僵尸。

这事儿往大了说,node 不可怕,飞书 MCP 也不可怕——可怕的是"宿主关了子进程不跟着退"的 bug。等 MCP 协议或者有人写个统一的守护进程来管这一摊,这事儿就消停了。在那之前,定期手动 pkill -f lark-mcp 是最实际的解法。

回到你最初的问题:node 是什么?——它就是一个让 JavaScript 跑出浏览器的运行器。一个软件。你电脑里到处都是。名字起得不好,但东西其实很普通。

关键不确定性

这几处我也没全摸透

  • "Ryan Dahl 当初想叫 web.js"这个故事,在社区流传很广,但我没翻到他本人原话的录像或采访来直接证实。可能是后人复述时整理出来的版本。所以这件事的证据等级标 🟡 med,不是 🟢 high
  • V8 的默认堆大小,Node 官方文档说是"按机器自适应",但具体公式没公开过精确数字。"2GB 上下"是社区共识 + 容器场景下的文档说法3,Mac 桌面场景下可能略有出入。
  • 你看到"每个 node 吃 1.2GB"是飞书 MCP 这个特定程序的具体数,不是 node 普遍现象。一个普通的 node 命令行工具,跑完就退,只占几十兆。是飞书 MCP 长期跑、加上内部缓存,才慢慢攒到 1.2GB。
引用

Sources

  1. Node.js — Wikipedia (history section on naming) — https://en.wikipedia.org/wiki/Node.js
  2. The Story of Node.js: From Inception to Modern Powerhouse — DEV Community — https://dev.to/satyam_gupta_0d1ff2152dcc/the-story-of-nodejs-from-inception-to-modern-powerhouse-28d3
  3. Understanding and Tuning Memory — Node.js official docs — https://nodejs.org/learn/diagnostics/memory/understanding-and-tuning-memory
  4. Ryan Dahl: Node.js, Evented I/O for V8 JavaScript — JSConf.eu 2009 — https://www.jsconf.eu/2009/video_nodejs_by_ryan_dahl.html
  5. Build an MCP Server in Node.js — Model Context Protocol tutorial — https://oneuptime.com/blog/post/2025-12-17-build-mcp-server-nodejs/view