Node.js不是后端框架,不是一个变成语言。
Node.js是将多种技术组合的。让JS也能调用系统的端口,开发后端的应用。
Node.js采用了V8引擎、libuv、C/C++ 实现了 c-ares\http-parser\OpenSSL\Zlib。
Node.js V0.10的deps目录
V8的功能
- 将JS源代码变成本地代码并执行
- 维护调用栈,确保JS函数的执行顺序
- 内存管理,为所有对象分配内存
- 垃圾回收,重复利用无用的内存
- 实现JS的标准库
注意
- V8不提供DOM API
- V8执行JS是单线程的
- 可以开启两个线程分别执行JS
- V8本身是包含多个线程的,如垃圾回收为单独线程
- 自带event loop但Node.js基于libuv自己做了一个
如果想了解更多的知识 可以看《深入理解Node.js:核心思想与源码分析》文章。
Node.js工作流程
Event Loop
event说的通俗一点就就是事件,例如设置一个计时器,计时器到期了。
loop就是一个循环,例如 while(true)
循环。
但是如果有很多中循环同时进行就会有事件的优先级,Node.js按照顺序轮训每种事件。
Event Loop就是对事件处理的顺序管理
详细介绍可以看方方老师的详解
各阶段概览
- timers 阶段:这个阶段执行 setTimeout 和 setInterval 的回调函数。
- I/O callbacks 阶段:不在 timers 阶段、close callbacks 阶段和 check 阶段这三个阶段执行的回调,都由此阶段负责,这几乎包含了所有回调函数。
- idle, prepare 阶段(译注:看起来是两个阶段,不过这不重要):event loop 内部使用的阶段(译注:我们不用关心这个阶段)
- poll 阶段:获取新的 I/O 事件。在某些场景下 Node.js 会阻塞在这个阶段。
- check 阶段:执行 setImmediate() 的回调函数。
- close callbacks 阶段:执行关闭事件的回调函数,如 socket.on(‘close’, fn) 里的 fn。
Node.js的API
Assertion | 断言 | HTTP | Stream | 流格式 | |
---|---|---|---|---|---|
Testing | 测试 | HTTP/2 | String Decoder | ||
Async Hooks | 异步钩子 | HTTPS | Timers | Timers | |
Buffer | 一小段缓存 | Inspector | TLS/SSL | ||
Cluster | 集群 | i18n | Trace Events | ||
Child Processes | 子进程 | Net | TTY | ||
Console | 控制台 | OS | UDP/Datagram | ||
Crypto | 加密 | Path | 路径 | URL | URL |
Debugger | 调试 | Performance Hooks | V8 | ||
DNS | DNS | Process | 当前进程的先关心 | Utilities | |
Errors | 错误 | Query Strings | URL处理 | VM | |
Events | 发布订阅模式 | Readline | Worker Threads* | ||
File System | 文件系统 | REPL | zlib | ||
Globals | 群体变量 | Report |
资料来源:方应杭 贰贰