了解Node.js技术架构

158 阅读3分钟

Node.js版本

双数是稳定版,单数是非稳定版本。

nrm 用于切换下载源(yrm)

Node.js理解

  • 不是web框架,不能把node.js与flask或者spring对比。
  • 不是编程语言,不能把它跟python或者php对比。
  • 它是一个平台,他将多种技术组合起来,让js也能调用系统接口,开发后端应用。
  • 他用到的技术V8引擎、libuv、c/c++实现的c-ares(dns解析)、http-parser(解析http)、openssl(加密解密)、zlib(压缩)等库

image.png

Node.js bindings

为了让JS和C/C++通信

node.js的作者在两者中间加了一个bindings的模块,让两者之间保持数据类型上的统一以及其他协调。

背景:c/c++实现了一个http_parser的库,很高效。前端开发者只会写js,但是想要调用这个库,直接调用肯定不行,所以就需要一个桥梁

binding:例子:node.js用c++对http_parser进行封装,使它符合某些要求,封装文件叫做http_parser_bindings.cpp。用node.js提供的编译工具将其编译为.node文件。然后js代码就可以直接require这个.node文件,这样js就能调用c++库,中间的桥梁就是binding。

nodejs相关依赖理解

libuv

背景: 每个系统上的异步I/O都不同, freeBSD系统有kqueue,linux系统有epoll,windows系统上有iocp。 libuv就是为了一个跨平台的异步i/o库,libuv会根据系统自动选择合适的方案。

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

V8

功能

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

注意:

  • v8不提供dom api,dom api是浏览器提供的
  • v8执行js是单线程的,v8本身是多线程的
  • 可以开启两个线程分别执行js
  • v8本身是包含多个线程的,比如垃圾回收为一个单独的线程
  • v8自带了event loop 但是node.js基于libuv自己做了一个

Event Loop

  1. event:事件
  • 计时器到期了
  • 文件可以读取了、读取出错了
  • socket有内容了、关闭了
  1. loop:循环

事件是分优先级的,处理的时候也会分先后,所以node.js需要按顺序轮询每种事件。这种轮询往往是循环的1->2->3->1->2->3

  1. event loop

操作系统可以触发事件,js可以处理事件。eventloop就是对事件处理顺序的管理。

  1. 顺序

image.png

重点阶段:

  • timers检查计时器
  • poll轮询,检查系统事件
  • check检查setImmediate回调
  • 其他阶段用的较少

注意:

  • 大部分事件,nodeJs都停留在poll轮询阶段。
  • 大部分事件都在poll阶段被处理,如文件、网络请求

总结

  • 用libuv进行异步I/O操作
  • 用eventloop管理事件处理顺序
  • 用c/c++库高效处理dns/http...
  • 用bingdings让js能和c/c++沟通
  • 用v8运行js
  • 用node.js标准库简化js代码

image.png