Node.js 与前端开发实战(1) | 青训营笔记

86 阅读2分钟

这是我参与「第四届青训营」笔记创作活动的第9天

01. Node.js 的应用场景

  • 前端工程化难以替代的平台
    • Bundle打包:webpack vite esbuild parcel
    • Uglify压缩代码体积:uglifyjs
    • Transpile转义:bablejs typescript
    • 竞品:esbuild(Go) parcel(Rust) prisma
  • Web服务端应用有独特优势
    • 学习曲线平缓,开发效率较高
    • 运行效率接近常见的编译语言
    • 社区生态丰富、工具链成熟,包括npm V8 inspector
    • 与前端结合的场景会有优势,如SSR
  • Electron跨端桌面应用时值得考虑
    • 开发效率高,大型公司内的效率工具
    • 典型产品如VSCode slack discord zoom
  • 在字节的应用场景
    • BFF应用、SSR应用,如Modern.js
    • 服务端应用,如头条搜索 西瓜视频 懂车帝
    • Electron应用,如飞连 飞书
  • BFF
    • Backend for Frontend
    • 端需要哪些接口,就开发哪些接口
    • 后端开发和前端开发在一定程度上解耦
    • 一定程度上节省带宽
  • SSR
    • Server Side Rendering
    • 服务端渲染

02. Node.js运行时结构

运行时结构

引用自Node.js Core 贡献入门

  • 详细介绍
    • acron JavaScript解析器
    • node-inspect 用于调试
    • npm Node.js包管理器
    • N-API 原生API,用于解决JavaScript难以解决的性能问题
    • V8 JavaScript运行时,诊断调试工具
      • 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++
    • nghttp2 http2相关模块
    • zlib 常见解压缩
    • c-ares DNS查询
    • llhttp http协议解析
      • 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大部分api和功能跨平台,少部分可优化性能的api和特定系统有关
      • 开发成本低,整体学习成本低