Nodejs | 字节青训营

70 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

NodeJs

应用场景

  1. 前端工程化
  • Bundle(做打包转换): webpack, vite, esbuild, parcel
  • Uglify(压缩体积): uglifyjs
  • Transpile(语法转换): bablejs, typescript
  • 其他语言加入竞争: esbuild(go), parcel(Rust), prisma(vercel公司出的)
  • 现状:难以替代
  1. 服务端应用
  • 学习曲线平缓,开发效率较高
  • 运行效率接近常见的编译语言
  • 社区生态丰富及工具链成熟(npm,V8 inspector)
  • 与前端结合的场景会有优势(SSR)
  • 现状: 竞争激烈,Node.js 有自己独特的优势
  1. Electron跨端桌面应用
  • 商业应用: vscode, slack, discord, zoom
  • 大型公司内的效率工具
  • 现状:大部分场景在选型时,都值得考虑

运行时

结构

image.png

  • V8: JavaScript Runtime, 诊断调试工具(inspector)
  • libuv: eventloop (事件循环), syscall (系统调用)
  • 举例:用 node-fetch(npm模块) 发起请求时,
    1. 到用户代码调用node-fetch模块
    2. 到V8执行
    3. 调用Node.js Core JavaScript里的http模块
    4. http模块调用更底层的core c++中的API
    5. c++里调用llhttp(lowlevelhttp)进行http协议的序列化和反序列化
    6. 得到的数据再到libuv创建一个tcp连接,发给远端
  • V8 Inspector: 开箱即用、特性丰富强大、与前端开发一致、跨平台
特点
  1. 异步I/O
  • 当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存等待
  1. 单线程
  • 实际:js线程+uv线程池+V8任务线程池+V8 Inspector(调试)线程池
  • 优点:不用考虑多线程状态同步问题不需要锁;同时能比较高效地利用系统资源
  • 缺点:阻塞产生更多负面影响(对延时敏感的应用)
  1. 跨平台
部署

部署要解决

  • 守护进程:当进程退出时,重新拉起
  • 多进程:cluster 便捷地利用多进程
  • 记录进程状态,用于诊断 容器环境
  • 通常有健康检查的手段,只需考虑多核 cpu 利用率即可