Node.js技术架构
Node.js是是什么?是一个平台,他将多种技术组合起来,让JavaScript也能调用系统接口、开发后端应用。
Node.js用到了哪些技术?v8引擎,libuv,C/C++实现的相关库。
bindings
背景:
C/C++实现了一个http_parser库很高效,你只会写js,但是你想调用这个库,直接调用肯定不能成功的,你需要一个中间的桥梁。
- Node.js用C++对http_parser进行封装,使它符合某些要求,封装的文件叫做http_parser_bindings.cpp
- 用Node.js提供的编译工具将其编译为.node文件
- JS代码可以直接require这个.node文件
- 这样JS就能调用C++库,中间的桥梁就是binding
- 由于Node.js提供了很多binding,所以加个s,这就是bindings
V8引擎
Node.js工作流
功能:
- 将JS源代码变成机器代码执行
- 维护调用栈,确保JS函数的执行顺序
- 内存管理,为所有对象分配内存
- 垃圾回收,重复利用无用的内存
- 实现JS的标准库
注意:
- V8不提供DOM API
- V8执行JS是单线程的
- 可以开启两个线程分别执行JS
- V8本身是包含多个线程的,入垃圾回收为单独线程
- 自带event loop 但Node.js基于libuv自己做了一个
libuv
背景:
- FreeBSD系统上有kqueue
- Linux系统上有epoll
- Windows系统上有IOCP
- Ryan为了一个跨平台的异步I/0库,开始写libuv
- libuv会根据系统自动选择合适的方案
功能:
- 可以用于TCP / UDP / DNS / 文件等的异步操作
Node.js常用API
- Buffer(缓冲器)
- Child Processes(子进程)
- Cluster(集群)
- Debugger(调试器)
- Events(事件触发器)
- File System(文件系统)
- Globals(全局变量)
- HTTP
- Path(路径)
- Process(进程)
- Query Strings(查询字符串)
- Stream(流)
- Timers(定时器)
- URL
- Worker Threads*(工作线程):比较新,node8不支持,node10以上支持
总结
- 用libuv进行异步I/O操作
- 用event loop 管理事件处理顺序
- 用C/C++ 库高效处理DNS/HTTP...
- 同bindings让JS能和C/C++沟通
- 用V8运行JS
- 用Node.js标准库简化JS代码
- 这就是Node.js