Node.js 高频面试题及详细答案(实战向)_第1页
Node.js 高频面试题及详细答案(实战向)_第2页
Node.js 高频面试题及详细答案(实战向)_第3页
Node.js 高频面试题及详细答案(实战向)_第4页
Node.js 高频面试题及详细答案(实战向)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Node.js高频面试题及详细答案(实战向)一、基础概念类1.简单说说你对Node.js的理解,它和浏览器JS有什么区别?答案:Node.js是一个基于ChromeV8引擎的服务端JavaScript运行环境,采用事件驱动、非阻塞I/O模型,适合开发高并发、轻量级的服务端程序、工具脚本和中间层服务。和浏览器JS的核心区别主要有三点:运行环境不同:浏览器端有DOM、BOMAPI,用来操作页面和浏览器;Node.js没有页面相关API,提供了文件、网络、进程、路径等服务端API。全局对象不同:浏览器全局是window,Node.js全局是global,现在更推荐使用globalThis统一兼容。模块机制不同:浏览器主要依靠ES6Module,Node.js同时支持CommonJS和ESModule,默认主流是CommonJS。应用场景不同:浏览器JS专注页面交互、视图渲染;Node.js专注服务端接口、文件处理、打包构建、爬虫、中间层服务等。2.CommonJS和ES6Module的核心区别?答案:这是Node.js最常考的模块规范差异,核心区别如下:加载时机:CommonJS是运行时加载,代码执行到对应位置才加载模块;ESModule是编译时加载,会提前解析模块依赖。导出方式:CommonJS通过module.exports/exports导出;ESModule通过export/exportdefault导出。导入方式:CommonJS用require()函数导入;ESModule用import语法导入。值的特性:CommonJS导出的是值的拷贝,原模块值修改后,导入方不会更新;ESModule导出的是值的引用,原模块值变化,导入方实时更新。循环依赖:CommonJS会缓存已加载模块,截断循环依赖,不会报错;ESModule对循环依赖校验更严格,需保证依赖闭环合法。文件后缀:CommonJS可省略.js后缀;ESModule必须写全文件后缀。3.Node.js中的__dirname、__filename、process.cwd()区别?答案:__dirname:当前执行文件所在的目录绝对路径,固定不变,和执行命令的位置无关。__filename:当前执行文件的完整绝对路径(包含文件名)。process.cwd():当前命令行的工作目录,也就是你执行node命令时所在的文件夹路径,会随执行位置改变。实战场景:读取静态文件、配置文件时,优先用__dirname拼接路径,避免因执行目录不同导致路径报错。二、异步与事件循环核心(高频必考)1.说说Node.js事件循环的执行流程答案:Node.js事件循环是实现非阻塞I/O的核心,整体执行顺序分为6个阶段,循环往复:执行顺序:timers->pendingcallbacks->idle/prepare->poll->check->closecallbackstimers阶段:执行setTimeout、setInterval的回调。pendingcallbacks阶段:执行延迟的I/O回调(大部分系统错误回调)。idle/prepare:系统内部调用,开发者基本接触不到。poll阶段(核心):获取新的I/O事件,执行I/O回调,空闲时会阻塞等待新事件。check阶段:专门执行setImmediate回调。closecallbacks阶段:执行关闭的回调,比如socket.close()。关键补充(面试加分):微任务优先级高于宏任务,每一个事件循环阶段执行完毕后,会清空当前所有微任务,再进入下一个阶段。微任务优先级:process.nextTick>Promise.then/catch/finally2.setTimeout、setImmediate、process.nextTick的执行顺序?答案:分两种场景,是面试经典考题:场景1:全局直接执行执行顺序:process.nextTick>setTimeout>setImmediate场景2:在I/O回调内部执行(比如fs.readFile回调中)执行顺序:process.nextTick>setImmediate>setTimeout原因:I/O回调运行在poll阶段,执行完后会直接进入check阶段,所以setImmediate会优先于timers阶段的setTimeout执行。3.什么是回调地狱?怎么解决?答案:多层嵌套异步回调代码,层级越来越深、代码可读性极差、难以维护和调试,这种代码结构就是回调地狱。解决方案(从旧到新):拆分独立函数,减少嵌套层级;使用Promise扁平化异步代码;使用async/await(最终最优方案),彻底解决嵌套问题,代码同步化写法,可读性最高。三、文件与流操作1.Node.js中fs同步、异步、Promise版API的区别?答案:同步API(fs.readFileSync):阻塞事件循环,代码执行完才会往下走,适合启动初始化配置读取,不适合业务接口使用,高并发下会阻塞服务。异步回调API(fs.readFile):非阻塞,通过回调函数获取结果,不会阻塞事件循环,适合业务场景,但容易产生回调嵌套。Promise版API(fs/promises):官方推荐,无需自己封装Promise,可直接配合async/await使用,代码简洁、无嵌套,是目前项目主流用法。2.什么是流(Stream)?有哪些类型?解决什么问题?答案:流是Node.js处理大文件、大数据流的核心机制,核心是分片读取、分片写入,不用一次性把整个文件加载到内存,避免内存溢出。四种基础流类型:Readable可读流:读取数据(读取文件、接口数据流)。Writable可写流:写入数据(写入文件、响应客户端)。Duplex双向流:既可读又可写(TCP套接字)。Transform转换流:双向流基础上可加工数据(压缩、解压、编码转换)。核心优势:处理超大文件时,内存占用极低,不会因为文件过大导致服务崩溃,日常文件上传、下载、压缩都基于流实现。四、网络与HTTP服务1.原生http模块搭建服务的原理?req、res对象分别是什么?答案:Node.jshttp模块基于TCP协议封装,通过创建HTTP服务器,监听指定端口,接收客户端请求、处理逻辑、返回响应。req(request):客户端请求对象,包含请求头、请求参数、请求方法、URL、请求体等所有客户端信息,是可读流。res(response):服务端响应对象,用于设置响应头、状态码、返回数据、结束响应,是可写流。每次客户端发起请求,都会触发一次request事件,生成独立的req和res对象,互不干扰。2.为什么Node.js适合高并发场景?单线程如何处理多请求?答案:Node.js主线程是单线程,但依靠事件循环+非阻塞I/O+线程池实现高并发:所有网络、文件、数据库I/O操作都会交给系统底层或libuv线程池处理,不会阻塞主线程;I/O等待期间,主线程可以继续处理其他客户端请求;只有I/O结果返回后,对应的回调才会进入事件循环排队执行。局限性:不适合CPU密集型任务,大量计算会阻塞主线程,导致所有请求卡顿。解决方案是开启多进程、工作线程拆分计算任务。五、进程与线程1.进程和线程的区别?Node.js单线程指的是什么?答案:进程:操作系统资源分配的最小单位,独立占用内存、端口资源,进程之间互不干扰、开销大。线程:CPU调度的最小单位,共享所在进程的内存资源,开销小、切换快。Node.js所谓的单线程,特指JS执行主线程是单线程,负责执行业务代码、事件循环。底层libuv、V8、文件读写、网络请求都是多线程运作,只是开发者感知不到。2.cluster模块的作用?如何利用多核CPU?答案:默认Node.js单进程只能占用CPU一个核心,多核服务器会浪费硬件性能。cluster模块可以创建多个子进程,充分利用多核CPU。核心特点:主进程负责管理,子进程负责处理业务请求;所有子进程可以监听同一个端口,通过主进程负载均衡分发请求;一般开启和CPU核心数一致的子进程,性能最优。六、工程化与性能优化1.Node.js服务常见的性能瓶颈及优化方案答案:常见瓶颈:CPU密集型任务阻塞事件循环;无效的文件重复读写、数据库慢查询;内存泄漏、长连接堆积;同步代码过多阻塞主线程。优化方案:CPU密集型任务拆分到子进程/工作线程;开启cluster多进程利用多核;接口、数据库结果做缓存,减少重复查询;大文件操作统一使用流,避免内存溢出;禁用业务代码中的同步I/O方法;监控内存使用,及时排查闭包、全局变量导致的内存泄漏。2.什么是内存泄漏?Node.js常见内存泄漏场景答案:内存泄漏指程序不再使用的内存资源,没有被垃圾回收机制释放,长期堆积导致内存占用越来越高,最终服务卡顿、崩溃。常见场景:全局变量滥用,变量永久常驻内存;闭包长期持有变量引用,导致无法回收;定时器、事件监听未手动销毁,持续占用内存;缓存无过期策略,数据无限堆积。七、异常与安全1.Node.js如何捕获全局异常?防止服务崩溃答案:Node.js主线程一旦抛出未捕获异常,进程会直接退出,生产环境必须做异常捕获:同步异常:try/catch捕获;Promise异步异常:catch方法捕获;全局未捕获异常:监听process.on('uncaughtException');未捕获的Promise拒绝:监听process.on('unhandledReject

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论