【面试】【前端】【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 绑定到同一个端口,每个请求由操作系统分配给任意一个进程处理。
  • 避免端口被占用的机制

    • 子进程并不直接监听端口,而是通过主进程创建的服务器句柄处理请求。

    • 示例代码:

      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_modulespackage.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 是处理流式数据的抽象接口。
    • 流的种类:
      1. Readable Stream:可读流(如 fs.createReadStream)。
      2. Writable Stream:可写流(如 fs.createWriteStream)。
      3. Duplex Stream:双工流(既可读又可写,如 net.Socket)。
      4. Transform Stream:转换流(对流进行变换处理,如 zlib 压缩)。
  • Pull-Stream

    • 一种流处理的抽象模型,通过拉取方式动态请求数据。

    • 特点:

      • 避免了传统流模型中的背压问题。

      • 数据在需要时才被传递,提高效率。


  • (五)常见问题解析

  • Node.js 性能优化

    1. 使用缓存:如内存缓存、Redis。
    2. 减少同步阻塞:尽量使用异步方法。
    3. 利用多核 CPU:使用 ClusterWorker Threads
    4. 流式处理:避免大数据操作时占用大量内存。
  • Token 与 Cookie 的区别

    • Cookie:用于存储用户信息,浏览器自动携带。
    • Token:用户认证凭据,需通过请求头或参数手动传递。
    • 联系:都可用于用户认证,Token 更适合前后端分离。
  • Node.js 项目调试工具

    1. 内置调试器node inspect
    2. 第三方工具:如 VSCode 调试插件。
    3. 性能分析node --prof 分析性能瓶颈。

  • 二、总结

    Node.js 的核心是事件驱动与非阻塞 I/O,能高效处理高并发任务。面试中需掌握 Node.js 的多核利用、核心模块(如 Buffer、Stream)、性能优化策略及新兴技术(如 Deno)的对比。通过深入理解其机制和应用场景,可以为开发者的全栈或后端开发能力加分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值