什么是NodeJs

NodeJs是基于v8引擎执行js代码的环境
NodeJs基于非阻塞IO和事件驱动机制,比较适用于I/O密集的场景,不适合CPU密集计算的场景
所以有的公司会在前端和后端之间加一层node层,用来做请求的处理,数据的缓存之类的

Koa和express区别

  • Koa和express都是基于洋葱模型,执行的时候从外到里,执行完毕之后从里到外
  • Express内部是基于callback形式的,所以不支持异步,如果在express中间件中加入异步函数,执行结果就不是严格的洋葱模型
  • Koa2是基于Promise和async/await实现的,所以严格遵循洋葱模型
  • Koa2比较轻量级,不会自带一些中间件,比如router,static中间件,都需要额外安装
  • express则自带这个中间件,所以体积会大些
  • Koa2把request,response都封装在context上面

    Node里面的模块

  • Node里面的模块都是Module的一个实例

  • Node require是具有缓存,先通过路劲查找文件,发现如果有缓存就直接用缓存,没有缓存的话就读取文件,输出module.exports属性
  • module.exports和exports其实是相等的,都是等于一个空属性,所以如果直接给exports赋值的话,module.exports还是指向空对象

    Node事件循环机制

    Node事件循环机制是分为几个阶段的,我比较熟悉的阶段就是timmer,poll,还有check阶段
    timmer阶段一般用来处理setTimeout和setInterval
    poll阶段比较复杂,有的时候还会阻塞,timmer和check什么时候执行是由poll阶段决定的
    check阶段就是处理setImmediate事件
    close callback:调用close的时候执行的

在poll阶段
如果当前队列为空
如果由setImmdiate,就进入check阶段,然后进入下一轮轮询
如果由timmer,就进入timmer阶段,然后进入下一轮轮询,
如果都没有,就会阻塞在当前阶段,知道有callback返回
如果当前队列不为空,先同步执行该阶段的callback,执行完毕之后,队列为空,就进入上面队列为空的检查
process.nexttick实在阶段切换的时候执行,所以具有插队的功能

node的cluster开启多进程

  1. nodejs文件读取(createReadStream)基于stream,还有http的request和response,gulp也是基于流的

如果正常读取的话,先从硬盘读取到内存,然后从内存中读取,如果是小文件的话没问题。如果是大文件,效率就低。采用流的方式,就好像一根吸管,持续的一点点的读取,管道的另外一边收到数据就可以处理了

nodejs支持高并发怎么理解

  1. 我的理解是node是基于事件的,也就是发送等待的过程,所以是支持高并发的

nodejs使用场景

  1. 大量的Ajax请求应用<br />开发命令行工具<br />RESTFUl API

npm install过程

  1. 会先执行preinstall,如果有preinstall<br />确定首层依赖,然后遍历该依赖,获取模块信息,获取模块信息是个递归的过程<br />根据语义化信息,找到最新的包,安装模块<br />扁平化

node错误收集

  1. 一般可以通过try catch收集错误
  2. js代码错误手机,可以通过监听unhandleRejction,uncaughtException处理
  3. domains模块用来处理异步错误
  4. 类似于请求报错等一般会有callback,第一个参数就是error信息