Node.js 是一个平台javascript
Node.js 用到了哪些技术java
V8 引擎、libuv、C/C++ 实现的 c-ares(DNS解析)、http-parser(HTTP 解析)、OpenSSL(HTTPS)、zlib(压缩) 等库。node
若是对源码实现感兴趣,推荐查看:git
Node.js 技术架构如图所示,下面简单介绍一下它们的做用后端
假如 C/C++ 实现了一个 xxx 库,很好用,JS 没法直接调用它。Node.js 用 C++ 对其进行了封装,使它符合某些要求。封装的文件叫 xxx_bindings.cpp,而后使用 Node.js 编译为 .node 文件(并非惟一的方式,也有其余方法),而后 JS 能够直接 require 这个文件,binding 文件就是 JS 和 C/C++ 库中间的桥梁,而 Node.js 提供了不少 binding,因此加个 s,也就是 bindingsapi
一个跨平台的异步 I/O 库,会根据系统自动选择合适的方案网络
用于 TCP / UDP / DNS / 文件等异步操做多线程
I/O 是什么?
全部输入输出都属于I/O,例如文件读写、访问网络、发送接收文件等
简单说一下 Event Loop:
Event(事件)
计时器到期、文件可读、文件读取出错、socket有内容了、socket 关闭了,这些都是Event
Loop(循环)
事件是有优先级的,例如:
setTimeout(f1,100) fs.readFile('/1.txt',f2) server.on('close',f3) 复制代码
这上面的三个事件若是同时发生,确定是会有一个执行优先级的规则(人为规定)的,而 Node.js会按照这个规则轮询事件,如 1->2->3->1->2->3
Event Loop
推荐阅读:Event Loop、计时器、nextTick-方应杭
操做系统触发事件,JS 处理事件,Event Loop 就是对事件处理顺序的管理
执行顺序
![]()
重点:
- timer检查定时器
- poll 轮询,检查系统事件
- check 检查 setImmediate 回调
- 其余阶段不多使用
大部分时间,Node.js 都停在 poll 轮询阶段。大部分事件也都在 poll 阶段被处理,如文件、网络请求。
setTimeout(f1,0) setImmediate(f2) // 上方代码大部分时间是 setImmediate 先执行 // 由于大部分时间 Node.js 停留在 poll 阶段 // 前往 timer 阶段须要先通过 check 阶段 // 会先执行 setImmediate 回调 复制代码
Node.js API 是 Node.js 对外开放用来调用上述功能进行的应用接口,须要使用时可自行查看文档