图片全部搬运自学习Vue3 第二章(配置环境)自己懒得做图了

Node.js的构成

Node.js主要由V8、Libuv和第三方库组成。

  • Libuv:跨平台异步IO库(处理事件循环),除了IO功能还提供线程、进程、信号、定时器、进程间通信、线程池等功能。
  • 第三方库
    • 异步DNS解析(cares)
    • HTTP解析器(旧版:http_parser;新版:llhttp)
    • HTTP2解析器(nghttp2)
    • 解压压缩库(zlib)
    • 加密解密库(openssl)
    • 等等等等
  • V8:实现JS解析(把js编译成机器码)、执行和自定义拓展

从上到下分为三层:

  • 应用层:Node.js API各种模块,基于Libuv,因为可能涉及IO流操作
  • 桥梁层:与底层C或C++通信
  • 底层(C++或C):处理底层机制

Libuv

  • loop参数:事件循环结构的结构体

  • uv_loop_alive:用于注册loop,判断loop里有无任务(是否还有活动),有就开始循环,没有就退出

    loop还在活动的情况:

    1. 有被引用的活动句柄或活动请求
    2. 有正在关闭的句柄
  • uv_update_time:执行setTimeOut(过段时间后执行回调)

  • uv_run_timers:执行setInterval(每隔一段时间都执行回调)

    • 数据结构:链表+二叉堆
    • 把最快过期的节点放到上面,判断是否过期
      • 如果过期就执行回调
      • 如果没有过期,查看repeat,区分setTimeOut和setInterval
        • 如果是setTimeOut,任务过期后就结束了
        • 如果是setInterval,进行重复执行
  • uv_run_pending:处理IO流的回调

  • uv_run_idle&uv_run_prepare:处理其他各种队列

  • uv_io_poll:处理网络相关

  • uv_run_closing_handles:结束,关闭服务器