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

29 阅读2分钟

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

今天总结Node.js与前端开发实战课程中个人觉得较为有用的内容。

Node.js 运行时的结构 - 特点

异步I/O

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

image.png

JS单线程

work_thread 可以起独立线程,但每个线程的模型没有太大变化

  • 实际:JS线程 + uv 线程池 +V8 任务线程池 + V8 Inspector 线

  • 优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源;

  • 缺点:阻塞会产生更多负面影响

    • 解决办法:多进程或多线稈

编写 Http Server

本节目标

  1. 安装Node.js
  2. 编写Http Server + Client, 收发GET、POST请求
  3. 编写静态文件服务器
  4. 编写React SSR服务
  5. 适用inspector进行调试、诊断
  6. 部署简介

Hello World

image.png

JSON

image.png

Http-Client

image.png

Promisify

用 Promise + async await 重写这两个例子

技巧:将callback转换成promise

image.png

静态文件

编写一个简单的静态文件服务 image.png

与高性能、可靠的服务相比,还差什么?

  1. CDN:缓存+加速
  2. 分布式储存,容灾

外部服务:cloudflare,七牛云,阿里云,火山云..

React SSR

SSR有什么特点?

  • 相比传统HTML模版引擎:避免重复编写代码

  • 相比SPA:首屏渲染更快,SEO更加友好

  • 缺点:

    • 通常qps较低,前端代码编写时需要考虑服务端渲染情况
  • HTML例子

    • image.png
  • 替换成React:

    • image.png

SSR的难点:

  1. 需要处理打包代码

image.png

  1. 需要思考前端代码在服务端运行时的逻辑

image.png 3 . 移除对服务端无意义的副作用,或重置环境

Debug

V8 Inspector: 开箱即用、特性丰富强大、与前端开发一致、跨平台

场景:

  • 查看 console.log 内容
  • breakpoint
  • 高CPU、死循环: cpu profil
  • 高内存占用:heapsnapshot
  • 性能分析

image.png

image.png

image.png

部署

部署要解决的问题:

  • 守护进程:当进程退出时,重新拉起
  • 多进程: cluster便捷地利用多进程
  • 记录进程状态,用于诊断

容器环境:

  • 通常有健康检查的手段,只需考虑多核cpu利用率即可

编译Node.js

为什么要学习编译Node.js

  • 认知:从白盒到黑盒,发生问题时能有迹可循
  • 贡献代码的第一步

延伸话题-诊断/追踪

image.png

图片摘自 https://github.com/iovisor/bcc

延伸话题-WASM、NAPI

  • Node.js (因为v8) 是执行 WASM 代码的天然容器,和浏览器是同一运行时,同时Node.js支持WASI。
  • NAPI 执行 C接口的代码C/C++/Rust.,同时能保留原生代码的性能
  • 不同编程语言间通信的一种方案。