Node.js 与前端开发实战 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第5天。
Node.js的应用场景
1. 前端工程化
- Bundle(构建):webpack,vite,esbuild,parcel
- Uglify:uglifyjs
- Transpile(语法转换):bablejs,typescript
- 其他语言加入竞争:(基于go实现的)ebuild,parcel,prisma
- 现状:难以替代
2. web 服务端应用
在web服务端开发中,传统的后端语言有恒多,而node.js最大的特点优势:
- 学习效率平缓,开发效率高
- 运行效率接近常见的编程语言
- 社区生态丰富及工具链成熟(npm,V8 inspector)
- 与前端结合的场景会有优势(SSR)
- 现状:竞争激烈,Node.js有自己独特的优势
3. Electron 跨端桌面应用
- 商业应用:vscode, slack, discord, zoom等等的桌面应用都是用Electron开发的
- 大型公司的效率工具,大部分都是基于 Electron 做的
- 现状:大部分场景在选型时,都值得考虑
4.字节中node.js做的应用
- BFF应用,SSR应用,如: Modern.js
- 服务端应用:头条搜索,西瓜视频,懂车帝
- Electron应用:飞书,飞连
- 每年新增1000+ Node.js 应用
Node.js运行时结构
结构
- V8:JavaScript Runtime,诊断调试工具(inspector)
- libuv:eventLoop(事件循环),syscall(系统调用)
Node.js运行时结构特点
1. 异步I/O
场景分析:
异步I/O好处: 当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外的内存等待
2. 单线程
-
js单线程
- 实际:JS线程+ uv线程 +V8任务线程池 + V8 Inspector线程
-
优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比较有效的利用系统资源
-
缺点:阻塞会产生更多的负面影响
- 解决问题:多线程或多进程
3. 跨平台
-
跨平台(大部分功能,api)
-
Node.js跨平台+JS无需编译环境(+web跨平台+诊断工具跨平台)
- 开发成本低(大部分场景无需担心跨平台问题),整体学习成本低
Node.js 写服务端
安装node.js
- Mac,Linux推荐使用nvm,多版本管理
- Windows推荐nvm4w或是官方安装包
- 安装慢,安装失败的情况,设置安装源
NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node nvm install 16
编写http Server
Http Server
Http Client
Promisify
- Promisify
- 用Promise+async await重写
- 技巧:将callback转成promise
静态文件
- 静态文件服务
- 与高性能可靠的服务相比还差什么
- CDN:缓存+加速
- 分布式存储,容灾
- 与高性能可靠的服务相比还差什么
React SSR
- React SSR
- SSR(server side rendering)特点
- 相比传统html引擎:避免重复编写代码
- 相比SPA(single page application):首屏渲染更快,SEO友好
- 缺点;通常qps较低,前端编写时需要考虑服务端渲染情况
- SSR难点
- 需要处理打包代码
- 需要思考前端代码在服务端运行的逻辑
- 移除服务端无意义的副作用,或充值环境
- SSR(server side rendering)特点
Debug
- Debug
- V8 Inspector:开箱即用,特性丰富强大,与前端开发一致、跨平台
- node --inspect
- 查看方式:
- 方式1.打开 [http://localhost:9229/json] 进入devtoolsFrontendUrl后的url
- 方式2.打开 chrome://inspect 然后点击Open dedicated DevTools for Node
- 场景
- 查看console.log内容
- breakpoint
- 高CPU、死循环:cpuprofile
- 高内存占用:heapsnapshot
- 性能分析
- V8 Inspector:开箱即用,特性丰富强大,与前端开发一致、跨平台
部署
- 需要解决的问题
- 守护进程:当进程退出时,重新垃圾
- 多进程:cluster便捷的利用多进程
- 记录进程状态,用于诊断
- 容器环境
- 通常有健康检查手段,只需考虑多核cpu利用率即可