Node.js 运行时的结构
acron、node-inspect(做为调试)、npm(包管理工具)、用户代码(自己业务的代码)
Node.js Core(JavaScript) N-API(底层API、性能优化等) Node.js Core(C++)
v8(JS引擎,JavaScript Runtime,诊断调试工具(inspector))
- V8 Inspector:开箱即用、特性丰富强大、与前端开发一致、跨平台。
- node --inspect
- open http://localhost:9929/json
- 场景:
- 查看console.log内容
- breakpoint
- 高 CPU、死循环:puprofile
- 高内存占用:heapsnapshot
- 性能分析
libuv(封装了操作系统的api syscall(系统调用),提供了eventloop(事件循环))
nghttp2、zlib(压缩和解压缩的算法)
c-ares(DNS查询的库)
llhttp(HTTP协议的解析)
OpenSSL(网络层的加密解密的工具)
特点
-
异步I/O
当 Node.js 执行I/O操作时,会在相应返回后恢复操作。而不是阻塞线程并占用额外内存等待
-
单线程
- 实际:JS线程 + uv线程池 + V8任务线程池 + V8 Inspector线程
- 优点:不用考虑多线程状态同步问题,也不需要锁,同时还能比较高效地利用系统资源
- 缺点:阻塞会产生更多负面影响。
- 解决办法:多进程或多线程 worker_thread可以起独立线程,但每个线程的模型没有太大变化
- 跨平台
SSR(服务端渲染)
SSR(server side rendering) 有什么特点?
- 相比传统 HTML 模板引擎,避免重复编写代码
- 相比SPA(single page application):首屏渲染更快,SEO友好
- 缺点:通常 qps 较低,前端代码编写时需要考虑服务端渲染情况
难点:
- 需要处理打包代码
- 需要思考前端代码在服务端运行时的逻辑
- 除对服务端无意义的副作用,或重置环境