这是我参与「第四届青训营」笔记创作活动的第9天
01. Node.js 的应用场景
- 前端工程化难以替代的平台
- Bundle打包:
webpackviteesbuildparcel - Uglify压缩代码体积:
uglifyjs - Transpile转义:
bablejstypescript - 竞品:
esbuild(Go)parcel(Rust)prisma
- Bundle打包:
- Web服务端应用有独特优势
- 学习曲线平缓,开发效率较高
- 运行效率接近常见的编译语言
- 社区生态丰富、工具链成熟,包括
npmV8 inspector - 与前端结合的场景会有优势,如
SSR
- Electron跨端桌面应用时值得考虑
- 开发效率高,大型公司内的效率工具
- 典型产品如
VSCodeslackdiscordzoom
- 在字节的应用场景
- BFF应用、SSR应用,如
Modern.js - 服务端应用,如
头条搜索西瓜视频懂车帝 - Electron应用,如
飞连飞书
- BFF应用、SSR应用,如
- BFF
- Backend for Frontend
- 端需要哪些接口,就开发哪些接口
- 后端开发和前端开发在一定程度上解耦
- 一定程度上节省带宽
- SSR
- Server Side Rendering
- 服务端渲染
02. Node.js运行时结构
- 详细介绍
acronJavaScript解析器node-inspect用于调试npmNode.js包管理器N-API原生API,用于解决JavaScript难以解决的性能问题V8JavaScript运行时,诊断调试工具- Node.js的很多特点和性能优势来自V8
libuv封装操作系统API- 提供跨平台IO操作支持
- 提供Node.js中核心的eventLoop(事件循环)和syscall(系统调用)
- 举例:
- npm安装node-fetch模块 ->
用户JavaScript代码调用 ->
V8执行 ->
Node.js Core(js) http模块 ->
Node.js Core(C++) api->llhttp模块做HTTP协议的序列化和反序列化->libuv模块创建tcp连接发送数据包 - 应用层写JavaScript,底层调用C++
- npm安装node-fetch模块 ->
nghttp2http2相关模块zlib常见解压缩c-aresDNS查询llhttphttp协议解析- low level http
OpenSSl网络层加解密工具
- 特点
- 异步操作
- 当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存等待,资源利用率比较高
- 单线程
- 从Node.js 12开始可以使用
worker_thread - 实际上是JavaScript主线程 + uv线程池 + V8任务线程池 + V8 Inspector线程
- 比如可能有4个libuv的线程,处理文件读写操作和加解密等消耗CPU比较大的操作
- V8任务线程池可以自行更改配置
- V8 Inspector调试线程
- 优点:不用考虑多线程状态同步问题,也就不需要锁,同时还能比较高效地利用系统资源
- 缺点:阻塞会产生更多负面影响,需要采用多进程和多线程
- 从Node.js 12开始可以使用
- 跨平台
- Node.js大部分api和功能跨平台,少部分可优化性能的api和特定系统有关
- 开发成本低,整体学习成本低
- 异步操作