一 Node.js
-
Node.js是一个平台
(1)它将多种技术组合起来。
(2)让JavaScript也能调用系统接口,开发后端应用。 -
Node.js用到了哪些应用?
(1)V8引擎
(2)libuv
(3)C/C++实现的c_ares(DNS解析),http_server(解析http),openSSL(加密解密),zlib(压缩)等库 -
Node.js工作流程
二 Node.js技术架构
- 最上层是Node.js的API,包括http,fs,stream等模块。
- 第二层包含Node.js bindings(让js和c/c++通信)和c/c++插 件(自定义其他功能)。
- 最底层包含V8引擎,跨平台的异步I/O能力,DNS解析,加密解密等
三 什么是bindings?
- js调用c++库的一个桥梁,扩展了js的能力
- Node.js用C++对http_parser做封装,使它符合某些要求,封装的文件叫http_parser_bindings.cpp。用Node.js提供的编译工具将其编译为可用文件。js代码可以直接require这个可用文件。这样js就能调用c++库,中间桥梁就是binding。由于Node.js提供了很多binding,所以加个s。这就是bindings。
- js与c++交互,官网文档例子
四 libuv是什么?
一个跨平台的异步I/O库,可以用于TCP,UDP,DNS,文件等异步操作。有了这个功能,Node.js就可以摆脱I/O瓶颈,所有的I/O工作都交给c/c++来做,只负责一些简单地调用。
五 V8是什么?
-
功能 (1)将js源代码变成本地代码并执行。
(2)维护调用栈,确保js函数的执行顺序。
(3)内存管理,为所有对象分配内存。
(4)垃圾回收,重复利用无用内存。
(5)实现js标准库。 -
注意 (1)V8不提供DOMAPI,DOMAPI浏览器提供的。
(2)V8执行js是单线程的。
(3)可以开启两个线程分别执行js。
(4)V8本身是包含多个线程的,如垃圾回收为单独线程。
(5)自带event loop但Node.js基于libuv自己做了一个。
六 什么是event loop?
-
操作系统可以触发事件,js可以处理事件。但是被触发的事件是有先后顺序的,就算是同时触发也得分先后顺序执行。event loop就是对事件处理顺序进行管理的。
-
顺序示意图
-
重点阶段 (1)timer检查计时器。
(2)poll轮询,检查系统事件。
(3)check检查setImmediate回调。
(4)其他阶段用的较少。 -
注意 大部分时间,Node.js都停在poll轮询阶段。大部分事件都在poll阶段被处理,如文件,网络请求。
七 总结
Node.js
-
用libuv进行异步I/O操作。
-
用event loop管理事件处理顺序。
-
用c/c++库高效处理DNS/HTTP。
-
用bindings能让js和c/c++沟通。
-
用V8运行js。
-
用Node.js标准库简化js代码。 简单来讲,Node.js就是一个平台,让运行其中的js代码功能更加强大。