Node 简介
node.js 不是什么
- 不是web后端框架
- 不是编程语言
node.js是什么
- 将多种技术组合起来
- 让JavaScript也能调用系统接口、开发后端应用
用到了哪些技术
- V8引擎
- libuv
- C/C++实现的 c-ares(实现DNS 域名的解析),http-parser(解析http),OpenSSL(https),zlib(加密)等库
Node特点
单线程
- 进程就是一个一个的工作计划(工厂中的车间)
- 线程是计算机最小的运算单位(工厂中的工人),线程是干活的
- 传统的服务器是多线程的,每进来一个请求,就创建一个线程去处理请求
- Node.js的服务器是单线程的,在后台拥有一个I/O线程池
非阻塞 I/O
I/O:对磁盘的读写操作( Input/ Output)
非阻塞:不会等I/O语句结束,而会执行后面的语句(异步)
异步:调用者发起一个异步调用,然后立即返回去做别的事。“被调用者”通过状态、通知、回调函数等手段来通知“调用者”。
1
2
3
4
5
6
7
8
9let fs = require('fs');
fs.readFile('/app.js',function(err,file){
console.log('我读完文件了!);
})
console.log('我不会被阻塞!')
//我不会被阻塞是在我读完文件了之前输出 =>异步调用
//机制:进行I/O操作,给readFile绑定一个回调函数function(err,file){},并在读取textfile完成后执行回调函数。期间,后面的代码继续执行,不受I/O阻塞
事件驱动
Node.js技术架构

stream模块
- 第一层 可以用js直接调用的api
bingdings 让JS和C/C++通信
举例:
- C/C++实现了一个http_parser库,但不能用JS直接调用这个库,于是需要一个中间的销量
- Node.js用C++对该库进行封装,并用其提供的编译工具将该库编译为.node文件
- js代码可以直接require这个.node文件
- 实现js调用C++库,中间的桥梁–binding
- Node.js提供了很多binding – bindings
V8 JS引擎
- 功能
- 将JS源代码变成本地代码并执行
- 维护调用栈,确保JS函数的执行顺序
- 内存管理,为所有对象分配内存
- 垃圾回收,重复利用无用的内存
- 实现JS的标准库
- 注意
- V8不提供 DOM API
- 本身是多线程,如垃圾回收是单独线程,但执行JS是单线程的
- 可以开启两个线程分别执行JS
- 自带event loop,但Node.js基于liuv自己做了一个
libuv
- 一个跨平台的异步I/O库,会根据系统自动选择合适的方案
- I/O:对磁盘的读写操作( Input/ Output)
- 功能:可以用于 TCP/UDP/DNS/文件 等的异步操作
- TCP:http是基于TCPIP,能操作TCP就能做服务器
- UDP:一般用于网页聊天
- DNS:域名
Event Loop
什么是loop
- loop就是循环
- 由于事件是分优先级的,所以处理起来也是分先后的
- node.js需要按顺序轮询每种事件
- 这种轮询往往是循环的
Event Loop
- 对事件处理顺序的管理
顺序示意图

- 重点阶段
- timers 检查计时器
- poll 轮询,检查系统时间
- check检查setImmediate回调
- 注意
- 大部分时间,Node.js都停在poll 轮询阶段
- 大部分事件都在poll阶段被处理,如文件、网络请求
总结
- 用libuv进行异步I/O操作
- 用event loop管理事件处理顺序
- 用C/C++库高效处理DNS/HTTP
- 用bindings让JS能和C/C++沟通
- 用V8运行JS
- 用Node.js标准库简化JS
Node.js工作流程

Node.js API
API文档
- 官方文档:http://nodejs.cn/api/
- 民间版本: https://devdocs.io/
API有哪些功能
- assersion 断言
- testing
- async hooks
- *Buffer 一小段缓存
- *Child Processes 子进程
- *Cluster
- *Events 发布订阅模式
- *Debugger 调试
- *File System 文件系统 对文件的增删改查
- *Globals 全局变量
- *HTTP
- *Path 路径
- *Process 当前进程的相关信息
- *Query String
- *Stream 流格式
- *Timers
- *URL
- *Worker Threads node10之后才有的