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(压缩)等库
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
- event:事件
- 计时器到期了
- 文件可以读取了、读取出错了
- socket有内容了、关闭了
- loop:循环
事件是分优先级的,处理的时候也会分先后,所以node.js需要按顺序轮询每种事件。这种轮询往往是循环的1->2->3->1->2->3
- event loop
操作系统可以触发事件,js可以处理事件。eventloop就是对事件处理顺序的管理。
- 顺序
重点阶段:
- timers检查计时器
- poll轮询,检查系统事件
- check检查setImmediate回调
- 其他阶段用的较少
注意:
- 大部分事件,nodeJs都停留在poll轮询阶段。
- 大部分事件都在poll阶段被处理,如文件、网络请求
总结
- 用libuv进行异步I/O操作
- 用eventloop管理事件处理顺序
- 用c/c++库高效处理dns/http...
- 用bingdings让js能和c/c++沟通
- 用v8运行js
- 用node.js标准库简化js代码