Node.js 简介
学了 JavaScript,你只能写浏览器里的代码——可后端呢?数据库呢?部署到服务器呢?Node.js 的出现回答了这个问题。这一章我们先搞清楚 Node 到底是什么、怎么来的、为什么它能让 JS 跑到服务器上。
Node.js 是什么?
Node.js(简称 Node)不是一门语言,也不是框架,而是一个JavaScript 运行时(runtime)。它把 Chrome 浏览器的 V8 JavaScript 引擎"抠"出来,套上一层用 C++ 写的底层能力(文件读写、网络通信、操作系统接口),让 JS 能脱离浏览器、直接在电脑上运行。
浏览器里的 JS 能操作 DOM、能发请求,但不能读写本地文件、不能监听端口、不能调用系统命令——这些都被浏览器沙箱限制着。Node.js 解开了这些束缚:它把操作系统级的能力暴露给 JS,让你用同一门语言写后端服务、CLI 工具、甚至桌面软件。
诞生历史:Ryan Dahl 的"不满"
Node 的诞生源于一位美国工程师 Ryan Dahl 对当时 Web 服务器的三点不满:
- 并发模型太重:Apache、Tomcat 这种传统服务器,每来一个请求就开一个线程或进程,每个线程占几 MB 内存,并发一高内存就吃紧。
- I/O 操作太浪费:一个请求查数据库要等几十毫秒,这期间整个线程"卡住"白等 CPU 空转,极度低效。
- 前后端语言割裂:前端写 JS、后端写 PHP/Java,没法复用代码和思维。
2009 年,他在欧洲 JS 大会(JSConf EU)上发布了 Node.js,用 V8 引擎 + 单线程事件循环 + 非阻塞 I/O 的模型解决了上述痛点。这场 20 分钟的演讲,直接催生了一个价值几十亿美元的生态。同年 npm(Node 包管理器)也诞生了,让"装一个库就几秒钟"成为现实。
核心特点
- 单线程:Node 主线程只有一个,你写的 JS 都跑在这一个线程上。不像 Java/PHP 每请求开一个线程。
- 事件循环(Event Loop):遇到 I/O 操作(读文件、查库、发请求)不阻塞主线程,把它交给底层异步执行,完成后通过事件循环通知主线程处理回调。
- 非阻塞 I/O:I/O 操作全部异步,单机能轻松扛住上万并发连接,适合聊天、API 网关、实时推送等场景。
- 极速 V8 引擎:和 Chrome 同款 JS 引擎,JS 代码被即时编译(JIT)成机器码,执行速度极快。
- 跨平台:Windows、macOS、Linux 都能跑,部署灵活。
- npm 生态:世界上最大的开源软件仓库,上百万个第三方库,几乎你想要的功能都有现成包。
第一个 Node 程序
Node 程序就是一个 .js 文件,用 node 文件名 运行。下面这个例子用到了内置的 os 模块——浏览器 JS 是绝对访问不到这些系统信息的:
// 把以下代码保存为 hello.js
console.log("Hello, Node.js!");
// 用终端运行(不是浏览器控制台):
// node hello.js
// 输出: Hello, Node.js!
// Node 内置模块直接 require 就能用,不装任何东西
const os = require("os");
console.log("当前系统:", os.platform(), os.hostname());
console.log("CPU 核心数:", os.cpus().length);把代码保存为 hello.js,在终端里执行 node hello.js(不是在浏览器 Console 里),就能看到输出。这就是 Node 和浏览器 JS 的本质区别:Node 让 JS 拥有了操作系统级的能力。
事件循环:Node 的"心脏"
理解 Node 必须理解事件循环。看下面这个经典例子,记住执行顺序:
// 单线程 + 事件循环的演示
console.log("1. 同步代码开始");
// 异步:不会阻塞主线程,先注册回调继续往下
setTimeout(() => {
console.log("3. 定时器回调(宏任务)");
}, 0);
Promise.resolve().then(() => {
console.log("2. Promise 回调(微任务)");
});
console.log("4. 同步代码结束");
// 实际输出顺序:1 → 4 → 2 → 3
// 同步代码先跑完 → 微任务(Promise)→ 宏任务(setTimeout)关键认知:Node 主线程只有一个。同步代码从上到下执行,遇到 setTimeout、Promise、fs.readFile 这种异步 API 时,主线程不会等,而是把回调注册到底层,自己继续往下跑。等同步代码全跑完,事件循环再依次取出"已完成"的异步回调执行。这种模型在网络 I/O 密集场景表现极好——单线程也能扛高并发。
但它的固有局限也要牢记:绝不要在主线程做耗 CPU 的同步运算(比如循环算 1 亿次)。主线程一旦被卡住,所有请求都堵死。耗 CPU 的活要开子线程(worker_threads)或交给别的服务。
Node vs 浏览器 JS
两者用的是同一门语言(JavaScript),但运行环境和能用的 API 完全不同:
- 全局对象:浏览器是
window/document;Node 是global(Node 21+ 也支持globalThis),没有window和document。 - DOM:浏览器有,Node 没有(没法操作网页,因为它压根不渲染页面)。
- 文件系统:浏览器出于安全不能读写本地文件;Node 可以任意读写(它就跑在你电脑上,有你账号的全部权限)。
- 网络:浏览器只能发 HTTP 请求(受同源策略限制);Node 可以监听端口、起 TCP/HTTP 服务器、收发原始 socket。
- 模块:浏览器原生用 ESM(
import);Node 历史上用 CommonJS(require),现在也支持 ESM。
Node 都用在哪?典型应用场景
Node 适合"I/O 密集、高并发、实时"的场景,不太适合"CPU 密集"的场景。明星项目和用例:
- Web 后端 API:用 Express/Koa/NestJS 写 RESTful API、GraphQL 服务。Netflix、PayPal、LinkedIn 都在用。
- 实时通信:聊天室、协作编辑器(类似 Google Docs)、多人在线游戏。Socket.io 是经典库。
- 前端工程化:Webpack、Vite、Rollup、ESLint、Prettier、TypeScript 编译器——前端所有构建工具几乎都是 Node 写的。
- 命令行工具(CLI):gh(GitHub CLI)、nodemon、pm2、vue-cli、create-react-app。
- 桌面应用:Electron 把 Node + Chromium 打包成桌面软件,VS Code、Slack、Discord 都是这么做出来的。
- 服务端渲染(SSR):Next.js、Nuxt.js 用 Node 在服务端渲染前端框架,提升首屏速度和 SEO。
- 微服务与网关:API 网关、BFF(Backend For Frontend)层。
Node vs 其他后端语言
- vs Java:Java 适合大型企业系统,生态成熟、类型严谨;Node 启动快、写起来轻、前端能直接写后端,但大型项目代码组织不如 Java 严格。
- vs Python:Python 强在数据科学、AI、脚本;Node 强在高并发 Web 服务和前端工程化。性能上 Node 通常更快。
- vs Go:Go 性能更强、并发模型更优雅、单文件部署;Node 生态更丰富、上手更快、前端复用。CPU 密集场景 Go 完胜。
- vs PHP:PHP 部署简单(配个 Nginx 就行)、传统托管便宜;Node 性能更好、实时能力更强,但部署略复杂(要自己管进程)。
该不该学 Node?
如果你的方向是前端工程师、全栈、DevOps、或想做自己的产品,Node 几乎是必修课。它会让你从"只能写页面"升级为"能独立做出完整应用"——前端、后端、构建工具、CLI 一人包办。学完本系列,你将能用 Node 写一个完整的 Web API 服务、读懂主流框架源码、构建自己的 CLI 工具,为后续学 Express/Koa/NestJS、Next.js 打下地基。
← 返回 Node.js 教程目录
下一篇 Node.js 环境安装 →