一句话导读:Node.js 让 JavaScript 走出了浏览器,也让"用一种语言写全栈"从口号变成了日常。这篇文章不谈玄学,只回答一个问题——一个普通人,该按什么顺序、用什么方法,把 Node.js 从"会用"学到"精通"? 从装好第一个环境,到写出能扛住真实流量的服务,每一步都配有可运行的代码和可对照的时间表。
目录
- 一、Node.js 到底是什么
- 二、2026 年的 Node.js:从"运行时"长成"全栈平台"
- 三、一张图看懂学习路径
- 四、阶段一:环境搭建与第一个程序
- 五、阶段二:JavaScript 后端基础与核心模块
- 六、阶段三:包管理与工程化
- 七、阶段四:Web 框架与后端核心能力
- 八、阶段五:进阶能力(并发、类型、测试、性能、安全)
- 九、阶段六:精通之路
- 十、新手最容易踩的 5 个坑
- 十一、值得收藏的学习资源清单
- 十二、一份可执行的学习时间表
- 结语
一、Node.js 到底是什么
如果只用一句话概括:Node.js 是一个让 JavaScript 能脱离浏览器、直接跑在操作系统上的运行时环境。
在它出现之前,JavaScript 的舞台只有网页,它的活动范围被锁死在浏览器窗口里,碰不到文件、开不了网络服务。Node.js 把它"解放"了出来——同样一套语言,现在既能操作文件系统,也能启动一个 Web 服务器,甚至去连数据库。
它内部其实是两样东西的组合:
- V8 引擎:Google 为 Chrome 开发的 JavaScript 引擎,负责把 JS 代码编译成机器指令。Node.js 借用了它,也就白嫖了 V8 极快的执行速度。
- libuv 库:负责处理异步 I/O 的"幕后管家"。文件读写、网络请求这些耗时操作,都由它交给系统底层去并行处理。
这也解释了 Node.js 最常被提到的那个特点——单线程 + 非阻塞 I/O。主线程只有一条,但它绝不"傻等":遇到耗时的 I/O 操作,就交给 libuv 去后台办,自己继续往下执行,办完再回来处理结果。这种"你不等它、它不等你"的协作方式,让 Node.js 特别擅长处理大量并发连接,比如聊天室、实时看板、API 网关。
它的典型用武之地包括:
| 应用场景 | 说明 | 代表案例 |
|---|---|---|
| Web 后端 API | 高并发、I/O 密集的接口服务 | 各类 App 的服务端 |
| 前端工程化 | 打包、编译、脚手架等工具链 | Vite、Webpack |
| 实时通信 | 长连接、消息推送 | 在线协作、IM |
| BFF 层 | 聚合多个后端服务,专供前端调用 | 中大型前端项目 |
| 命令行工具 | 一次性脚本、自动化工具 | CLI 脚手架 |
| 桌面/边缘计算 | 配合 Electron、Edge Runtime | 桌面应用、边缘函数 |
一句话总结:凡是"等待多、计算少"的场景,都是 Node.js 的主场。
二、2026 年的 Node.js:从"运行时"长成"全栈平台"
如果还拿几年前的老印象看待它,你可能会错过过去两年最值得关注的变化。2026 年的 Node.js,已经从"跑 JS 的容器",升级成了一个自带测试、自带数据库、自带类型支持、自带安全管控的完整开发平台。
2.1 先认清版本:别装错,也别用错
Node.js 的版本分两个流派:偶数版本会进入长期支持(LTS),奇数版本只做尝鲜、不转正。生产环境请认准 LTS。
| 版本 | 状态 | 首次发布 | 建议使用场景 |
|---|---|---|---|
| Node.js 26 | Current(最新) | 2026-05-05 | 尝鲜新特性、个人试验项目 |
| Node.js 24(Krypton) | Active LTS(推荐) | 2025-05-06 | 新项目首选 |
| Node.js 22(Jod) | Maintenance LTS | 2024-04-24 | 生产环境、存量项目 |
| Node.js 20(Iron) | 已结束支持(EOL) | 2023-04-17 | 建议尽快升级 |
实用建议:新项目直接上 Node.js 24 LTS。它既稳定,又包含了下面要讲的绝大多数新能力。Node.js 26 属于"最新但不保证稳定"的尝鲜线,别往生产里塞。
2.2 那些"终于不用再装第三方包"的内置能力
这是 2026 年 Node.js 最让人舒服的进步:一大批过去必须靠 npm 包解决的事情,如今一句 node: 开头就能搞定。
- 原生
fetch:发 HTTP 请求不再需要 axios 或 node-fetch 打底。 - 内置测试运行器
node:test:跑单元测试不用再装 Jest,一行node --test就够。 - 内置 SQLite(
node:sqlite):轻量项目直接用数据库,不必再引入 better-sqlite3。 - 原生 TypeScript 支持:Node.js 会直接"剥离类型"运行
.ts文件,很多场景下不再需要 ts-node 或 tsx 编译中转。 --watch监听模式:改完代码自动重启,替代 nodemon。--env-file加载环境变量:.env文件原生读取,替代 dotenv。fs.glob:按通配符批量找文件,替代 glob 之类的工具。
一个典型对比,过去删个目录得装 rimraf,现在原生一行解决:
import { rmSync } from 'node:fs';
// 曾经的 rimraf:跨平台递归删除目录
// 现在用 Node 原生 API 即可,语义完全对齐
rmSync('dist', { recursive: true, force: true });
2.3 两条值得关注的技术前沿
- 类型直接运行:在 Node.js 24 上,你可以直接
node app.ts。它只做"类型擦除",不生成额外代码,所以启动快、也不需要 source map。完整类型检查仍然交给 TypeScript 编译器,但日常开发省下了一道编译步骤。 - FFI 默认开启:从 Node.js 26.9 起,
node:ffi无需任何标志即可调用本地 C 库。这意味着以后想在 JS 里调用一个现成的原生库,不必再大费周章写 C++ 扩展。
2.4 安全:权限模型登场
过去 Node.js 进程一旦跑起来,就默认拥有完整权限,一个恶意依赖几乎可以为所欲为。如今 Node.js 提供了权限模型,可以像给 App 授权一样,精确控制它能碰什么:
# 只允许读取 ./data 目录、只允许访问指定域名的网络node --permission --allow-fs-read=./data --allow-net=api.example.com app.js
在 npm 供应链攻击频发的今天,这层"运行时护栏"值得每一个生产项目认真对待。
三、一张图看懂学习路径
学 Node.js 最忌讳的,是"东一榔头西一棒槌"。下面这张地图,把整条路拆成六个阶段,你只需按顺序推进。
阶段一 环境搭建 → 装好 Node、写出第一个程序
↓
阶段二 JS 基础 + 核心模块 → 模块系统 / fs / http / 事件循环
↓
阶段三 包管理与工程化 → npm / package.json / 依赖治理
↓
阶段四 Web 框架与后端 → 路由 / 中间件 / 数据库 / 认证
↓
阶段五 进阶能力 → 并发 / TypeScript / 测试 / 性能 / 安全
↓
阶段六 精通之路 → 架构 / 可观测性 / 部署 / 读源码
下面逐阶段展开。
| 阶段 | 核心目标 | 关键产出 | 建议时长 |
|---|---|---|---|
| 一、环境搭建 | 跑通第一个程序 | 可用的本地开发环境 | 0.5 天 |
| 二、基础与核心模块 | 懂模块与异步 | 手写 HTTP 服务 | 1–2 周 |
| 三、包管理工程化 | 会管理依赖 | 规范的项目骨架 | 1 周 |
| 四、框架与后端 | 能写完整接口 | 一个 RESTful API 项目 | 3–4 周 |
| 五、进阶能力 | 会调优与保障质量 | 带测试与监控的服务 | 4–6 周 |
| 六、精通之路 | 能设计系统 | 高可用架构实践 | 持续 |
四、阶段一:环境搭建与第一个程序
4.1 装 Node.js
最省心的方式是安装 nvm(Node Version Manager),它让你在多个 Node 版本之间随手切换,避免"项目 A 要用 18、项目 B 要用 24"的尴尬。
# macOS / Linux:安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash安装并使用最新的 LTS 版本
nvm install 24
nvm use 24
验证
node -v
npm -v
Windows 用户可以使用 nvm-windows,或者直接用官网安装包。团队协作时,记得在项目根目录放一个.nvmrc文件,写上版本号,别人一条nvm use就能对齐环境。
4.2 写出第一个程序
新建一个 hello.js:
// hello.js
console.log('Hello, Node.js!');
console.log('当前运行版本:', process.version);
console.log('当前工作目录:', process.cwd());
然后运行它:
node hello.js
你会看到终端打印出版本号和目录——到这里,环境就算通了。process 是 Node.js 提供的全局对象,藏着进程、环境变量、平台信息等一堆有用的东西,后面会反复用到。
4.3 试试交互式命令行
直接输入 node 回车,就会进入 REPL(读取—求值—输出循环),像一个随手可用的 JS 计算器:
node1 + 2
3
['a', 'b'].map((x) => x.toUpperCase())
[ 'A', 'B' ]
调试小片段、验证一个语法,用 REPL 比新建文件快得多。
五、阶段二:JavaScript 后端基础与核心模块
这一阶段是分水岭。很多人急着上框架,结果遇到问题就抓瞎——因为框架封装掉的,恰恰是最该懂的东西。
5.1 后端必备的 JavaScript 底子
你不需要复习前端那些 DOM 操作,但下面这些必须吃透:
- ES6+ 语法:解构、展开、类、模板字符串、可选链
?.、空值合并??。 - Map / Set:处理去重、字典映射比普通对象更趁手。
- 异步三件套:从回调函数到 Promise,再到
async / await——理解后者只是前者的语法糖。 - 错误处理:
try / catch、Promise 的.catch、以及"未捕获的 Promise 拒绝"到底会发生什么。
更重要的是事件循环(Event Loop),它是 Node.js 的灵魂。记住一句话:
同步代码最先跑,微任务紧随其后,宏任务排在最后。
用一段代码验证一下:
console.log('1 同步开始');setTimeout(() => console.log('4 宏任务 setTimeout'), 0);
Promise.resolve().then(() => console.log('3 微任务 Promise'));
console.log('2 同步结束');
// 实际输出顺序:1 -> 2 -> 3 -> 4
即使 setTimeout 的延迟写成 0,它也会排在所有微任务之后。搞懂这个顺序,未来排查"代码执行结果和我想的不一样"就会轻松许多。
而"阻塞事件循环"是 Node.js 的头号大忌——任何一段耗时的同步计算(比如超大的 for 循环)都会让整个服务卡住。这个坑我们放到第十节细讲。
5.2 模块系统:CommonJS 与 ES Modules
Node.js 历史上用过两套模块系统,理解它们是你读懂任何项目的前提。
- CommonJS(CJS):老资格,用
require/module.exports。 - ES Modules(ESM):现代标准,用
import/export,也是官方推荐的方向。
同一个功能,两种写法对比:
// CommonJS 写法
const { readFile } = require('node:fs/promises');readFile('./package.json', 'utf8').then((text) => {
console.log(text);
});
// ES Modules 写法(推荐)
import { readFile } from 'node:fs/promises';const text = await readFile('./package.json', 'utf8');
console.log(text);
要让项目启用 ESM,只需在 package.json 里加一行 "type": "module":
{
"name": "my-app",
"version": "1.0.0",
"type": "module",
"scripts": {"start": "node src/index.js",
"dev": "node --watch src/index.js"
}
}
5.3 几个必须掌握的核心模块
Node.js 把常用能力都做成了内置模块,加 node: 前缀即可引入,无需安装:
node:fs:文件读写。推荐用fs/promises的异步版本。node:path:路径拼接与解析,跨平台兼容的关键。node:events:事件发布订阅,Node 大量模块都基于它。node:stream:流式处理大文件,避免一次性读进内存。node:http:构建 Web 服务的基石。
先看看事件模块的用法,它体现了 Node.js 的"事件驱动"哲学:
import { EventEmitter } from 'node:events';const bus = new EventEmitter();
// 订阅事件
bus.on('order:paid', (order) => {
console.log(收到支付成功事件:${order.id},金额 ${order.amount} 元);
});
// 发布事件
bus.emit('order:paid', { id: 'A1001', amount: 199 });
5.4 小实战:不借框架,手写一个 HTTP 服务
这一步非常重要——只有亲手用原生模块写过服务,你才会明白框架到底帮你省了什么。
import { createServer } from 'node:http';const server = createServer((req, res) => {
// 一个健康检查接口
if (req.url === '/api/health') {
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ status: 'ok', time: Date.now() }));
return;
}
// 其余路径一律 404
res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('页面不存在');
});
server.listen(3000, () => {
console.log('服务已启动:http://localhost:3000');
});
运行 node server.js,浏览器打开 http://localhost:3000/api/health,你会看到一段 JSON。这一刻,你已经站在了所有 Node.js Web 框架的原点上。
六、阶段三:包管理与工程化
Node.js 的强大,一半来自语言,另一半来自 npm——全球最大的开源软件仓库。
6.1 常用命令速查
npm init -y # 初始化项目,生成 package.json
npm install fastify # 安装运行时依赖
npm install --save-dev tsx # 安装开发期依赖
npm ls --depth=0 # 只看直接依赖
npm why rimraf # 追溯某个包到底是谁引入的
npm outdated # 检查依赖是否过期
npm audit # 扫描已知安全漏洞
6.2 读懂 package.json 与语义化版本
package.json 是项目的身份证。里面最容易被忽视、却最容易出问题的,是版本号里的那些符号:
{
"dependencies": {"fastify": "^5.0.0"
}
}
5.0.0是主版本.次版本.修订号。^5.0.0表示"允许装 5.x.x 的最新版,但不跨到 6.0.0"。~5.0.0更保守,只允许 5.0.x。- 锁死版本则直接写
5.0.0,不写任何符号。
package-lock.json 一定要提交到版本库。它记录了你安装时每个包的确切版本,是"我这儿能跑,你那儿也能跑"的唯一保障。6.3 给依赖做减法:2026 年的新思路
一个健康的项目,不该背着一堆没必要的包。2026 年,很多老牌工具都可以"退休"了:
| 过去常装的包 | 现在可以用什么替代 |
|---|---|
| rimraf | 原生 fs.rm(path, { recursive: true }) |
| node-fetch / axios(简单场景) | 原生 fetch |
| dotenv | node --env-file=.env |
| nodemon | node --watch |
| jest(简单断言场景) | 原生 node:test |
| better-sqlite3(轻量场景) | 原生 node:sqlite |
用原生 fetch 发个请求试试,简洁得让人感动:
const res = await fetch('https://api.github.com/repos/nodejs/node');
const data = await res.json();
console.log('Node.js 仓库星标数:', data.stargazers_count);
判断要不要新增一个依赖,可以问自己一句:"它的能力,我一句话说不清、又确实替代不了吗?" 说不清,那就先别加。
七、阶段四:Web 框架与后端核心能力
到了这里,你终于可以正大光明地使用框架了。
7.1 框架怎么选:一张表看清
Node.js 的框架梯队非常清晰,没有"最好",只有"最合适":
| 框架 | 定位 | 学习曲线 | 适用场景 |
|---|---|---|---|
| Express | 老牌、生态最大 | 低 | 接手老项目、快速原型 |
| Koa | 轻量、洋葱模型中间件 | 低 | 追求现代写法的个人项目 |
| Fastify | 性能怪兽、内置校验 | 中 | 高并发 API、新项目默认之选 |
| NestJS | 企业级、依赖注入 | 高 | 多人协作的中大型系统 |
| Hono | 极轻、多运行时 | 低 | 边缘计算、轻量 API |
如果你只记一句话:新项目优先考虑 Fastify,大型团队协作选 NestJS。
7.2 用 Fastify 写一组接口
import Fastify from 'fastify';const app = Fastify({ logger: true });
// 定义路由:GET /users/:id
app.get('/users/:id', async (request, reply) => {
const { id } = request.params;
return { id, name: '张三', role: 'admin' };
});
// 定义带 schema 校验的接口,请求体不合法会自动报错
app.post('/users', {
schema: {
body: {
type: 'object',
required: ['name'],
properties: {
name: { type: 'string' },
age: { type: 'number' }
}
}
}
}, async (request) => {
return { created: true, user: request.body };
});
await app.listen({ port: 3000 });
Fastify 的"schema 即校验"是个亮点:你声明了请求体长什么样,校验和类型就自动有了,省去大量手写的判断代码。
7.3 当团队变大:NestJS 的结构感
NestJS 借鉴了 Spring 和 Angular 的思想,用模块、控制器、服务、依赖注入把代码"框"得整整齐齐。小项目会嫌它重,但项目一变大,这种规范就是救命的。
import { Controller, Get, Param } from '@nestjs/common';
import { UsersService } from './users.service';@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get(':id')
findOne(@Param('id') id: string) {
// 业务逻辑交给 Service,控制器只负责"接客"
return this.usersService.findOne(id);
}
}
7.4 数据库:选型与存取
后端开发本质是"数据的搬运与存储"。数据库能力直接决定你的天花板。
- 关系型:MySQL、PostgreSQL。必学 SQL 语法、索引原理、事务。
- 文档型:MongoDB,配合 Mongoose。
- 轻量嵌入式:SQLite。2026 年 Node.js 已内置,小项目零配置起步。
一个有意思的新变化是:轻量场景下,直接用内置的 node:sqlite 就够:
import { DatabaseSync } from 'node:sqlite';const db = new DatabaseSync(':memory:');
db.exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
db.prepare('INSERT INTO users (name) VALUES (?)').run('张三');
const row = db.prepare('SELECT * FROM users WHERE id = ?').get(1);
console.log(row); // { id: 1, name: '张三' }
中大型项目则推荐上 ORM。Prisma 类型安全、开发体验极佳;Drizzle 轻量、贴近 SQL,都是 2026 年的热门选择。
7.5 认证与安全:JWT 入门
用户身份认证是后端绕不开的一课。JWT(JSON Web Token)是目前最主流的无状态方案之一:
import jwt from 'jsonwebtoken';// 签发令牌
const token = jwt.sign({ uid: 42 }, process.env.JWT_SECRET, { expiresIn: '2h' });
// 校验令牌
const payload = jwt.verify(token, process.env.JWT_SECRET);
console.log('用户 ID:', payload.uid);
密钥 JWT_SECRET 必须放在环境变量里,绝不能硬编码进代码。除此之外,还要养成校验一切用户输入的习惯——永远不要相信前端传来的数据。八、阶段五:进阶能力
走到这里,你已经能独立开发一个完整的后端系统了。接下来是从"能用"到"好用、稳"的跨越。
8.1 并发:别让 CPU 卡住全世界
Node.js 是单线程的,一段密集计算就会拖垮整个服务。解决办法有两个:
- Worker Threads:把计算丢到独立线程,主线程继续接客。
- Cluster:启动多个进程,充分利用多核 CPU。
Worker Threads 的经典用法:
import { Worker, isMainThread, parentPort } from 'node:worker_threads';if (isMainThread) {
// 主线程:派活给 worker
const worker = new Worker(new URL(import.meta.url));
worker.on('message', (sum) => console.log('计算结果:', sum));
worker.postMessage(10_000_000);
} else {
// 子线程:默默干活
parentPort.on('message', (n) => {
let sum = 0;
for (let i = 1; i <= n; i += 1) sum += i;
parentPort.postMessage(sum);
});
}
8.2 流(Stream):优雅地处理大文件
如果要处理一个 10GB 的日志,一次性读进内存必然崩溃。流的思想是"边读边处理",内存占用恒定:
import { createReadStream, createWriteStream } from 'node:fs';
import { createGzip } from 'node:zlib';
import { pipeline } from 'node:stream/promises';// 把大文件一边读、一边压缩、一边写,全程不占大内存
await pipeline(
createReadStream('big.log'),
createGzip(),
createWriteStream('big.log.gz')
);
console.log('压缩完成');
8.3 TypeScript:从"可选"到"标配"
2026 年,TypeScript 已经是后端开发的默认选项。它能让你在编译期就发现类型错误,而不是等线上崩了才知道。
好消息是,现在的体验空前顺滑——Node.js 可以直接运行 .ts 文件:
# 直接执行,无需先编译
node app.ts
它做的是"类型擦除":把类型标注抹掉后直接跑,速度快、也不需要 source map。注意:它只剥离类型,不做类型检查,所以仍需在 CI 里跑一次 tsc --noEmit 来保证类型正确。
8.4 测试:内置运行器就够用
写测试不再需要复杂配置。Node.js 自带的 node:test 简单直接:
import { test } from 'node:test';
import assert from 'node:assert/strict';function add(a, b) {
return a + b;
}
test('add 应该返回两数之和', () => {
assert.equal(add(2, 3), 5);
});
test('add 处理负数也没问题', () => {
assert.equal(add(-1, -2), -3);
});
运行只需一行:
node --test
8.5 性能与调试
- 压测:用
autocannon测接口吞吐,用数据说话,别拍脑袋。 - 火焰图:
node --prof定位性能热点。 - 日志:上
pino,结构化日志比console.log专业得多。 - 内存:警惕闭包和全局变量导致的泄漏,用
process.memoryUsage()观察。
8.6 安全清单
上线前,逐条对一遍:
- 用权限模型限制进程能碰的资源;
- 所有用户输入都做校验与转义,防注入、防 XSS;
- 密钥、密码只放环境变量;
- 定期
npm audit,关注供应链安全; - 给接口加限流,防止被刷。
九、阶段六:精通之路
到了这一阶段,"会写代码"已经不够了,你要开始思考"怎么设计系统"。
- 架构分层:理解 Controller / Service / Repository 的职责边界,避免业务逻辑散落各处。
- 可观测性:日志(pino)、指标(Prometheus)、链路追踪(OpenTelemetry)三件套。
- 部署与运维:Docker 容器化、CI/CD 流水线、Kubernetes 编排。
- Serverless 与边缘:Hono 这类框架让代码能直接跑在边缘节点,冷启动更短。
- 读源码:挑一个你常用的库,读它的实现。这是从"使用者"跃迁为"理解者"的最快路径。
- 参与开源:提一个文档修正、修一个小 bug,实战中成长的效率远超看教程。
精通的标志,不是你记得多少 API,而是面对一个陌生需求时,你能快速判断该怎么拆、用什么方案、有什么风险。
十、新手最容易踩的 5 个坑
坑一:在事件循环里做重计算。
一个大循环、一次同步的大文件读取,就能让服务"僵住"。耗时任务请交给 Worker Threads 或子进程。
坑二:循环里串行 await。
如果你要请求 10 个接口,这样写会让它们一个接一个地等:
// 慢:串行,总耗时是 10 次之和
for (const id of ids) {
results.push(await fetchUser(id));
}
改成并发,总耗时约等于最慢的那一次:
// 快:并发执行
const results = await Promise.all(ids.map((id) => fetchUser(id)));
坑三:吞掉错误。try / catch 里写个空 catch,等于把问题藏起来,线上出事了更难查。至少记一条日志。
坑四:忽视未处理的 Promise 拒绝。
忘记 await 或 .catch,程序可能在某个时刻静默崩溃。给进程加上全局兜底:
process.on('unhandledRejection', (reason) => {
console.error('未处理的 Promise 拒绝:', reason);
});
坑五:依赖失控。node_modules 越滚越大,安全风险也随之上升。养成定期清理、优先用原生能力的习惯。
十一、值得收藏的学习资源清单
- 官方文档:
nodejs.org的中文文档是第一手资料,遇到疑问先查它,别先搜二手文章。 - 官方博客与版本发布页:想了解最新特性,直接看 Release Notes 最准。
- Awesome Node.js:GitHub 上精选的 Node.js 包与资源合集,按领域分类,非常好用。
- Node.js 官方学习路径(Learn):官方亲自整理的入门引导,适合当主线。
- npm 官网:查一个包的真实下载量、维护状态、最近更新时间——判断它靠不靠谱的快捷方式。
- 《Node.js 设计模式》:进阶必读,深入讲解异步、流、并发等核心主题。
学习心法:文档 > 视频 > 二手博客。视频适合建立直觉,但真正的细节,永远在官方文档里。
十二、一份可执行的学习时间表
把上面的路径落成一张进度表,你可以直接照着走:
| 周次 | 主题 | 达成的里程碑 |
|---|---|---|
| 第 1 周 | 环境 + ES6+ 语法 | 能独立写出并运行脚本 |
| 第 2 周 | 模块系统 + 核心模块 | 手写一个可用 HTTP 服务 |
| 第 3 周 | 事件循环 + 异步编程 | 能讲清宏任务与微任务的顺序 |
| 第 4 周 | npm + 工程化 | 独立初始化并管理一个项目 |
| 第 5–6 周 | Fastify / Express + 路由 | 完成一组 RESTful 接口 |
| 第 7 周 | 数据库 + ORM | 实现数据的增删改查 |
| 第 8 周 | 认证与安全 | 完成带 JWT 的登录鉴权 |
| 第 9–10 周 | TypeScript + 测试 | 项目全量 TS 化并附带单元测试 |
| 第 11–12 周 | 性能 / 部署 / 架构 | 完成一次容器化部署与压测 |
这张表是"地图",不是"考卷"。进度快慢因人而异,关键是每个阶段都要有一个真实的产出,而不是只把教程看完。
结语
Node.js 的学习,其实是一场"从工具到思维方式"的转变。
入门时,你学的是语法和 API;进阶时,你理解的是异步与事件循环;而到了精通,你掌握的是在 I/O 密集的世界里,如何让系统既快又稳。
2026 年的 Node.js 比以往任何时候都更好用——它把测试、数据库、类型支持、安全管控都收进了自己的怀里,让你能更专注于业务本身。剩下的,就是动手。
从今天写下那行 console.log('Hello, Node.js!') 开始,你就已经在这条路上了。
祝你学习顺利,早日写出那个让自己骄傲的项目。