Menu

Node.js 是什么?JavaScript 运行时详解

Node.js 是一个运行时,能在浏览器之外运行 JavaScript,比如在服务器上和终端里。它不是一门语言,也不是一个框架:它由 V8、事件循环,以及操作文件、网络和进程的 API 组成。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

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、localStoragefs、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 在等待时不会阻塞你的代码。

Coddy 编程语言插图

和 Coddy 一起学编程

开始