Node 体系

19 阅读1分钟

node

node 核心构成

  1. v8 :用于解释执行js 代码,本身计算机并不认识 js 代码 需要经过词法,语法分析,才能转换为可识别代码
  2. libuv 提供node 事件循环机制,异步处理
  3. 第三方库: http 服务,文件操作,加密解密等

require

平时通过commonjs 规范,实现同步,值拷贝式导入,但是它内部,具体是通过什么方式来做的呢

  1. 首先,会判断当前是否存在缓冲,若无,通过文件读取机制,获取当期目录下文件内容执行,并通过函数包裹,包含有module,require,exports 等,参数,因此才可以通过require 来进行引用。并将结果进行缓存
functionexportsmodulerequire,——filename,dirname){
//文件
const filname = resolveFilename()
// 当期文件内容

module.exports ={
//...

}

}
)

那基于这个,node 加载模块顺序,优先加载内置模块,之后是按照目录查找,最后是按照nodemodules目录匹配

node 循环机制(旧版,新版循环基本统一)

  1. timer 阶段
  2. idle prepare 阶段
  3. poll 阶段 io 循环
  4. check 阶段 检查 setimmediate 阶段
  5. close 关闭回调阶段-
  6. 相比于浏览器,一个是 process。nexttick 优先于所有微任务,以及,node 在执行每一个阶段后,都会先清空当期微任务队列,然后再去进行执行
// timers阶段
setTimeout(() => {
  console.log("setTimeout");

  Promise.resolve().then(() => {
    console.log("setTimeout Promise.resolve");
  });
});

// check阶段
setImmediate(() => {
  console.log("setImmediate");
  Promise.resolve().then(() => {
    console.log("setImmediate Promise.resolve");
  });
});

// 微任务
Promise.resolve().then(() => {
  console.log("Promise.resolve");
});

// 微任务
process.nextTick(() => {
  console.log("process.nextTick");
  Promise.resolve().then(() => {
    console.log("nextTick Promise.resolve");
  });
});

image.png