- 记录日常学习之路
Node.js不是什么
要搞清楚node.js是什么,首先要搞清楚node.js不是什么
不是web框架
- node.js并不是web后端的框架
- 所以不能把node.js和
Flask或Spring对比
不是编程语言
- node.js并不是后端的js
- 所以不能把node.js 与
python或PHP对比
Node.js是什么
是一个平台
- 它将多种技术组合起来
- 让JavaScript也能调用系统接口、开发后端应用
Node.js用到了哪些技术
- V8引擎
- libuv
- C/C++实现的
c-ares、http-parser、OpenSSL、zlib等库
Node.js技术架构
什么是bindings
背景
- 现在C/C++实现了一个http_parser库,很高效
- 但我只会写JS,但是我想调用这个库,但直接调肯定是不行的,需要一个中间的桥梁
bindings
- Node.js用C++对 httpparser进行封装,使其符合某些要求,封装的文件叫httpparser_bindings.cpp
- 用Node.js提供的编译工具将其编译为.node文件*
- JS代码可以直接requier这个.node文件
- 这样JS就能调用C++的库,中间的桥梁这是binding
- 由于Node.js提供了很多binding,所以加个s变成了bindings
libuv是什么?
背景
- 每个系统都有自己的异步处理模块,但node.js之父不能为每个系统重新写一个node.js的异步处理模块,所以Rayn为了跨平台实现异步I/O库(输入输出操作:系统和其他外界交互的所有操作都是I/O),写了libuv
功能
- 可以用于 TCP / UDP / DNS /文件等的异步操作
V8是什么?
功能
- 将JS源代码变成机器码并执行,计算机能读懂的语言
- 维护调用栈,确保JS函数的执行顺序
- 内存管理,为所有对象分配内存
- 垃圾回收,重复利用无用的内存
- 实现JS的标准库,比如数组的方法等
注意
- V8不提供DOM的API
- V8本身是多线程的,但执行JS是单线程的
- 可以开启两个线程分别执行JS
- V8本身是包含多个线程的,如垃圾回收为单独线程
- 自带event loop 但 Node.js 基于 libuv 自己做了一个
Event Loop是什么?
介绍Event
- 计时器到期了
- 文件可以读取、读取出错了
- socket 有内容了、关闭了
什么是Loop
- loop是循环的意思,比如
while(true)循环 - 由于事件时分优先级的,所以处理起来是分先后的
- 所以Node.js 需要按顺序轮询每种事件
- 这种轮询往往都是循环的,1→2→3→1→2→3
Event Loop
- 操作系统可以触发事件,JS可以处理事件
- Event Loop 就是对事件处理顺序的管理
事件执行循序示意图
重点阶段
- timers检查计时器
- poll轮询,检查系统事件
- check检查 setlmmediate回调
- 其他阶段用的比较少
注意
- 大部分时间,Node.js都停在poll轮询阶段
- 大部分事件都在poll阶段被处理,如文件、网络请求等
Node.js的API学习
官方提供给我们用的函数即为API
文档
民间版本
- devdocs.io,进入后开启Node.js10LTS,搜索功能很方便
- 还能开启暗黑主题,可离线
API功能
- 白色的为不重要,黄色为重要
| 单词(API) | 含义(用途) | 单词(API) | 含义(用途) |
|---|---|---|---|
| Assertion | 断言用的 | Testing | 测试 |
| Async Hooks | 异步用的钩子 | Buffer | 一小段缓存 |
| Child Peocesses | 子进程 | Cluster | 与子进程很像 |
| Console | 控制台 | Crypto | 用于加密的 |
| Debugger | 调试相关 | DNS | 用nodejs访问DNS |
| Errors | 错误相关 | Events | 发布订阅模式 |
| File System | 文件系统 | Globals | 全局变量 |
| HTTP | 网络协议 | HTTP2 | 网络协议 |
| HTTPS | 网络协议 | Inspector | 检查 |
| i18n | 国际化 | Net | 计算机网络 |
| OS | Path | 路径,对路径的操作 | |
| Performance Hooks | Process | 进程的相关信息 | |
| Query Strings | 对URL的处理 | Readline | |
| REPL | Report | ||
| Stream | 流格式数据的处理 | Worker Threads | |
| Timers | setTimeout等 | URL | 处理URL |