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

下载本文档

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

文档简介

Node.js高频面试题及详细真实答案(实战版)一、Node.js基础概念1.简单说说你对Node.js的理解,它和浏览器JS有什么区别?参考答案:Node.js是一个基于ChromeV8引擎的服务端JavaScript运行时环境,不是框架也不是语言。它让JS可以脱离浏览器,在服务器、本地终端运行,主要用于服务端接口、中间层、脚本工具、工程化构建等场景。和浏览器JS的核心区别:运行环境不同:浏览器有DOM、BOM、window全局对象;Node没有DOM/BOM,全局是global,新版也支持globalThis。核心能力不同:Node拥有文件读写、网络请求、进程操作、操作系统调用等服务端能力;浏览器JS受跨域、安全策略限制,无法直接操作本地文件和底层网络。模块规范不同:浏览器主流是ESModule;Node同时支持CommonJS和ESModule,默认旧版本为CommonJS。事件循环机制有差异:两者事件循环宏微任务执行顺序、阶段划分不同。2.CommonJS和ESModule的核心区别?参考答案:CommonJS是Node传统模块规范,ESModule是JS官方标准模块规范。导入导出方式:CommonJS使用module.exports/exports、require();ESModule使用import/export。加载时机:CommonJS是运行时同步加载,执行代码时才加载模块;ESModule是编译时静态解析,打包阶段就能确定模块依赖。值特性:CommonJS导出的是值的拷贝,原模块值变化,导入方不会更新;ESModule是值的引用绑定,原模块值改变,导入方实时更新。循环依赖处理:CommonJS遇到循环依赖会返回已加载的不完整模块,不会报错;ESModule可以正常处理循环依赖。异步特性:require同步阻塞;import支持异步动态import()。3.Node.js中的全局变量有哪些?常用的有什么?参考答案:常用核心全局变量/对象:global:Node顶层全局对象,所有全局变量都会挂载在这里。__dirname:当前文件所在目录的绝对路径。__filename:当前文件的绝对路径(包含文件名)。require:模块导入方法。module/exports:模块导出对象。process:进程对象,可获取环境变量、进程PID、监听进程事件等。Buffer:二进制缓冲区,处理字节数据。注意:__dirname、__filename不是global下的属性,是模块级变量。二、Node.js核心原理(重点高频)4.讲讲Node.js的事件循环机制,和浏览器事件循环的区别?参考答案:Node.js事件循环是非阻塞I/O模型的核心,让单线程可以处理大量异步任务,整体分为6个阶段,循环往复执行:timers:执行setTimeout、setInterval回调pendingcallbacks:延迟执行的系统回调(极少场景用到)idle、prepare:系统内部使用poll:核心阶段,获取新的I/O事件,执行I/O回调check:执行setImmediate回调closecallbacks:执行关闭回调,如socket.close微任务执行优先级:Node中process.nextTick优先级最高,其次是Promise.then、async/await等微任务,每完成一个事件循环阶段,就会清空对应微任务队列。和浏览器的核心区别:浏览器:执行一个宏任务→清空所有微任务→下一轮渲染。Node:按阶段执行宏任务,完成当前整个阶段宏任务后,再清空微任务队列,再进入下一阶段。Node独有process.nextTick、setImmediate,浏览器没有。5.process.nextTick和setTimeout、setImmediate的区别?参考答案:process.nextTick:不属于事件循环任何阶段,优先级最高,每一轮阶段切换前优先执行完所有nextTick任务,容易阻塞事件循环,不适合大量循环调用。setTimeout(fn,0):进入timers阶段执行,延迟至少1ms,优先级低于nextTick、微任务。setImmediate:进入check阶段执行,固定在poll阶段之后,适合I/O操作后立即执行任务。经典场景:全局直接执行setTimeout和setImmediate,执行顺序不确定;在I/O回调内部,setImmediate一定先执行。6.什么是事件驱动?Node事件触发器(EventEmitter)原理?参考答案:事件驱动就是通过订阅事件、触发事件的方式处理逻辑,不用轮询等待,是Node异步编程的核心模式。EventEmitter是Node内置的事件发布订阅类,原理:内部维护一个事件监听器对象,key为事件名,value为回调函数数组。on():注册事件监听,追加回调。emit():触发事件,依次执行对应回调函数。once():只执行一次监听,执行后自动移除。off():移除指定事件监听。注意:EventEmitter回调是同步执行,不是异步;如果事件回调过多,会阻塞主线程。三、异步编程与Promise、async/await7.Node常见的异步方案有哪些?各自优缺点?参考答案:四种主流方案:回调函数:最原始,简单场景够用,缺点是多层嵌套会产生回调地狱,代码可读性、维护性极差。Promise:解决回调地狱,支持链式调用,状态不可逆,适合串行、并行异步场景,缺点是冗余代码较多。async/await:Promise语法糖,代码同步化,可读性最高,是目前项目主流用法。事件监听:适合多次触发的异步场景(文件流、网络请求),单次异步场景不适用。8.async/await的错误处理方式有几种?参考答案:三种常用方式,项目中最常用前两种:try/catch:最主流,捕获await执行的所有异常,精准可控。Promise.catch():直接给await的Promise加catch,无需try/catch。全局unhandledRejection监听:捕获全局未处理的Promise异常,用于兜底。四、文件与流操作(Stream、Buffer)9.Buffer是什么?和字符串的区别?参考答案:Buffer是Node专门用于处理二进制数据的缓冲区,底层是固定长度的内存数组,直接操作内存,性能极高。和字符串区别:字符串是字符数据,Buffer是字节数据。字符串不可变,Buffer可以直接修改内存数据。文件、网络传输、图片、视频等二进制数据,只能用Buffer处理。10.什么是Stream?有几种流?为什么要用流?参考答案:Stream是Node流式数据处理接口,分段读写数据,不用一次性把大文件加载到内存,专门解决大文件操作内存溢出问题。四种核心流:Readable:可读流,读取数据(读取文件、接口数据)Writable:可写流,写入数据(写入文件、响应前端)Duplex:双向流,既可读又可写(TCP套接字)Transform:转换流,读写过程中可修改数据(压缩、加密、转码)使用场景:大文件上传下载、日志切割、视频流式传输,避免一次性加载超大内存导致服务崩溃。五、网络与HTTP、服务端核心11.原生HTTP模块怎么实现一个简单服务?req、res对象常用方法?参考答案:Node内置http模块可快速搭建Web服务,核心逻辑:创建服务、监听端口、处理请求响应。req(请求对象)常用:req.method:请求方式req.url:请求路径req.headers:请求头req.on('data'):接收post数据res(响应对象)常用:res.writeHead():设置状态码、响应头res.write():写入响应内容res.end():结束响应,必须调用,否则请求挂起12.Node单线程为什么能支撑高并发?参考答案:Node主线程是单线程,但并不是全程单线程,核心是事件循环+非阻塞I/O+线程池的模型:所有文件读写、网络请求、数据库操作等I/O任务,都会交给底层libuv线程池处理,不占用主线程。主线程只负责接收请求、派发任务、处理回调,不会阻塞。I/O阻塞耗时由线程池承担,主线程可以持续处理新请求,所以能支持海量并发连接。缺点:不适合CPU密集型任务,大量计算会阻塞主线程,导致服务卡顿。六、异常与进程、性能优化13.Node常见异常类型及捕获方式?参考答案:常见异常:同步代码错误、异步回调错误、Promise未捕获异常、事件emitter错误、进程异常。对应捕获方案:同步错误:try/catch回调错误:回调第一个参数err判断Promise错误:.catch()、try/catchEventEmitter错误:必须监听error事件,否则直接崩溃全局兜底:process.on('unhandledRejection')、process.on('uncaughtException')14.如何解决Node单线程CPU密集型阻塞问题?参考答案:使用child_process子进程:将计算任务交给子进程,不占用主线程。使用worker_threads工作线程:专门处理CPU密集任务,支持线程间数据通信。开启多进程集群:通过cluster模块,利用多核CPU,多进程分担压力。任务拆分异步化:拆分大计算任务,分批执行,让出事件循环。15.简述Node.js内存泄漏的常见场景和排查方式参考答案:常见泄漏场景:全局变量滥用,变量无法回收定时器、事件监听未手动清除闭包常驻内存,引用未释放缓存无限累加,无过期清理机制排查方式:使用process.memoryUsage()监控内存变化ChromeDevTools内存快照分析借助clinic.js、node-heapdump工具定位泄漏点七、工程化与NPM实战16.package.json和package-lock.json的作用?参考答案:package.json:项目配置文件,记录项目名称、版本、依赖、脚本、入口文件等,声明依赖的版本范围,允许兼容升级。package-lock.json:锁定依赖具体安装版本、依赖树、下载地址,保证团队所有人、线上环境安装的依赖版本完全一致,避免版本差异导致的bug。17.npm依赖dependencies和devDependencies区别?参考答案:dependencies:项目运行时必须依赖,打包上线会保留,如express、axios、mongoose。devDependencies:仅开发、构建、测试阶段使用,上线打包会忽略,如webpack、eslint、mocha、nodemon。八、Express/Koa高频面试题18.Express和Koa的区别?参考答案:迭代与架构:Express是传统框架,基于回调实现;Koa是Express原班团队打造,基于Promise和async/await,彻底告别回调地狱。中间件模型:Express是顺序执行,洋葱模型不完整;Koa是标准洋葱模型,先进后出,前置后置逻辑拆分更清晰。内置功能:Express内置路由、静态资源、body解析;Koa极简,所有功能靠第三方中间件,更轻量灵活。异常处理:Koa支持全局统一异常中间件,async/await错误集中处理更优雅;Express异常处理相对零散。19.什么是Koa洋葱中间件模型?参考答案:Koa中间件执行逻辑形似洋葱:从外到内

温馨提示

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

评论

0/150

提交评论