关于Nodejs 技术架构 如何与C++通信
关于Nodejs
版本:Nodejs单数是非稳定版本,双数是稳定版本
Nodejs是什么
先谈谈Nodejs不是什么
- 不是Web框架,Nodejs并不是web后端框架,所以不能和Spring或flask对比
- 不是编程语言,所以不能和Python和php对比
Nodejs是一个平台
- 将多种技术组合起来
- 让JavaScript也能调用系统接口、开发后端应用
Nodejs用了哪些技术
- V8
- libuv
- C/C++实现的c-areas、http-parser、OpenSSL、zlib
Nodejs技术架构
- Nodejs Api 如http模块、fs、stream模块等
- Nodejs bindings(让js和 C/C++通信)
- V8 js引擎
- libuv 跨平台的异步IO能力
- DNS解析 c-areas
- 加解密 OpenSSL
- 其他 http_parser、zlib等
- C/C++ 插件(自定义其他能力,你可以自己写C/C++插件)
Nodejs与C++通信
Nodejs bindings
Nodejs bindings能将cpp文件编译成node文件,js require可以调用require文件
编译成node文件不是必须的,也可以是其他任何可行方式
如对http-parser的封装就是http_parser_bindings.cpp
libuv
背景
每个系统的异步io都不一样
Linux有epoll
windows有IOCP
Ryan为了实现一个跨平台的异步IO库,开始写libuv
libuv会根据系统自动选择合适的方案
功能
可以用于TCP/UDP/DNS/文件等异步操作
IO即输入和输出,所有系统和外界的交互行为都叫做IO操作
v8
功能
- 编译js文件
- 维护函数调用栈
- 内存管理,为对象分配内存
- 垃圾回收
- 实现js的标准库
注意
- V8不提供DOM API
- V8执行js是单线程的
- 可以开启两个线程分别执行js, 但V8本身是包含多个线程的,比如垃圾回收是单独的线程,只不过js执行是单线程的
- 自带EventLoop但是Nodejs基于libuv自己做了一个
EventLoop
->1. timers
->2. I/O callbacks
->3. idle,prepare
->4. poll
->5. check
->6. close callbacks
->1. timers
大部分时间停留在poll阶段
check主要用于检查setImmediate回调
timers主要检查setTimeout回调
所以setTimeout(cb,0)和setImmediate(cb)谁先执行?
一般般来说是第二个先执行,因为一般在poll阶段,从poll出来的时候,先到check,再到timers
但是也有例外,如果是第一次,那么先检查timers, 也就是第一个先执行
Nodejs技术架构总结
- libuv支持异步I/0操作
- 用EventLoop管理事件处理顺序
- 用C/C++库高效处理DNS/HTTP
- 用bindings沟通js和C++
- 用V8运行js
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端