这是我参与「第四届青训营」笔记创作活动的第10天」
今天总结Node.js与前端开发实战课程中个人觉得较为有用的内容。
Node.js 运行时的结构 - 特点
异步I/O
当Node.js执行I/O操作时,会在相应返回后回复操作,而不是阻塞线程并占用额外内存等待。
JS单线程
work_thread 可以起独立线程,但每个线程的模型没有太大变化
-
实际:JS线程 + uv 线程池 +V8 任务线程池 + V8 Inspector 线
-
优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源;
-
缺点:阻塞会产生更多负面影响
- 解决办法:多进程或多线稈
编写 Http Server
本节目标
- 安装Node.js
- 编写Http Server + Client, 收发GET、POST请求
- 编写静态文件服务器
- 编写React SSR服务
- 适用inspector进行调试、诊断
- 部署简介
Hello World
JSON
Http-Client
Promisify
用 Promise + async await 重写这两个例子
技巧:将callback转换成promise
静态文件
编写一个简单的静态文件服务
与高性能、可靠的服务相比,还差什么?
- CDN:缓存+加速
- 分布式储存,容灾
外部服务:cloudflare,七牛云,阿里云,火山云..
React SSR
SSR有什么特点?
-
相比传统HTML模版引擎:避免重复编写代码
-
相比SPA:首屏渲染更快,SEO更加友好
-
缺点:
- 通常qps较低,前端代码编写时需要考虑服务端渲染情况
-
HTML例子
-
替换成React:
SSR的难点:
- 需要处理打包代码
- 需要思考前端代码在服务端运行时的逻辑
3 . 移除对服务端无意义的副作用,或重置环境
Debug
V8 Inspector: 开箱即用、特性丰富强大、与前端开发一致、跨平台
- node --inspect
- open http://localhost:9229/json
场景:
- 查看 console.log 内容
- breakpoint
- 高CPU、死循环: cpu profil
- 高内存占用:heapsnapshot
- 性能分析
部署
部署要解决的问题:
- 守护进程:当进程退出时,重新拉起
- 多进程: cluster便捷地利用多进程
- 记录进程状态,用于诊断
容器环境:
- 通常有健康检查的手段,只需考虑多核cpu利用率即可
编译Node.js
为什么要学习编译Node.js
- 认知:从白盒到黑盒,发生问题时能有迹可循
- 贡献代码的第一步
延伸话题-诊断/追踪
图片摘自 https://github.com/iovisor/bcc
延伸话题-WASM、NAPI
- Node.js (因为v8) 是执行 WASM 代码的天然容器,和浏览器是同一运行时,同时Node.js支持WASI。
- NAPI 执行 C接口的代码C/C++/Rust.,同时能保留原生代码的性能
- 不同编程语言间通信的一种方案。