Node.js不是后端框架,不是一个变成语言。

Node.js是将多种技术组合的。让JS也能调用系统的端口,开发后端的应用。

Node.js采用了V8引擎、libuv、C/C++ 实现了 c-ares\http-parser\OpenSSL\Zlib。

Node.js V0.10的deps目录

42 Node.js起手式 - 图1

V8的功能

  • 将JS源代码变成本地代码并执行
  • 维护调用栈,确保JS函数的执行顺序
  • 内存管理,为所有对象分配内存
  • 垃圾回收,重复利用无用的内存
  • 实现JS的标准库

注意

  • V8不提供DOM API
  • V8执行JS是单线程的
  • 可以开启两个线程分别执行JS
  • V8本身是包含多个线程的,如垃圾回收为单独线程
  • 自带event loop但Node.js基于libuv自己做了一个

如果想了解更多的知识 可以看《深入理解Node.js:核心思想与源码分析》文章。

Node.js工作流程

42 Node.js起手式 - 图2

Event Loop

event说的通俗一点就就是事件,例如设置一个计时器,计时器到期了。

loop就是一个循环,例如 while(true)循环。

但是如果有很多中循环同时进行就会有事件的优先级,Node.js按照顺序轮训每种事件。

Event Loop就是对事件处理的顺序管理

42 Node.js起手式 - 图3

详细介绍可以看方方老师的详解

各阶段概览

  • 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

资料来源:方应杭 贰贰