这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
安装:从 Node.js 官网安装 nodejs.org/en/
本堂课重点(不熟悉)内容:
介绍 Node.js 的应用场景 - Web服务端应用
- 学习曲线平缓,开发效率高
- 运行效率接近常见的编译语言
- 社区生态链丰富及工具链成熟(npm,V8 inspector)
- 与前端结合的场景会有优势(SSR)
- 现状:竞争激烈,Node.js有自己独特的优势
不需要编译环境的语言,运行效率高
介绍 Node.js 运行时结构
V8:JavaScript Runtime,诊断调试工具(inspector) libuv:enventloop(时间循环),syscall(系统调用) 举例:用node-fetch发起请求时。。。
Node.js运行时结构 - 特点
- 异步I/O
setTimeout(()=>{
console.log('B')
})
console.log('A')
- 单线程
function fibonacci(num:number):number{
if(num === 1|| num === 2){
return 1;
}
return fibonacci(num - 1) + finbornacci(num - 2);
fibonacci(42)
fibonacci(43)
Node.js12版本的worker_thread可以起独立线程,但每个线程的模型没有太大变化
- JS单线程
- 实际:JS线程 + uv线程池 + V8任务线程池 + V8 Inspector 线程
- 优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源
- 缺点:阻塞会产生更多负面影响
- 解决办法:多进程或多线程
- 跨平台
const net = require('net')
const socket = new net.Socket('/tmp/socket.sock')
- 跨平台(大部分功能、api)
- Node.js跨平台 + JS无需编译环境 (+ Web跨平台 + 诊断工具跨平台)
- = 开发成本低(大部分场景无需担心跨平台问题),整体学习成本低
如何用编写 Http Server
1. 安装Node.js
2. 编写Http Server + Client,收发GET,POST请求
3. 编写静态文件服务器
4. 编写React SSR服务
5. 使用inspector进行调试、诊断
7. 部署简介
通过Promise + async await 重写这两个例子(why) 掘金链接待更新 (node.js的初教程)
静态文件服务器有一个非常大的文件100GB,只申请了50GB,所以不能直接申请到String中
通过外部服务更好地实现服务场景
React SSR
React SSR 相对SPA 渲染更好 更友好
- SSR(server side rendering)有什么特点?
- 相比传统HTML模板引擎:避免重复编写代码
- 相比SPA(single page application):首屏渲染更快,SEO友好
- 缺点:
- 通常qps较低,前端代码编写时需要考虑服务端渲染情况
- HTML例子
比如两次渲染之间应该是没有关联的,但因为无意义的关联,导致每次运行都会产生多余的垃圾,所以移除对服务端无意义的副作用,或重置环境
Debug
-
V8 Inspector:开箱即用、特性丰富强大、与前端开发一致、跨平台
- node --inspect
- open http://localhost:9229/json
-
场景:
- 查看console.log内容
- breakpoint
- 高CPU、死循环:cpuprofile
- 高内存占用:heapsnapshot
- 性能分析
部署
延伸话题
- 快速了解Node.js代码
- Node.js Core贡献入门[github.com/joyeecheung…]
- 好处:
- 从使用者的角色逐步理解底层细节,可以解决更复杂的问题
- 自我证明,有助于职业发展
- 解决社区问题,促进社区发展
- 难点:
- 花时间
编译Node.js
诊断/追踪
WASM,NAPI