Node.js开发实战 | 青训营笔记

156 阅读2分钟

这是我参与「第四届青训营」笔记创作活动的第9天

Node.js的应用场景

前端工程化

首先要提到的是前端工程化的场景。早期 ajax,jquery比较流行的时候,我们直接在页面中引入需要的lib即可。后续随随着模块化、transpile逐渐成熟、需求逐渐增多,对后端能力的需求也逐渐强烈。反过来说,也正是Nodejs赋予了 js开发者在浏览器外运行代码的能力,加速催生了这些项目的出现。

  • Bundle: webpack, vite, esbuild, parcel
  • Uglify:uglifyjs
  • Transpile: bablejs, typescript
  • 其他语言加入竞争:esbuild, parcel, prisma
  • 现状:难以替代

服务端应用

第二个常见的场景是使用 Node.is 开发 Web 服务端应用,也就是后端服务。

  • 学习曲线平缓,开发效率较高
  • 运行效率接近常见的编译语言
  • 社区生态丰富及工具链成熟 (npm,V8 inspector)
  • 与前端结合的场景会有优势 (SSR)
  • 现状: 竞争激烈,Node.js 有自己独特的优势

Electron 跨端桌面应用

Electron 应用,这里不只是指electron,还包括nwjs..;这个场景在较大的企业里面非常常见。

  • 商业应用:vscode, slack, discord, zoom
  • 大型公司内的效率工具
  • 现状:大部分场景在选型时,都值得考虑

运行时结构

V8,libuv

  • V8: JavaScript Runtime, 诊断调试工具 (inspector)
  • libuv: eventloop (事件循环), syscall (系统调用)
  • 举例:用 node-fetch 发起请求时

异步IO

当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存等待。

单线程

  • JS 单线程
    • 实际: JS 线程 +uv 线程池 +V8 任务线程池+V8 Inspector线程
  • 优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源;
  • 缺点:阻塞会产生更多负面影响。解决办法:多进程或多线程

跨平台

  • 跨平台(大部分功能、api)

  • Node.js 跨平台 +JS 无需编译环境 (+ Web 跨平台 +诊断工具跨平台)

    • =开发成本低(大部分场景无需担心跨平台问题),整体学习成本低

编写 Http Server

Debug

  • V8 Inspector: 开箱即用、特性丰富强大、与前端开发一致、跨平台
  • 场景:
    • 查看 console.log 内容
    • breakpoint
    • 高 CPU、死循环: cpuprofile
    • 高内存占用: heapsnapshot
    • 性能分析

部署

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

对于编写server的个人看法

  • 方法1:导入http模块编写
  • 方法2:使用框架编写,例如:express等