Node全解01_01Node简介

Node.js是什么

是一个平台

  • 将多种技术组合起来
  • 让JS 也能调用系统接口,开发后端应用

Node.js用到那些技术

  • V8引擎
  • libuv
  • C/C++实现的 c-ares、http-parser、OpenSSL、zlib等库

Node.js的技术架构

1
2
3
4
5
6
Node.js API (http模块 fs stream 等)
-------------------------------------
Node.js bindings | c/c++插件
让JS和 c/c++通讯 | 自定义其他能力
------------------------------------------------------------------
JS引擎 v8 | 跨平台的异步IO能力 libuv | DNS解析|加密解密OpenSSL | 其他。。。

随着Node.js的版本从 0.8升级到 12.11.1 架构也一直变化
如果你想看源代码,推进看 0.10版本
因为这一版使用了很长的时间,而且源代码比最新版少很多

如果你想了解更多,可以看 yjhjstz/deep-into-node

什么是 bindings

背景

  • C/C++实现了一个 http_parser 库,很高效
  • 你只会写JS,但是你想调用这个库
  • 直接调用肯定不行,你需要一个中间的桥梁

bindings

  • Node.js 用C++ 对 http_parser 进行封装,使它符合某些要求,封装的的文件叫做 http_parser_bindings.cpp
  • 用 Node.js提供的编译工具将其编译为 .node文件
  • JS代码可以直接 require 这个 .node文件
  • 这样JS就可以 调用 C++库,中间的桥梁就是 bindings
  • 由于 Node.js 提供了很多 binding, 所以叫做 bindings
  • 这就是 bindings

JS 和 C++ 交互

先看下 0.10版的 Node 依赖了什么

libuv是什么

背景

  • FreeBSD 系统有个 kqueue
  • Linux 有个 epoll
  • Windows 有个 IOCP
  • Ryan 为了一个跨平台的异步IO库,开始写 libuv
  • libuv 会根据系统自动选择合适的方案

功能

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

V8是什么

功能

  • 将JS源代码变成本地代码并执行
  • 维护调用栈,确保JS函数的执行顺序
  • 内存管理,为所有对象分配内存
  • 垃圾回收,重复利用无用的内存
  • 实现JS的标准库

注意

  • V8不提供DOM API
  • V8执行 JS 是单线程的, V8本身是多线程的
  • 可以开启两个线程分别执行JS
  • V8本身是包含多个线程的,如垃圾回收为单独线程
  • 自带 eventloop 但 Node.js 基于 libuv 自己做了一个

Event Loop 是什么

什么是 Event

  • setTimeout 的时间到了,就会产生一个事件
  • 文件可以读取了,读取出错了
  • socket 有内容了,关闭了

什么是 Loop

  • loop 就是循环,比如 while(true) 循环
  • 由于事件是分优先级的,所以处理起来也是分先后的
    • setTimeout(f1,100)
    • fs.readFile(‘1.txt’,f2)
    • server.on(‘close’,f3)
  • 所以 Node.js 需要按顺序轮询每种事件
  • 这种轮询往往都是循环的, 1=>2=>3=>1=>2=>3

Event Loop

  • 操作系统可以触发事件,JS可以处理事件
  • Event Loop 就是对事件处理顺序的管理

Event loop

重点阶段

  • times 检查计时器
  • poll 轮询,检查系统事件
  • check 检查 setImmediate 回调
  • 其他阶段可暂时不考虑

注意

  • 大部分时间, Node.js 都停留在 poll 轮询阶段
  • 大部分事件都在 poll 阶段被处理,如文件、网络请求

前面总结过Event loop 的知识点,可参考 Node-JS专精里的Eventloop章节

总结

  • 用 libuv 进行异步I/O操作
  • 用 eventloop 管理事件处理顺序
  • 用 C/C++ 库高效处理 DNS/HTTP …
  • 用 bindings 让 JS 和 C/C++ 沟通
  • 用 V8 运行 JS
  • 用 Node.js 标准库简化 JS 代码
  • 这就是 Node.js