浅析Node.js

338 阅读2分钟

一 Node.js

  1. Node.js是一个平台
    (1)它将多种技术组合起来。
    (2)让JavaScript也能调用系统接口,开发后端应用。

  2. Node.js用到了哪些应用?
    (1)V8引擎
    (2)libuv
    (3)C/C++实现的c_ares(DNS解析),http_server(解析http),openSSL(加密解密),zlib(压缩)等库

  3. Node.js工作流程

二 Node.js技术架构

  1. 最上层是Node.js的API,包括http,fs,stream等模块。
  2. 第二层包含Node.js bindings(让js和c/c++通信)和c/c++插 件(自定义其他功能)。
  3. 最底层包含V8引擎,跨平台的异步I/O能力,DNS解析,加密解密等

三 什么是bindings?

  1. js调用c++库的一个桥梁,扩展了js的能力
  2. Node.js用C++对http_parser做封装,使它符合某些要求,封装的文件叫http_parser_bindings.cpp。用Node.js提供的编译工具将其编译为可用文件。js代码可以直接require这个可用文件。这样js就能调用c++库,中间桥梁就是binding。由于Node.js提供了很多binding,所以加个s。这就是bindings。
  3. js与c++交互,官网文档例子

四 libuv是什么?

一个跨平台的异步I/O库,可以用于TCP,UDP,DNS,文件等异步操作。有了这个功能,Node.js就可以摆脱I/O瓶颈,所有的I/O工作都交给c/c++来做,只负责一些简单地调用。

五 V8是什么?

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

  2. 注意 (1)V8不提供DOMAPI,DOMAPI浏览器提供的。
    (2)V8执行js是单线程的。
    (3)可以开启两个线程分别执行js。
    (4)V8本身是包含多个线程的,如垃圾回收为单独线程。
    (5)自带event loop但Node.js基于libuv自己做了一个。

六 什么是event loop?

  1. 操作系统可以触发事件,js可以处理事件。但是被触发的事件是有先后顺序的,就算是同时触发也得分先后顺序执行。event loop就是对事件处理顺序进行管理的。

  2. 顺序示意图

  3. 重点阶段 (1)timer检查计时器。
    (2)poll轮询,检查系统事件。
    (3)check检查setImmediate回调。
    (4)其他阶段用的较少。

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

七 总结

Node.js

  1. 用libuv进行异步I/O操作。

  2. 用event loop管理事件处理顺序。

  3. 用c/c++库高效处理DNS/HTTP。

  4. 用bindings能让js和c/c++沟通。

  5. 用V8运行js。

  6. 用Node.js标准库简化js代码。 简单来讲,Node.js就是一个平台,让运行其中的js代码功能更加强大。