这是我参与「第四届青训营 」笔记创作活动的第8天
一.Node.js的应用场景
1.前端工程化
- Budle:wepack,vite,esbuild,parcel
- Uglify:uglifyjs
- Transpile:bablejs,typescript
- 其他语言加入竞争:esbuild,parcel,prisma
- 现状:难以代替
2.Web服务端应用
- 学习曲线平滑,开发效率较高
- 运行效率接近常见的编译语言
- 社区生态丰富及工具链成熟
- 与前端结合的场景会有优势
- 现状:竞争激烈,Node.js有自己独特的优势
3.Electron跨段桌面应用
- 商业应用:vscode,slack,discord,zoom
- 大型公司内的效率工具
- 现状:大部分场景在选型时,都值得考虑
二.Node.js运行时结构
1.运行时结构
2.V8,libuv
- V8:javascrip,runtime,诊断调试工具
- libuv:eventloop,syscall
- 举例:用node-fetch发起请求时
3.特点
(1).异步I/O
example.ts>...
setTimeout(() =>{
console.log('B')
})
console.log('A')
当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占有额外内存等待
(2).单线程
functiuon fibonacci(num: number):number{
if(num===1 || num===2 ){
retrun 1;
}
return fibonacci(num-1)+fibonacci(num-2);
}
fibonacci(42)
fibonacci(43)
JS单线程
- 实际:js线程+uv线程池+v8任务线程池+v8 inspector线程
- 优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源
- 缺点:阻塞会产生更多负面影响
- 解决办法:多进程或多线程
woeker_thread可以起独立线程,但每个线程的模型没有太大变化
(3).跨平台
example > socket
const net = require('net')
const socket = new net.Socket('/tmp/scoket.sock')
- Node.js 跨平台+JS无需编译环境(+Web跨平台+诊断工具跨平台欧)
- 开发成本低,整体学习成本低
三.编写Http Server
1. 安装Node.js
- Mac,Linux推荐使用nvm,多版本管理
- windows推荐nvm4w或是官方安装包
- 安装满,安装失败的情况,设置安装源
2. 编写Http Server + Client,收发GET,Post请求
(1)Server
hello world
JSON
(2)Client
3. 编写静态文件服务器
便携一个简单的静态文件服务
4. 编写React SSR 服务
SSR有什么特点?
- 相比传统HTML模板引擎,避免重复编写代码
- 相比SPA:首屏渲染更快,SEO友好
- 缺点:
- 通常qps较低,前端代码编写时要考虑服务端渲染情况
HTML例子
换成React
SSR难点:
1.需要处理打包代码
2.需要思考前端代码在服务端运行时的逻辑
3.移除对服务端无意义的副作用,或重置环境
5. 适用 insoector进行调试,诊断
1.V8 inspector:开箱即用,特性丰富强大,与前端开发一致,跨平台
- node --inspect
- open http://locahost:9229/json
2.场景:
- 查看 console.log内容
- breakpoint
- 高CPU,死循环:cpuprofile
- 高内存占用:heapsnapshot
- 性能分析
6. 部署简介
1.部署要解决的问题:
- 守护进程:当进程退出时,重新拉起
- 多进程:cluster便捷地利用多进程
- 记录进程状态,用于诊断
2.容器环境
- 通常有健康的检查手段,只需考虑多核CPU利用率即可
四.延伸话题
1.Node.js贡献代码
快速了解Node.js代码:
talks/contributing-to-node-core.pdf at master · joyeecheung/talks (github.com)
好处:
- 从使用者的角色逐步理解底层细节,可以解决更复杂的问题
- 自我证明,有助于职业发展
- 解决社区问题,促进社区发展
难点:
- 花时间
2.编译Node.js
为什么要学习编译Node.js
- 认知:黑盒到白盒,发生问题时能有迹可循
- 贡献代码的第一步
如何编译
- 参考Page not found · GitHub
- ./configure && make install
- 演示:给net模块添加自定义属性
3.诊断/追踪
- 诊断是一个低频,重要同时也相当有挑战的方向。是企业衡量自己能否依赖一门语言的重要参考
- 技术咨询行业中的热门角色
- 难点:
- 需要了解Node.js底层,需要了解操作系统以及各种工具
- 需要经验
4.WASM,NAPI
- node.js是执行WASM代码的天然容器,和浏览器WASM是同一运行时,同时Node.js支持WASI
- NAPI执行c借口的代码,同时能保留原生代码的性能
- 不同编程语言间通信的一种方案