目录
![e89bae7f09888729744c4d1f8581fe3d.png](https://i-blog.csdnimg.cn/blog_migrate/596d830777818dd4a1c016faf507f7ab.jpeg)
node.js版本特点
双数是稳定版,单数是非稳定版
node.js的含义
node.js不是web框架,不能和Flask、Spring对比;node.js不是编程语言,不能和python、PHP作比较;node.js是一个技术平台,它将多个技术组合起来,让JavaScript能调用技术接口、后端应用。
node.js架构图:如下,纠错:steam模块拼写不对,应该是stream模块,流文件格式
![984beec8f6efb76a9db17bb64e1d3694.png](https://i-blog.csdnimg.cn/blog_migrate/a358b816f9bb52862c0de771bd34073f.jpeg)
bingdings
为什么需要bingdings?
C/C++实现了一个 http_parser库,很高效。但是,开发者只会写JS,也想用这个库。显然,直接用肯定是不行的,因此,需要一个桥梁。这个桥梁就是bingding,由于node.js提供了很多个bingding,因此,后面加一个“s”。
bingdings的工作过程?
- node.js用C++对http_parser进行封装,它符合某些要求,封装后的文件叫做http_parse_bingdings.cpp
- 用node.js提供的编译工具将文件编译成.node文件
- JS代码可以直接require这个.node文件,这样就可以调用C++库了
libuv
node.js之父想做一个跨平台的异步I/O库,libuv由此诞生。每个操作系统都有不同的库,譬如window系统有IOCP库、Linux系统有epoll库、FreeBSD系统的kqueue库,libuv会根据系统自动选择合适的方案。
libuv的功能:用于TCP/UDP/DNS/文件等的异步操作
V8
功能
- 将JS源代码变成本地代码,并且执行
- 维护调用栈,确保JS函数的调用顺序
- 内存管理,为所有的对象分配内存
- 垃圾回收,重复利用无用的内存
- 实现JS的标准库
注意项
- V8不提供DOM API,DOM API是由浏览器提供的
- V8执行JS是单线程的,但是V8可以开启两个线程,分别执行JS,这两个线程毫无联系
- V8本身是包含多个线程的,例如垃圾回收是单独的线程
- V8本身自带了event loop,但是node.js没有用V8的event loop,而是基于libuv自己做一个
event loop
event
比如计时器过期了、文件可以读取了、文件读取出问题了、scoket(http请求里面的内容)有内容、或者关闭了。
loop
翻译为中文就是“循环”,由于计算机处理事件是分优先级的,node.js需要按照顺序轮询每个事件,这种方式往往是循环的。
event loop
操作系统触发事件,JS可以处理事件,而event loop的作用就是决定JS处理这些事件的顺序。
event loop处理顺序的示意图:
![8051071afe6092ee480077d6ab276ae3.png](https://i-blog.csdnimg.cn/blog_migrate/1109fd6107e8a34c29ab1717e4b4f3f8.png)
重要阶段:
- timer:检查计时器
- poll:轮询,检查系统事件
- check:检查setImmediate回调
大部分时间,node.js都会停留在poll轮询阶段,大部分事件都会在poll阶段被处理,如文件、网络请求等等。
node.js整体工作流程图如下:
![1ab84dd1567ebfe7c268a30a71a24154.png](https://i-blog.csdnimg.cn/blog_migrate/88966247d7842fa5e24a880985f3392e.jpeg)
node.js提供的API:白色字体为不重要,黄色字体为需要重点关注
![72d25c694a3ea95d0171decbe2b0b5a0.png](https://i-blog.csdnimg.cn/blog_migrate/5ac65dbe950e7f92623f078afb59e20a.jpeg)
![ab808690fb08b21f28a6df5e7e5b6c3f.png](https://i-blog.csdnimg.cn/blog_migrate/48ce03764a73a487dbd6919caf5fcef7.png)