Skip to content

Node.js 技术架构

目录

  • JS 如何调用 C++
  • libuv & v8 功能
  • EventLoop 简单介绍
  • Node.js 技术架构总结
  • Node.js API 与学习方法

文件模块

Node.js 不是什么

不是 web 框架

Node.js 并不是 web 后端框架

所以你不能把 Node.js与 Flask或 Spring 对比

不是编程语言语言

Node.is 并不是后端的 JS

所以你不能把 Node.is与 Python 或 PHP 对比

Node.js 是什么

是一个平台

它将多种技术组合起来

让 JavaScript 也能调用系统接口、开发后端应用

Node.is 用到了哪些技术

V8 引擎

libuv

C/C++ 实现的 c-ares、OpenSSL、zlibhttp-parser、等库

Node.js 技术架构

Node.is API

http 模块、fs 模块、、steam 模块等

Node.js bindings让 JS 和 C/C++ 通信

JS 引擎V8

跨平台的异步I/0能力

libuv DNS 解析c-ares C/C++ 插件自定义其他能力 加密解密OpensSl 其他... http_parser、zlib等

可以看的书:https://github.com/yjhjstz/deep-into-node

image-20240801081445610

libuv 是什么

背景

FreeBSD 系统上有 kqueue

Linux 系统上有 epoll

Windows 系统上有IOCP

Ryan 为了一个跨平台的异步 I/O 库,开始写 libuv

libuv 会根据系统自动选择合适的方案

功能

可以用于 TCP/UDP/DNS/文件等的异步操作

V8 是什么

功能

将JS源代码变成本地代码并执行

维护调用栈,确保 JS 函数的执行顺序

内存管理,为所有对象分配内存

垃圾回收,重复利用无用的内存

实现 JS 的标准库

注意

V8 不提供 DOM API V8 执行 JS 是单线程的

可以开启两个线程分别执行 JS

V8 本身是包含多个线程的,如垃圾回收为单独线程

自带 event loop 但 Node.is 基于 libuv 自己做了一个

Event Loop 是什么

什么是 Event

计时器到期了

读取出错了文件可以读取了

socket 有内容了、关闭了

什么是 Looploop

就是循环,比如 while(true) 循环

由于事件是分优先级的,所以处理起来也是分先后的

所以 Node.is 需要按顺序轮询每种事件

这种轮询往往都是循环的,1->2->3->1->2->3

Event Loop

操作系统可以触发事件,JS可以处理事件

Event Loop 就是对事件处理顺序的管理

Event Loop

顺序示意图

javascript
   ┌───────────────────────┐
┌─>│        timers         │
│  └──────────┬────────────┘
│  ┌──────────┴────────────┐
│  │     I/O callbacks     │
│  └──────────┬────────────┘
│  ┌──────────┴────────────┐
│  │     idle, prepare     │
│  └──────────┬────────────┘      ┌───────────────┐
│  ┌──────────┴────────────┐      │   incoming:   │
│  │         poll          │<─────┤  connections, │
│  └──────────┬────────────┘      │   data, etc.  │
│  ┌──────────┴────────────┐      └───────────────┘
│  │        check          │
│  └──────────┬────────────┘
│  ┌──────────┴────────────┐
└──┤    close callbacks    │
   └───────────────────────┘

重点阶段

timers 检查计时器 poll轮询,检查系统事件

check 检查 setlmmediate 回调

其他阶段用得较少

注意

大部分时间,Node.is 都停在 poll轮询阶段

大部分事件都在 poll阶段被处理,如文件、网络请求

https://juejin.cn/post/6844903582538399752

总结

  • 用 libuv 进行异步 I/O 操作

  • 用 event loop 管理事件处理顺序

  • 用 C/C++库高效处理 DNS/HTTP...

  • 用 bindings 让 JS 能和 C/C++ 沟通

  • 用 V8 运行 JS

  • 用 Node.is 官方库简化 JS 代码

    • http 模块、fs 模块、steam 模块等
  • 这就是 Node.js

Node.js 工作流程

![image-20240801083325442](D:\Documents\PicGo Files\image-20240801083325442.png)