Node.js | 青训营笔记

119 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
重点内容: 🏠Node.js应用场景🏠 🏡Node.js运行结构🏡

🧱前言🧱

今天主要了解了Node.js与前端开发方面相关的内容,深入理解了Node.js这个Javascript运行环境。

🏢Node.js应用场景🏢

前端工程化

  • Bundle: webpack, vite, esbuild, parcel
  • Uglify: uglifyjs
  • Transpile: bablejs, typescript
  • 其他语言加入竞争:esbuild, parcel, prisma
  • 现状:难以替代
    前端工程化的工具大多还是使用Node.js开发,它在工程化这一块有着难以替代的地位!

Web服务端应用

  • 学习曲线平缓,开发效率较高
  • 运行效率接近常见的编译语言
  • 社区生态丰富及工具链成熟 (npm, V8 inspector)
  • 与前端结合的场景会有优势(SSR)
  • 现状: 竞争激烈,Node.js 有自己独特的优势
    类比JavaScript语言,主要去了解运行环境和API的不同就好,所以学习曲线比较平缓,开发效率更高;同时它不需要编译环境,所以效率较高。虽然Node.js的生态比较丰富,但其相关包的成熟度可能不如其他语言。

Electron跨端桌面应用

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

🏤Node.js运行结构🏤

特点

异步I/O:执行I/O操作时,会在相应返回后恢复操作,而不是阻塞线程并占用额外内存等待image.png 当读取文件时,会向Node发送一个异步调用的请求,这时不用等待文件全部读取完毕,可以继续执行其他操作,等到请求处理完成返回数据即读取完毕时,再执行相关回调。

单线程

  • JS 单线程
  • 实际: JS 线程 + uv 线程池 + V8 任务线程 + V8 Inspector 线程
  • 优点: 不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源
  • 缺点: 阻塞会产生更多负面影响解决办法:多进程或多线程 Javascript线程执行主任务,把读取的任务交给uv线程池去做,会把一些消耗比较大的操作例如加密解密之类的,都会交给其他线程池去做,不影响主任务的进行。大量的线程使得完成一项任务变得简洁和高效,同时可调试性也很强!

跨平台

开发成本低,无需担心跨平台问题。

🏨Http Server🏨

HTTP Server

image.png
最简单的例子,当server成功监听到回调以后,打印一行数据。

HTTP Client

image.png
先定义一个POST请求,编写好headers内容,以及body内容体,当收到服务端返回的数据后,通过bufs取出返回的数据,并尝试解析出来。

静态文件

image.png
先定义文件路径,当收到客户端发送的请求后,拿到请求的url,解析出端口号后面的内容加上之前定义的静态文件路径拼接成一个请求的文件路径,调用方法获取数据。Stream API内部做过处理,可以占用尽可能少的空间完成任务。

React SSR

SSR (server side rendering) 有什么特点?

  • 相比传统 HTML 模版引擎: 避免重复编写代码
  • 相比 SPA (single page application) : 首屏染更快,SEO 友好缺点:
  • 通常 qps 较低,前端代码编写时需要考虑服务端渲染情况

image.png

Debug

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

部署

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

🏪建议🏪

尽量尝试去贡献代码,贡献代码是很不容易的,比较花时间,但效益也十分显著。一方面可以逐步理解底层细节,解决更复杂的问题,另一方面也是一种能力的展示,有助于职业和社区的发展

🏰总结🏰

Node.js是一个很庞大的体系,前端工作几乎都会用得到Node.js相关内容,它的应用面非常广泛,了解底层架构,练习编写代码,都有助于更好的理解Node.js,加油!