面试题:
1.为什么要使用Nodejs? 好处是什么?
- Nodejs是一个基于chrome V8引擎的JS运行环境,所以可以前后端都使用JS,语言统一
- Nodejs 特点是 事件驱动,高效的I/O处理,处理大量并发I/O请求时表现出色,不会阻塞线程
- 生态系统丰富:可以通过npm方便的安装和管理各种包;快速搭建应用
- Nodejs是单线程, 并且也可以通过cluster模块来利用多核cpu
- V8引擎的优化:
- V8引擎在执行js代码时,会将代码编译成机器码,这个编辑过程有即时编译JIT技术。
- 现将js代码解析成抽象语法树AST
- 然后根据代码执行频率和性能瓶颈等因素,动态的将一些关键的js代码编译成机器码
- 对于一个频繁调用的函数,V8引擎会对其进行JIT编译、优化,以减少执行时间
-
Nodejs 的运行机制是什么?
- 事件循环机制
- 模块加载机制
- 异步I/O机制
- V8引擎交互机制:V8引擎通过JIT即时编译负责解析、编译和执行代码
-
Nodejs 异常捕获 怎么做的?
- try catch
- 全局异常捕获:
process.uncaughtException 事件
-
process.nextTick setImmediate 有什么区别?
- nextTick类似微任务,在当前执行栈完成后执行(在微任务之前,在各个阶段完成后)
- setImmediate 执行时机更靠后,在检查阶段
-
yarn 和npm 的区别 ?为什建议使用yarn?
- yarn 更快,因为有更高效的缓存机制(npm也有缓存机制)
(并行安装,npm旧版本是同步,但新版本也是异步的了)- 依赖版本有冲突的时候,yarn策略更稳定(npm也有依赖冲突解决策略)
- yarn 工作区功能更强大(npm也有类似功能)但yarn更灵活
-
怎么查看V8引擎的使用情况
process.memoryUsage()- Chrome开发者工具
- 专门的Nodejs性能分析工具:node-profiler
-
node 中两种导出方式的区别是什么?
- module.exports 是原始的
- exports 对module.exports 的引用
-
- v8垃圾回收机制,根据对象的存活的生命周期不同分为老生代和新生代
- 新生代:Scavenge算法:等大区域 from-to空间 标记复制
- 老生代:标记清除 和整理算法结合
- v8垃圾回收机制,根据对象的存活的生命周期不同分为老生代和新生代
-
哪些情况会造成V8引擎的内存泄漏
- 全局变量,闭包,定时器,重复的事件监听,监听事件没有移除
-
线程和进程有什么区别
- 一个进程可以有多个线程,线程是资源执行的最小单位; 线程可以共享,进程有独立的内存
-
Nodejs中怎么检测异步操作的时间
- console.time() + console.timeEnd()
process.hrtime() 高精度时间
- NODE_ENV 是什么?
环境变量: 应用程序运行的环境,有development、production、testing 一般通过全局变量process.env 上挂载变量来表示当前环境:
process.env.NODE_ENV
- process.argv 是什么 ?
通过终端执行命令时,可以通过argv获取到传入的命令行参数;返回值是一个数组
-
利用多核处理器提高性能
-
cluster 模块创建工作进程 和 worker_threads 模块创建线程
-
child_process 和 cluster模块
-
发布订阅模式
-
异步读取文件
-
先从文件缓存区,再从原生模块,再绝对、相对、目录、第三方等查找,找到后缓存
-
nodejs有6个阶段,微任务的执行时机不同;Nodejs有线程池处理I/O操作
就是在应用程序和系统软件之间的一类软件;主要是为了扩展功能,在nodejs中主要指封装HTTP请求;比如body-parser用于解析传入的post请求的请求体数据;还有一些日志记录的中间件等、解析cookie头的中间件;