🟩
Node.js
7 道题目
难度筛选:
相同点:都基于 V8 引擎,都有微任务和宏任务。
不同点:Node.js 的宏任务有更多阶段:
1. timers:setTimeout/setInterval
2. pending callbacks:系统级回调
3. idle, prepare:内部使用
4. poll:获取新 I/O 事件
5. check:setImmediate
6. close callbacks:关闭事件回调
关键区别:
• Node 11+ 微任务执行时机和浏览器一致(每个宏任务后)
•
•
不同点:Node.js 的宏任务有更多阶段:
1. timers:setTimeout/setInterval
2. pending callbacks:系统级回调
3. idle, prepare:内部使用
4. poll:获取新 I/O 事件
5. check:setImmediate
6. close callbacks:关闭事件回调
关键区别:
• Node 11+ 微任务执行时机和浏览器一致(每个宏任务后)
•
process.nextTick 优先级高于所有微任务•
setImmediate 在 setTimeout(fn, 0) 之前执行(在 I/O 周期中) 查看答案即标记为已答
require(CommonJS):
• 运行时加载(同步)
• 输出值的拷贝
•
import(ES Module):
• 编译时静态分析
• 输出值的引用(绑定)
•
• 支持 tree-shaking
Node.js 支持 ESM:
•
• 或使用
建议:新项目使用 ESM,兼容旧库用 CommonJS。
• 运行时加载(同步)
• 输出值的拷贝
•
const fs = require('fs')import(ES Module):
• 编译时静态分析
• 输出值的引用(绑定)
•
import fs from 'fs'• 支持 tree-shaking
Node.js 支持 ESM:
•
"type": "module" in package.json• 或使用
.mjs 扩展名建议:新项目使用 ESM,兼容旧库用 CommonJS。
查看答案即标记为已答
Express:
• 基于回调的中间件模型
•
• 错误处理:4 参数中间件
• 内置路由、静态文件服务等
Koa:
• 基于 async/await 的洋葱模型
•
• 更优雅的错误处理(try/catch)
• 轻量,功能通过中间件添加
洋葱模型:请求从外层中间件进入,调用 next 后进入下一层,响应从内层往外逐层返回。
选择:Koa 更现代、更灵活;Express 更成熟、生态更丰富。
• 基于回调的中间件模型
•
app.use((req, res, next) => { ... })• 错误处理:4 参数中间件
• 内置路由、静态文件服务等
Koa:
• 基于 async/await 的洋葱模型
•
app.use(async (ctx, next) => { await next(); })• 更优雅的错误处理(try/catch)
• 轻量,功能通过中间件添加
洋葱模型:请求从外层中间件进入,调用 next 后进入下一层,响应从内层往外逐层返回。
选择:Koa 更现代、更灵活;Express 更成熟、生态更丰富。
查看答案即标记为已答
Stream 是处理流式数据的抽象接口,避免一次性将大量数据加载到内存。
四种类型:
1. Readable:可读流(fs.createReadStream、HTTP 请求)
2. Writable:可写流(fs.createWriteStream、HTTP 响应)
3. Duplex:双工流,可读可写(TCP Socket)
4. Transform:转换流,读取→变换→输出(zlib、加密)
管道(Pipe):
背压(Backpressure):当写入速度慢于读取速度时,可读流自动暂停,避免内存溢出。
应用:文件复制、HTTP 代理、压缩、日志处理。
四种类型:
1. Readable:可读流(fs.createReadStream、HTTP 请求)
2. Writable:可写流(fs.createWriteStream、HTTP 响应)
3. Duplex:双工流,可读可写(TCP Socket)
4. Transform:转换流,读取→变换→输出(zlib、加密)
管道(Pipe):
readable.pipe(writable) — 数据从可读流自动流向可写流背压(Backpressure):当写入速度慢于读取速度时,可读流自动暂停,避免内存溢出。
应用:文件复制、HTTP 代理、压缩、日志处理。
查看答案即标记为已答
npm scripts 是 package.json 中定义的脚本命令。
常用命令:
•
•
•
生命周期脚本:
技巧:
"scripts": {
"dev": "vite",
"build": "vite build",
"lint": "eslint src --ext .ts,.tsx"
}常用命令:
•
npm run dev — 执行自定义脚本•
npm start — 等同 npm run start•
npm test — 等同 npm run test生命周期脚本:
prebuild → build → postbuild,自动依次执行。技巧:
npx 可直接运行 node_modules/.bin 下的命令。 查看答案即标记为已答
1. try/catch:同步代码直接捕获
2. uncaughtException:进程级兜底
3. unhandledRejection:未处理的 Promise 异常
4. Express 中间件:
建议:uncaughtException 后应重启进程(用 PM2 等进程管理器自动重启)。
2. uncaughtException:进程级兜底
process.on('uncaughtException', (err) => {
logger.error(err);
process.exit(1);
});3. unhandledRejection:未处理的 Promise 异常
process.on('unhandledRejection', (reason) => {
logger.error(reason);
process.exit(1);
});4. Express 中间件:
app.use((err, req, res, next) => {
res.status(500).json({ error: err.message });
});建议:uncaughtException 后应重启进程(用 PM2 等进程管理器自动重启)。
查看答案即标记为已答
进程:操作系统分配资源的最小单位,有独立内存空间。
线程:CPU 调度的最小单位,同一进程内的线程共享内存。
Node.js 单线程:主线程是单线程的,但内部通过 libuv 线程池处理 I/O。
多核利用方案:
1. cluster 模块:主进程 fork 多个子进程,共享端口
2. Worker Threads:线程级并行,适合 CPU 密集型
3. PM2:生产环境进程管理,自动 cluster + 负载均衡
线程:CPU 调度的最小单位,同一进程内的线程共享内存。
Node.js 单线程:主线程是单线程的,但内部通过 libuv 线程池处理 I/O。
多核利用方案:
1. cluster 模块:主进程 fork 多个子进程,共享端口
const cluster = require('cluster');
if (cluster.isPrimary) {
for (let i = 0; i < numCPUs; i++) cluster.fork();
} else { server.listen(3000); }2. Worker Threads:线程级并行,适合 CPU 密集型
3. PM2:生产环境进程管理,自动 cluster + 负载均衡
查看答案即标记为已答