这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
NodeJs
应用场景
- 前端工程化
- Bundle(做打包转换): webpack, vite, esbuild, parcel
- Uglify(压缩体积): uglifyjs
- Transpile(语法转换): bablejs, typescript
- 其他语言加入竞争: esbuild(go), parcel(Rust), prisma(vercel公司出的)
- 现状:难以替代
- 服务端应用
- 学习曲线平缓,开发效率较高
- 运行效率接近常见的编译语言
- 社区生态丰富及工具链成熟(npm,V8 inspector)
- 与前端结合的场景会有优势(SSR)
- 现状: 竞争激烈,Node.js 有自己独特的优势
- Electron跨端桌面应用
- 商业应用: vscode, slack, discord, zoom
- 大型公司内的效率工具
- 现状:大部分场景在选型时,都值得考虑
运行时
结构
- V8: JavaScript Runtime, 诊断调试工具(inspector)
- libuv: eventloop (事件循环), syscall (系统调用)
- 举例:用 node-fetch(npm模块) 发起请求时,
- 到用户代码调用node-fetch模块
- 到V8执行
- 调用Node.js Core JavaScript里的http模块
- http模块调用更底层的core c++中的API
- c++里调用llhttp(lowlevelhttp)进行http协议的序列化和反序列化
- 得到的数据再到libuv创建一个tcp连接,发给远端
- V8 Inspector: 开箱即用、特性丰富强大、与前端开发一致、跨平台
- node --inspect xxx
- open http://localhost:9229/json
特点
- 异步I/O
- 当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存等待
- 单线程
- 实际:js线程+uv线程池+V8任务线程池+V8 Inspector(调试)线程池
- 优点:不用考虑多线程状态同步问题不需要锁;同时能比较高效地利用系统资源
- 缺点:阻塞产生更多负面影响(对延时敏感的应用)
- 跨平台
部署
部署要解决
- 守护进程:当进程退出时,重新拉起
- 多进程:cluster 便捷地利用多进程
- 记录进程状态,用于诊断 容器环境
- 通常有健康检查的手段,只需考虑多核 cpu 利用率即可