Node.js 从入门到精通学习指南
目标:快速建立可落地的 Node.js 能力地图,覆盖核心原理、工程实践与主流框架选型。
目录
一、Node.js 是什么
Node.js 是基于 Chrome V8 的 JavaScript 运行时,让 JS 能脱离浏览器在服务端运行。
核心特点
| 特点 | 含义 | 对你的影响 |
|---|---|---|
| 单线程 + 事件循环 | 主线程不阻塞,I/O 异步回调/Promise | 高并发 I/O 友好,CPU 密集任务要小心 |
| 非阻塞 I/O | 文件、网络、数据库等待不卡死进程 | 适合 API、网关、实时服务 |
| npm / 生态巨大 | 几乎一切都有包 | 选型与供应链安全要自己把关 |
| 前后端同语言 | 共用类型、校验、工具链 | 全栈协作成本低 |
适合做什么
-
HTTP / REST / GraphQL API
-
BFF(Backend For Frontend)
-
实时应用(WebSocket、聊天、协作)
-
CLI 工具、构建脚本、自动化
-
SSR / 全栈 Web(Next.js、Nuxt 等)
-
轻量微服务、边缘函数
不太适合单独硬扛的
-
重 CPU 计算(视频转码、大规模数值计算)→ 可交给 Worker / 其他语言服务
-
超强事务一致性的核心账务系统 → 可做,但 Java/Go + 成熟中间件更常见
二、环境搭建与快速上手
2.1 安装建议
-
推荐用 nvm(或 Windows 上的 nvm-windows / fnm)管理多版本
-
LTS 优先(生产默认跟 LTS)
-
包管理器:
npm够用;团队项目常见pnpm/yarn
# 示例:安装并切换 LTS
nvm install --lts
nvm use --lts
node -v
npm -v
2.2 第一个服务(零框架)
// server.mjs
import http from 'node:http';
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ ok: true, path: req.url }));
});
server.listen(3000, () => {
console.log('http://localhost:3000');
});
先用原生 http 写一遍,再学框架,能更清楚中间件在解决什么问题。
2.3 模块系统(必懂)
| 体系 | 扩展名 / 特征 | 现状 |
|---|---|---|
| CommonJS | require / module.exports | 历史包仍大量存在 |
| ESM | import / export,"type": "module" | 新项目推荐方向 |
| 建议:新项目优先 ESM;读老库时会同时碰到 CJS。 |
2.4 package.json 最小认知
-
dependencies:运行时依赖 -
devDependencies:开发/构建/测试依赖 -
scripts:dev/build/test/start -
engines:锁定 Node 版本范围 -
lockfile(
package-lock.json/pnpm-lock.yaml):必须提交,保证可复现
三、核心基础(必须扎实)
按优先级,不要一上来就堆框架。
3.1 语言与异步模型
-
现代 JS:
let/const、解构、可选链、空值合并、async/await -
Promise 链路、错误冒泡、
Promise.all/allSettled/race -
事件循环直觉:
-
同步代码 → 微任务(Promise)→ 宏任务(
setTimeout、I/O) -
process.nextTick与queueMicrotask的差异有概念即可 -
错误处理:同步
try/catch;异步必须 await 或.catch;未捕获会拖垮进程
3.2 Node 内置模块(高频)
| 模块 | 用途 |
|---|---|
fs / fs/promises | 文件读写 |
path | 路径拼接(跨平台) |
http / https | 服务与请求 |
url / querystring | URL 解析 |
crypto | 哈希、签名、随机数 |
stream | 大文件、管道、背压 |
events | EventEmitter |
buffer | 二进制数据 |
child_process | 调系统命令/子进程 |
worker_threads | CPU 密集并行 |
util | promisify、调试辅助 |
3.3 Stream 与 Buffer(拉开差距的点)
-
大文件不要一次性
readFile进内存 -
理解 Readable / Writable / Transform / Duplex
-
pipeline优于手写pipe(错误处理更完整) -
Buffer 与字符串编码(
utf8)转换要小心
3.4 进程与环境
-
process.env、十二要素配置(配置外置) -
优雅退出:监听
SIGTERM/SIGINT,关闭 server 与连接池 -
uncaughtException/unhandledRejection:应记录并可控退出,不要当业务 try/catch
3.5 HTTP 服务必备概念
-
方法、状态码、Header、Body、Cookie
-
CORS、CSRF、XSS 基础防护意识
-
鉴权常见方案:Session + Cookie、JWT、OAuth2
-
幂等、超时、重试、限流(至少知道为什么需要)
四、进阶能力(从能写到能扛)
4.1 TypeScript
生产级 Node 服务强烈建议 TypeScript:
-
接口契约、重构安全、AI 协作更稳
-
工具链常见:
tsx(开发)、tsup/esbuild/swc(构建)、tsc(类型检查)
4.2 工程化
-
目录分层:
routes/controllers/services/repos/middlewares -
配置管理:
dotenv+ schema 校验(如 zod) -
日志:结构化日志(pino / winston),带 requestId
-
校验:入参统一校验,失败返回明确错误码
-
测试:单元(Vitest/Jest)+ 接口测试 + 关键测试策略
-
质量门禁:ESLint、Prettier、husky + lint-staged(按需)
4.3 数据与一致性
-
SQL 基础:索引、事务、隔离级别概念
-
ORM / Query Builder:Prisma、Drizzle、TypeORM、Knex
-
缓存:Redis(穿透/击穿/雪崩有概念)
-
消息:异步解耦、重试、死信(BullMQ / RabbitMQ / Kafka 按场景)
4.4 安全
-
依赖审计:
npm audit、锁定版本、减少未知小包 -
密钥不进仓库;用环境变量 / 密钥管理
-
密码:bcrypt/argon2;禁止明文
-
SQL 注入、命令注入、路径穿越
-
上传与 SSRF 防护
4.5 性能与可观测
-
性能:N+1 查询、同步阻塞、内存泄漏、Event Loop Lag
-
观测:日志 + 指标 + 链路追踪(OpenTelemetry)
-
压测:autocannon / k6
-
集群:
node:cluster或多进程部署(PM2 / 容器多副本)
4.6 部署
-
Docker 镜像多阶段构建
-
健康检查
/health、 readiness / liveness -
反向代理:Nginx / Caddy / 云 LB
-
进程管理:systemd / PM2 / K8s
-
CI/CD:安装 → 测试 → 构建 → 发布
五、框架选型全景
结论先行:没有银弹。按团队规模、复杂度、性能诉求、是否要「企业级约束」选型。
5.1 总览对比
| 框架 | 定位 | 学习曲线 | 性能 | TypeScript | 适合场景 | 不太适合 |
|---|---|---|---|---|---|---|
| Express | 事实标准、极简 | 低 | 中 | 需自配 | 入门、BFF、中小 API | 超大复杂域(缺内置约束) |
| Koa | 更现代的中间件(async) | 低-中 | 中高 | 需自配 | 需要更干净中间件链 | 生态插件完整度弱于 Express |
| Fastify | 高性能、schema 驱动 | 中 | 高 | 友好 | 高 QPS API、新项目 | 重度企业脚手架不如 Nest |
| NestJS | 企业级架构(DI/模块) | 中-高 | 中高 | 一等公民 | 中大型业务、团队协作 | 小脚本/极简 API 过重 |
| Hono | 轻量、多运行时 | 低 | 高 | 友好 | Edge、Cloudflare、Bun、Node | 超复杂企业域要自己补 |
| Next.js | 全栈 React 框架 | 中 | 视写法 | 友好 | SSR/站内 API/全栈产品 | 纯后端微服务边界模糊时慎用 |
| Nuxt | 全栈 Vue 框架 | 中 | 视写法 | 友好 | Vue 技术栈全栈 | 同 Next,边界要清晰 |
| AdonisJS | 类 Laravel 全栈 | 中 | 中 | 友好 | 想要完整电池的 Node Web | 国内资料与岗位相对少 |
| Egg.js / Midway | 国内企业 Node 方案 | 中 | 中 | Midway 更好 | 阿里系/国内企业存量 | 新开源社区项目可选性下降 |
5.2 怎么选(决策树)
只做前端同构 / SSR / 站内 BFF?
├─ React 生态 → Next.js(App Router)
└─ Vue 生态 → Nuxt
纯后端 API / 微服务?
├─ 团队小、要快、结构自由 → Fastify 或 Express
├─ 要高性能 + JSON Schema 校验 → Fastify(优先)
├─ 业务复杂、多人协作、要规范 → NestJS
└─ 要跑 Edge / 多运行时 → Hono
国内大厂存量维护?
└─ 可能遇到 Egg / Midway,会读会改即可
5.3 各框架要点
Express
-
优点:教程最多、中间件生态最大、招人认知成本低
-
注意:本身很薄,错误处理、校验、结构全靠约定
-
建议:入门必学;生产可继续用,但要自己补齐工程规范
Koa
-
优点:async 中间件优雅,洋葱模型清晰
-
注意:很多能力要自己拼(路由、body parser 等)
-
建议:理解中间件原理很好;新项目更常直接看 Fastify/Nest
Fastify
-
优点:速度快、插件体系清晰、内置 schema 校验与序列化
-
注意:插件封装思想要适应;部分生态不如 Express「搜得到就有」
-
建议:2020 年后新 API 服务的强候选
NestJS
-
优点:模块化、DI、Guard/Interceptor/Pipe、可对标 Spring 心智
-
注意:概念多,小项目容易过度设计
-
建议:中大型 Node 后端、需要团队统一架构时优先
Hono
-
优点:极简、类型友好、可部署到 Node/Bun/Workers 等
-
注意:企业级配套要自行选择
-
建议:边缘函数、轻服务、现代运行时场景
Next.js(作为「Node 相关框架」)
-
优点:前后端一体、路由与部署体验好
-
注意:把复杂领域逻辑全塞进 Route Handler 会难维护
-
建议:产品型 Web 用;核心域复杂时,BFF 用 Next,领域服务可独立 Nest/Fastify
5.4 推荐组合(可直接抄)
| 场景 | 推荐组合 |
|---|---|
| 前端转全栈,尽快交付 | Next.js + Prisma + PostgreSQL |
| 中小型纯 API | Fastify + Zod/TypeBox + Prisma/Drizzle |
| 中大型业务后端 | NestJS + Prisma/TypeORM + Redis + BullMQ |
| 超轻量 Edge API | Hono + D1/KV 或外部 DB |
| 学习原理 + 面试 | 原生 http → Express → 再升 Fastify/Nest |
六、配套技术栈选型
6.1 数据库
| 类型 | 常见选择 | 说明 |
|---|---|---|
| 关系型 | PostgreSQL(优先)、MySQL | 事务、复杂查询 |
| 文档型 | MongoDB | 灵活文档;别滥用当万能库 |
| 缓存 | Redis | Session、热点、分布式锁、限流 |
| 搜索 | Elasticsearch / Meilisearch | 搜索场景再引入 |
6.2 ORM / 数据访问
| 方案 | 特点 | 建议 |
|---|---|---|
| Prisma | DX 好、迁移清晰 | 中小项目首选之一 |
| Drizzle | SQL 感强、轻 | 想贴近 SQL 时很好 |
| TypeORM | 装饰器风格,Nest 常见 | 注意活跃度与坑 |
| Knex | Query Builder | 要灵活 SQL 时稳妥 |
| 原生驱动 | pg / mysql2 | 性能敏感或学习 SQL |
6.3 校验与配置
-
运行时校验:Zod(通用)、TypeBox(Fastify 友好)
-
环境变量:dotenv + zod 解析,启动失败要尽早暴露
6.4 鉴权
-
Session + Redis:传统 Web、Cookie 场景
-
JWT:无状态 API、移动端;注意刷新与撤销