[这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天]
1. Node.js 的应用场景
- 前端工程化
- Web 服务端应用
- Electron 跨端桌面应用
2. Node.js 运行时结构
- Node.js组成部分
- v8 : Javascript Runtime, 诊断调试工具 (inspector)
- acron : 社区的
npm代码- node-inspect : 调试工具
- libuv : 封装了操作系统 API 来实现跨平台的 IO 操作,以及 Node.js 中的 eventloop, 线程池
- nghhttp2 : http2 相关的模块
- zlib : 做常见的压缩和解压缩的算法
- c-ares : 做一些常见的 dns 查询库
- llhttp: 做 http 协议的解析, 序列化和反序列化
- OpenSSL : 常用在网络层的加密解密工具
- 场景
- 使用 node-fetch 发起请求时, 会发生什么
- 首先在
npm中安装了node-fetch模块后,在用户代码中就可以调用node-fetch模块- 接着在
V8中执行, 因为要发生网络请求, 所以node-fetch在底层会调用http模块 [Node.js Core(javascript)], 之后http模块将会调用更底层的c++ API- 之后调用
llhttp来实现 http协议 的序列化和反序列化- 最终将得到的数据通过
libuv建立TCP连接,将数据发给远端- 特点
- 异步 IO
- 如定时器
- 当 Node.js 执行 IO 操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存空间等待
- 单线程
- 在 Node.js 版本大于 12 之后, 可以使用
worker_thread开开启 一个独立的线程。这个独立的线程拥有单独的V8实例 以及eventloop。只是这个另外开启的线程和主线程没有太大的差别JS 单线程其实是指JS 主线程是单线程, 还有其他线程比如uv 线程池、V8 任务线程池、V8 Inspector 线程- 优点
- 不用考虑多线程状态同步的问题,也就不需要锁
- 同时还能比较高效地利用系统资源
- 缺点
- 阻塞会产生更多负面影响(比如对于延迟比较敏感的场景)
- 解决办法: 多进程或者多线程(比如 可以使用
worked_thread来开启额外的线程)- 跨平台
3.编写 Http Server
本节目标
- 编写静态文件服务器
- 适用 inspector 进行调试,诊断
- 部署