Node篇
1. Node.js 在 2025 年的定位与竞品(金牌开场)
Node.js 是一个基于 V8 + libuv 的通用 JavaScript/TypeScript 运行时,默认单进程事件循环但可通过 Worker Threads、Cluster、Node-API 插件与容器编排实现横向扩容。2025 年的面试关注点:
- 对比 Deno、Bun、Cloudflare Workers 等新运行时,理解 Node 的长期优势(成熟生态、LTS 节奏、原生模块 ABI)与短板(冷启动、服务器级资源占用)。
- 明确 Node 20/22 LTS 的新能力:稳定的原生
fetch
、Web Streams
、test runner
、Permission Model
,以及对V8 12.x
的优化。 - 结合 AI 时代的业务诉求,展示你如何在 Node 中同时对接 REST、GraphQL、gRPC 与向量检索、推理服务(OpenAI API、阿里通义、字节晓悟等)。
2. Node.js 运行时演进(热知识)
- Node 22 LTS(2024Q4 发布)首次将
--experimental-permission
扩展为稳定 API,可为无服务器/多租户场景限制文件系统、网络访问权限。 corepack
默认开启,企业面试常追问如何在 monorepo 中锁定pnpm
/yarn
版本并保证 CI 可重复。node:test
与test_runner
API 已在多个大厂落地,无需依赖 Jest 也能完成覆盖率、子测试、快照;面试加分点是描述如何并行执行 e2e 与 AI mock(录制 LLM 响应)。
3. 并发模型与事件循环细节(高频深挖)
面试常见 follow-up:为什么“单线程”不是瓶颈?建议框架:
- libuv 提供事件循环的六个阶段(timers、pending、idle/prepare、poll、check、close callbacks),其中 microtask(
process.nextTick
、queueMicrotask
、Promise
)在每个阶段后执行。 - I/O 密集型任务交由线程池(默认 4,可通过
UV_THREADPOOL_SIZE
调整),CPU 任务使用Worker
或移交消息队列/边缘函数。 - 实战回答可给出“使用
worker_threads
跑 OpenAI Embedding,再把结果推送到 Kafka”的例子,体现 AI 时代的混合式架构能力。
4. Worker Threads、Cluster 与多实例策略(架构题)
cluster
主要用于 fork 多进程共享端口 + 粗粒度负载均衡,Node 20 后推荐把入口迁移至基于node:cluster
+undici
的“无状态网关”。- Worker Threads 适合 CPU 密集与 AI 推理前后处理,可结合
MessageChannel
或Atomics.wait
解决数据一致性。 - 面试亮点:描述如何在 K8s/HPA 中通过
Pod
指标扩容,再借助 Redis 或 NATS JetStream 做 session/任务协调。
5. 常见全局对象与 Web API 对齐(基础升级)
globalThis
、process
、Buffer
、AbortController
、TextEncoder/Decoder
已经与浏览器同构,强化前后端一体开发体验。process.env
结合dotenv-flow
或 Vault 管理密钥;AI 项目要强调安全地注入 OpenAI、月之暗面等凭据。- 面试延伸:描述如何利用
AsyncLocalStorage
做链路追踪或跨请求注入 requestId,尤其是在调用多模型链路时确保日志可追溯。
6. 计时器与微任务优先级(细节区分)
分类 | 典型 API | 触发时机 | 面试易错点 |
---|---|---|---|
宏任务 | setTimeout 、setInterval 、setImmediate | timers/check 阶段 | setImmediate 在 poll 阶段后执行,常与 process.nextTick 混淆 |
微任务 | process.nextTick 、queueMicrotask 、Promise 回调 | 每个阶段末尾 | process.nextTick 优先级最高,不可滥用,否则阻塞事件循环 |
资源型 | worker_threads 、timers/promises.setTimeout | 线程池调度 | 结合 AbortSignal 可实现 AI 请求超时/取消 |
7. 稳定性与异常处理(工程化硬指标)
- 必须强调“不要吞掉错误”。使用
process.on('uncaughtException')
、process.on('unhandledRejection')
做兜底,同时迅速上报并优雅退出。 - 推荐答案包含 Observability:
pino
+ OpenTelemetry,将 AI 调用的提示词和日志打标,便于后续迭代。 - 若涉及 Serverless,补充 Cloudflare Workers、Vercel Edge、阿里 FC 的限制(冷启动、CPU 时间、
node:deps
禁用)。
8. 包管理策略(从 npm 到 pnpm 的真实经验)
- 2025 年企业多采用
pnpm
+ monorepo(TurboRepo、Nx、Rush)。解释nodeLinker=hoisted
、workspace:
协议以及如何通过.npmrc
锁定私有源。 - 讲清
package.json
的exports
、types
、engines
字段,以及如何发布双模块(CJS + ESM)。示例:
{
"name": "@team/ai-gateway",
"type": "module",
"exports": {
".": {
"import": "./dist/index.mjs",
"require": "./dist/index.cjs",
"types": "./dist/index.d.ts"
}
},
"engines": {
"node": ">=20.11"
}
}
json
- 面试补充:如何使用
npm view
或pnpm outdated
管控漏洞,并借助npm audit signatures
或 SLSA 保障供应链安全。
9. 文件与网络模块的现代写法(技能展示)
- 文件:优先使用
node:fs/promises
+ 流式 API,处理大语言模型输出时常结合ReadableStream
与stream/promises
。 - 网络:Node 20 起内置 WHATWG
fetch
,与undici
共用底层;结合AbortController
控制 AI 请求超时:
import { setTimeout as delay } from 'node:timers/promises';
const controller = new AbortController();
const timeout = delay(8000).then(() => controller.abort());
const response = await fetch('https://api.moonshot.cn/v1/chat', {
method: 'POST',
body: JSON.stringify({ messages, model: 'moonshot-v1-128k' }),
headers: { 'content-type': 'application/json', authorization: `Bearer ${token}` },
signal: controller.signal
});
await timeout;
ts
- 加分点:提及
HTTP/2
、fetch keepalive
与undici
的连接池调优,或如何把 LangChain.js/AI SDK 托管在 Node 服务中。
10. 主流服务端框架与架构抉择(产品相关)
- Express 虽经典,但在性能、TS 体验上落后。面试中可以对比 Fastify(高性能 + schema 校验)、NestJS(企业级架构)、Hono(轻量 + Edge)。
- 讨论如何构建 BFF(Backend for Frontend)或 API Gateway,插入 AI 智能召回/重排逻辑,结合缓存(Redis、Upstash、Cloudflare KV)。
- 可附带部署经验:Docker 多阶段构建、持久化依赖缓存、
pnpm fetch
预拉包、Slim 镜像。
11. 模块系统与构建工具链(理论 + 实践)
- 解释 CommonJS 与 ESM 的互操作限制:
require
无法加载原生 ESM,需使用动态import()
;面试官常追问如何在老项目逐步迁移。 - 介绍
tsx
、esbuild
、SWC
、Rspack
的构建差异,以及为什么很多 Node 工程切换到tsup
/unbuild
搭配pnpm
实现秒级构建。 - AI 项目实际案例:对接 OpenAPI schema,使用
zod
生成类型,再由ts-node
/tsx
在 CLI 工具中执行。
12. Node 事件循环 vs 浏览器(图景题)
关键点:浏览器有渲染阶段与任务队列,Node 没有 GUI 线程,但存在 process.nextTick
队列。可借助 node --trace-events-enabled
或 clinic.js
演示性能分析,体现你会用工具定位 AI 调用的延迟瓶颈。
13. Node 与 AI/大模型集成(热点问答)
- 对接策略:统一
LLMClient
接口,支持 Azure OpenAI、字节大模型、智谱 AI;通过中间层实现 Token 统计、成本监控。 - 数据:结合向量数据库(Supabase Vector、Pinecone、Milvus、Zilliz Cloud)和 PostgreSQL/PlanetScale,描述如何用
Prisma
+Drizzle
+pgvector
构建检索增强系统。 - 自动化:借助 LangSmith、OpenAI Realtime API、WebSocket 推流,为多模态聊天或副业运营(抖音脚本生成、客服机器人)提供实时能力。
14. 高频追问与案例拆解(建议准备)
- 如何实现灰度发布与回滚?示例:使用 GitOps + ArgoCD,在
values-canary.yaml
中控制副本数。 - 如何构建“AI 增强”的后台:比如在 Node 服务中调用飞书多维表格的 Hook,根据业务指标触发 LLM 生成日报,并通过企业微信机器人发送。
- 面试官常要求给出“失败案例”:描述一次 Node 服务内存泄漏或 AI API 超额成本的排查过程,展示复盘与指标体系。
面试 TIP:面试结束时可反问“团队的 Node 版本/部署方式/是否接入大模型”,再补上一句“我有相关最佳实践可以落地”,释放积极信号。
↑