Node.js
基于 V8、用于服务器、命令行工具和网络应用的跨平台 JavaScript 运行时。
项目概述
Node.js 把 JavaScript 带到浏览器之外,以事件循环和非阻塞 I/O 支撑网络服务、自动化工具与完整的 npm 生态,是现代 Web 开发最成熟的基础运行时之一。
Node.js 是采用 MIT 许可证的开源、跨平台 JavaScript 运行时,由 OpenJS Foundation 下的项目治理体系和全球贡献者共同维护。它在浏览器之外运行 V8 JavaScript 引擎,通过 libuv 提供事件循环、异步文件与网络 I/O,并在单个进程中高效处理大量并发连接。Node.js 同时提供文件系统、HTTP、Stream、Crypto、Worker Threads、测试和诊断等核心模块,并以 npm 与 package.json 连接庞大的第三方软件生态。生产应用应优先选择官方仍受支持的 LTS 版本;本页核验时 v24 Krypton 是推荐的 LTS 主线,v26 为 Current。
主要特点
Node.js 把成熟的 JavaScript 引擎、异步系统能力和包生态组合为通用的服务器端运行平台。
事件驱动与非阻塞 I/O
事件循环配合异步文件、网络和 DNS 接口,让一个进程可以在等待外部资源时继续处理其他工作,适合高并发 I/O 场景。
V8 与跨平台运行
使用 Chrome 的 V8 引擎执行现代 JavaScript,并为 Linux、macOS、Windows 等平台提供官方二进制文件。
完整的核心模块
内置 HTTP、HTTP/2、TLS、Stream、Buffer、File System、Crypto、Process、URL、WebSocket 与 SQLite 等系统和网络能力。
npm 与 package.json 生态
通过 npm Registry、语义化版本、锁文件、脚本和 Workspaces 使用数量庞大的库、框架及开发工具。
CommonJS 与 ES Modules
同时支持 require 的 CommonJS 和标准 import/export,并通过 package.json 的 type、exports 与 imports 明确包边界。
Stream、Buffer 与背压
以流式接口处理文件、压缩、网络和大体积数据,避免一次性把所有内容加载到内存,并在生产者和消费者之间传递背压。
并行与进程能力
可使用 Worker Threads 处理适合并行计算的 JavaScript 任务,也能通过 Child Process 和 Cluster 连接外部程序或利用多核。
内置测试与诊断工具
node:test、断言、Mock、代码覆盖率、Inspector、性能钩子、诊断报告和 AsyncLocalStorage 覆盖基础测试与可观测需求。
适用场景
从轻量脚本到大规模网络服务,Node.js 尤其适合 I/O 密集、需要共享 Web 技术栈或依赖 npm 生态的项目。
Web API 与后端服务
适合 REST、GraphQL、Webhook、认证服务和面向前端的 BFF,可搭配 Fastify、Express、NestJS 等框架。
实时与长连接应用
事件驱动模型适合聊天、协作、通知、游戏网关和其他 WebSocket 或持续连接服务。
命令行与自动化工具
文件、进程和网络 API 加上 npm 分发能力,适合构建脚手架、代码生成器、CI 工具和运维脚本。
全栈 JavaScript 应用
前后端共享 JavaScript 或 TypeScript、校验 Schema 和领域类型,降低团队在多语言之间切换的成本。
流式数据处理
Stream 与 Buffer 适合代理、上传下载、日志管线、压缩和逐块转换等不应一次性占用大量内存的任务。
Serverless 与容器工作负载
广泛的云平台、容器镜像、监控和 CI 支持,使其适合函数、微服务及传统长驻进程等多种交付方式。
优点与注意事项
技术选型不仅要看能力,也要理解它带来的团队成本。
主要优点
Node.js 擅长的地方
- 生态规模大,Web 框架、数据库客户端、SDK 和开发工具选择丰富
- 浏览器与服务器可以共享 JavaScript、TypeScript 经验和部分业务模型
- 非阻塞 I/O 对 API、代理和实时连接等场景非常合适
- Linux、macOS、Windows、容器与主流云平台的支持成熟
- LTS 发布策略、升级文档和生产运维经验相对完善
- 既能使用低层核心模块,也能按需要选择不同抽象程度的框架
需要注意
采用前应考虑的问题
大型计算、同步加密和复杂序列化会延迟同一进程内的其他请求,应拆分工作、使用 Worker Threads、任务队列或独立计算服务。
未设置超时、无限并发、未处理背压或过度串行 await 都可能降低吞吐,需要结合压力测试、指标和性能分析调整。
npm 包数量多且依赖树可能很深,应使用锁文件、审计、最小依赖、可信发布和更新流程降低恶意包与维护中断风险。
模块类型、文件扩展名、条件导出和默认导入行为可能造成兼容问题,库作者应明确 exports,应用应统一模块策略。
Node.js 进程默认继承操作系统用户权限;可选 Permission Model 只用于约束受信任代码的意外访问,不能抵御恶意代码绕过。
EOL 版本不再接收常规安全修复。升级主版本前应验证 Node-API 插件、构建工具、监控探针和托管平台支持。
现代 Node.js 能直接擦除并运行部分 TypeScript 类型语法,但不会类型检查,也不读取 tsconfig 完成完整转换;复杂项目仍需 TypeScript 或 tsx 等工具。
快速开始
使用原生 HTTP、Fetch 和 node:test 构建一个不依赖第三方框架的最小 JSON API。
bashnode --version
npm --version
mkdir hello-node
cd hello-node
npm init -y
npm pkg set type=modulejavascript// app.js
import { createServer } from "node:http";
function sendJson(response, status, body) {
response.writeHead(status, {
"content-type": "application/json; charset=utf-8",
});
response.end(JSON.stringify(body));
}
export function createApp() {
return createServer((request, response) => {
const url = new URL(request.url ?? "/", "http://localhost");
if (request.method === "GET" && url.pathname === "/health") {
return sendJson(response, 200, { status: "ok" });
}
if (request.method === "GET" && url.pathname === "/api/hello") {
const name = url.searchParams.get("name") ?? "World";
return sendJson(response, 200, {
message: `Hello, ${name}!`,
runtime: "Node.js",
});
}
return sendJson(response, 404, { error: "Not found" });
});
}javascript// server.js
import { createApp } from "./app.js";
const port = Number(process.env.PORT ?? 3000);
const server = createApp();
server.listen(port, "127.0.0.1", () => {
console.log(`http://127.0.0.1:${port}`);
});
function shutdown(signal) {
console.log(`${signal}: closing server`);
server.close((error) => {
process.exitCode = error ? 1 : 0;
});
}
for (const signal of ["SIGINT", "SIGTERM"]) {
process.on(signal, () => shutdown(signal));
}javascript// app.test.js
import assert from "node:assert/strict";
import test from "node:test";
import { createApp } from "./app.js";
test("GET /api/hello returns JSON", async (context) => {
const server = createApp();
await new Promise((resolve) => {
server.listen(0, "127.0.0.1", resolve);
});
context.after(() => server.close());
const address = server.address();
const response = await fetch(
`http://127.0.0.1:${address.port}/api/hello?name=Ada`,
);
assert.equal(response.status, 200);
assert.deepEqual(await response.json(), {
message: "Hello, Ada!",
runtime: "Node.js",
});
});json{
"type": "module",
"scripts": {
"dev": "node --watch server.js",
"start": "node server.js",
"test": "node --test"
}
}bashnpm test
npm run dev
# 在另一个终端验证接口
curl "http://127.0.0.1:3000/api/hello?name=Ada"
curl "http://127.0.0.1:3000/health"下一步:生产环境优先采用仍受支持的 LTS 主线并锁定依赖;为请求设置超时和大小限制,把 CPU 密集任务移出事件循环,并在升级 Node.js 主版本前验证原生模块、监控工具和部署平台。
类似项目
这些运行时同样可以执行服务端 JavaScript,但在兼容性、安全模型、工具集成和部署形态上有所不同。
Node.js vs Deno
Node.js 和 Deno 都使用 V8 执行服务端 JavaScript。Node.js 以兼容性、npm 生态和长期生产实践见长,Deno 则更强调 Web 标准、默认权限隔离和一体化工具链。
| 比较维度 | Node.js | Deno |
|---|---|---|
| 项目定位 | 成熟、通用的跨平台 JavaScript 运行时 | 现代化 JavaScript / TypeScript 运行时与工具链 |
| TypeScript | 可擦除部分类型语法;完整支持通常使用额外工具 | 直接执行 TypeScript,并以 deno check 独立检查类型 |
| 安全权限 | 默认继承系统权限,可选 Permission Model | 敏感 I/O 默认拒绝,运行时显式授权 |
| 工具链 | 提供 npm 与核心工具,常组合第三方格式化和 Lint 工具 | 内置 fmt、lint、test、bench、doc 与 compile |
| 依赖管理 | package.json、npm Registry、锁文件和 node_modules | deno.json、JSR、npm 兼容与全局缓存 |
| 模块兼容 | 同时承载庞大的 CommonJS 与 ESM 生态 | 以 ESM 为主,并提供 Node.js 与 npm 兼容层 |
| 生产生态 | 云平台、监控、框架、人才和案例覆盖广 | 生态较小,但工具和运行时体验更统一 |
| 更适合 | 依赖成熟 npm 生态、广泛平台支持和长期运维经验的系统 | 重视 TypeScript、Web 标准和最小权限的新服务与工具 |
已有服务深度依赖 npm 包、原生扩展、成熟监控或企业部署平台时,Node.js 通常是更稳妥的默认选择;新建 TypeScript 服务或自动化工具、希望减少工具拼装并严格控制 I/O 权限时,可以重点评估 Deno。无论选择哪一个,都应使用仍受支持的版本,并以真实依赖、负载和部署目标验证兼容性。
资料核验
版本、维护信息与本页采用的官方资料来源。
本页依据 Node.js 官方学习资料、当前 API 文档、版本支持页面和 nodejs/node 仓库整理。快速开始以仍受支持的 LTS 能力为基线,采用 ES Modules、原生 HTTP、Fetch 与稳定的 node:test;生产环境应优先选择官方 LTS,并在升级前再次核对最新版本、弃用项和安全公告。
官方仓库未归档,核验时最近可见的代码活动日期为 2026 年 7 月 25 日。该状态表示项目近期仍有公开维护活动,不代表固定发布频率或长期支持承诺。