这是我参与「第四届青训营」笔记创作活动的第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: 开箱即用、特性丰富强大、与前端开发一致、跨平台
- node--inspect
- open http://localhost:9229/json
- 场景:
- 查看 console.log 内容
- breakpoint
- 高 CPU、死循环: cpuprofile
- 高内存占用: heapsnapshot
- 性能分析
部署
- 部署要解决的问题
- 守护进程:当进程退出时,重新拉起
- 多进程:cluster 便捷地利用多进程
- 记录进程状态,用于诊断
- 容器环境
- 通常有健康检查的手段,只需考虑多核 cpu 利用率即可
对于编写server的个人看法
- 方法1:导入http模块编写
- 方法2:使用框架编写,例如:express等