Node.js 是一个运行时,能在浏览器之外运行 JavaScript:在服务器上、在终端里,或者作为命令行工具。它不是一门编程语言(语言是 JavaScript),也不是一个框架(Express 才是运行在 Node.js 上的框架)。它把执行 JavaScript 的 Google V8 引擎,和事件循环以及浏览器所没有的文件、网络和进程等内置 API 结合在一起。
它打印了文件的内容、主版本号(v24),以及 window 的类型 undefined,因为 Node.js 没有网页可以提供这个对象。fs 和 process 只存在于 Node.js 中;在浏览器标签页里运行同样的代码,第一行就会抛出错误。
Node.js 是框架还是语言?
都不是。JavaScript 是语言,Node.js 是运行它的程序,就像 JVM 运行 Java、CPython 运行 Python 一样。框架位于它之上:Express、Fastify 和 NestJS 都是安装到 Node.js 项目里的库。Node.js 与 JavaScript 一页详细比较了两者。
从内部看,Node.js 由四个部分组成:
- V8,来自 Chrome 的 JavaScript 引擎。它把你的代码转换成机器码并运行。
- libuv,一个 C 语言库,提供事件循环,在后台完成缓慢的工作(磁盘、网络、定时器),再把结果交还给你的回调函数。
- Node 自带的 API:处理文件的
fs、搭建服务器的http,还有path、process、crypto、events等,用require或import即可使用,无需安装。 - npm,随 Node.js 一起提供的包管理器,让你可以使用所有编程语言中规模最大的包仓库。
怎样运行 Node.js 文件
从官网安装 Node.js(选择 LTS 版本),然后在终端里检查版本并运行一个文件:
node --version # prints v24.x.x or similar
node app.js # runs app.js and exits when it has nothing left to do
node # with no file: an interactive prompt (the REPL)
当没有任何东西在等待时,程序会自己结束:没有定时器、没有打开的服务器、没有未完成的文件读取。这就是为什么脚本会退出,而 Web 服务器会一直运行。
非阻塞 I/O:核心思想
Node.js 不会等待缓慢的工作。它发起一次文件读取或网络请求,接着运行后面的代码,等结果准备好时再调用你的函数。
readFile 之后的两行 console.log 先运行了,文件内容最后才到达。一个 Node.js 进程就是这样同时服务成千上万个连接的:当一个请求在等待数据库时,事件循环会让其他请求继续推进。
Node.js 与浏览器
| 浏览器 | Node.js | |
|---|---|---|
| 运行在 | 网页中 | 终端里或服务器上 |
| 拥有 | window、document、DOM、localStorage | fs、process、http、Buffer、require |
| 全局对象 | window(以及 globalThis) | global(以及 globalThis) |
| 磁盘上的文件 | 无法访问 | 完全访问,权限与你的用户相同 |
setTimeout、console、fetch、URL | 有 | 有 |
Node.js 能用来做什么
- Web 服务器和 API:REST 和 GraphQL 后端,通常配合 Express。
- 实时应用:基于 WebSocket 的聊天、实时仪表盘和多人游戏,同时保持大量连接。
- 命令行工具:npm 本身、Vite、ESLint、Prettier 和 TypeScript 编译器都运行在 Node.js 上。
- 脚本和自动化:重命名文件、调用 API、迁移数据。
最常见的用途是 HTTP 服务器,而第一个服务器用内置的 http 模块就够了:
服务器用它收到的路径回应了 GET /hello。在请求栏里把路径改成 /anything 再发送:回复也会跟着变,因为这个服务器用同一个函数处理所有 URL。
什么时候选择 Node.js
当工作主要是在等待 I/O(请求、数据库、文件),并且你希望前端和后端使用同一种语言时,选择 Node.js。对于视频编码或大规模数值计算这类长时间占用 CPU 的任务,它就不太合适了,因为一次长时间的计算会阻塞唯一的 JavaScript 线程,其他所有请求都要等它完成。
常见问题
Node.js 是前端还是后端?
主要是后端。Node.js 运行在服务器或你自己的电脑上,而不是访问者的浏览器里。不过前端开发者每天也在用它,因为 npm、Vite 和 ESLint 这些工具都是 Node.js 程序。
Node.js 是谁在什么时候创建的?
Ryan Dahl 在 2009 年发布了 Node.js。它现在由 OpenJS 基金会维护,每六个月发布一个新的主版本,偶数版本会获得长期支持。
学 Node.js 之前需要先懂 JavaScript 吗?
需要,至少要掌握基础:变量、函数、对象、数组,以及回调或 Promise。Node.js 增加的是 API,而不是新的语法,所以你学到的语言知识都可以直接用上。
Node.js 是单线程的吗?
你的 JavaScript 代码运行在一个线程上。Node.js 在幕后用一个小线程池来处理文件系统操作、DNS 和部分加密运算,所以缓慢的 I/O 在等待时不会阻塞你的代码。