【面试】【前端】【nodejs】Node.js 面试题总结
一、Node.js 面试题总结
Node.js 是构建高性能 Web 应用和服务端开发的强大工具,在面试中会考察多核利用、进程管理、性能优化、Deno 的对比及常见核心模块的理解。以下是针对 Node.js 面试问题的总结。
-
(一)Node.js 核心原理
-
Node.js 特性:
- 单线程、事件驱动。
- 非阻塞 I/O 模型,基于 libuv 库实现。
-
多核 CPU 的充分利用:
-
Node.js 本身是单线程运行,但可以通过
Cluster 模块 或
Worker Threads
模块实现多核利用。
- Cluster 模块:创建多个子进程,共享相同的服务器端口。
- Worker Threads:在单独的线程中运行任务,更适合 CPU 密集型任务。
-
示例:使用
模块实现多核利用:
const cluster = require('cluster'); const http = require('http'); const os = require('os'); if (cluster.isMaster) { const cpuCount = os.cpus().length; for (let i = 0; i < cpuCount; i++) { cluster.fork(); // 创建子进程 } cluster.on('exit', (worker) => { console.log(`Worker ${worker.process.pid} exited.`); }); } else { http.createServer((req, res) => { res.writeHead(200); res.end('Hello from Node.js!'); }).listen(8000); }
-
-
(二)Node.js 多进程监听同一端口
-
实现原理:
- Node.js 使用
cluster
模块允许多个进程共享一个 TCP 服务器,通过SO_REUSEPORT
选项使多个进程能够绑定到同一个端口。 SO_REUSEPORT
:允许多个 socket 绑定到同一个端口,每个请求由操作系统分配给任意一个进程处理。
- Node.js 使用
-
避免端口被占用的机制:
-
子进程并不直接监听端口,而是通过主进程创建的服务器句柄处理请求。
-
示例代码:
const cluster = require('cluster'); const http = require('http'); if (cluster.isMaster) { cluster.fork(); // 主进程分配任务 cluster.fork(); } else { http.createServer((req, res) => { res.end('Hello from worker!'); }).listen(3000); // 子进程共享端口 }
-
-
(三)Deno 与 Node.js 的对比
-
Deno 简介:
- 由 Node.js 创始人 Ryan Dahl 开发,旨在改进 Node.js 的不足。
- 内置 TypeScript 支持、更好的安全性和现代化设计。
-
Deno 优化点:
- 安全性:默认禁止文件、网络、环境变量访问,需通过显式权限开启。
- 内置模块:无需安装第三方库(如 HTTP 服务器)。
- TypeScript 原生支持:无需额外配置。
- 模块管理:基于 URL,无需
node_modules
和package.json
。 - 标准库:提供官方标准库,减少第三方依赖。
-
Deno 示例:
import { serve } from "https://deno.land/std@0.96.0/http/server.ts"; const server = serve({ port: 8000 }); console.log("HTTP server is running on http://localhost:8000/"); for await (const req of server) { req.respond({ body: "Hello from Deno!\n" }); }
-
(四)Node.js 的 Buffer 和 Stream
-
Buffer:
-
定义:Buffer 是 Node.js 用于处理二进制数据的类。
-
特点:
- 类似于 Uint8Array,但支持更多方法。
- 常用于文件操作、网络通信等场景。
-
示例:
const buffer = Buffer.from('Hello, Node.js'); console.log(buffer.toString()); // 输出:Hello, Node.js
-
-
Stream:
- 定义:Stream 是处理流式数据的抽象接口。
- 流的种类:
- Readable Stream:可读流(如
fs.createReadStream
)。 - Writable Stream:可写流(如
fs.createWriteStream
)。 - Duplex Stream:双工流(既可读又可写,如
net.Socket
)。 - Transform Stream:转换流(对流进行变换处理,如
zlib
压缩)。
- Readable Stream:可读流(如
-
Pull-Stream:
-
一种流处理的抽象模型,通过拉取方式动态请求数据。
-
特点:
-
避免了传统流模型中的背压问题。
-
数据在需要时才被传递,提高效率。
-
-
-
(五)常见问题解析
-
Node.js 性能优化:
- 使用缓存:如内存缓存、Redis。
- 减少同步阻塞:尽量使用异步方法。
- 利用多核 CPU:使用
Cluster
或Worker Threads
。 - 流式处理:避免大数据操作时占用大量内存。
-
Token 与 Cookie 的区别:
- Cookie:用于存储用户信息,浏览器自动携带。
- Token:用户认证凭据,需通过请求头或参数手动传递。
- 联系:都可用于用户认证,Token 更适合前后端分离。
-
Node.js 项目调试工具:
- 内置调试器:
node inspect
。 - 第三方工具:如 VSCode 调试插件。
- 性能分析:
node --prof
分析性能瓶颈。
- 内置调试器:
-
二、总结
Node.js 的核心是事件驱动与非阻塞 I/O,能高效处理高并发任务。面试中需掌握 Node.js 的多核利用、核心模块(如 Buffer、Stream)、性能优化策略及新兴技术(如 Deno)的对比。通过深入理解其机制和应用场景,可以为开发者的全栈或后端开发能力加分。