Node.js与前端开发 | 青训营笔记

119 阅读2分钟

[这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天]

1. Node.js 的应用场景

  • 前端工程化
  • Web 服务端应用
  • Electron 跨端桌面应用

2. Node.js 运行时结构

image.png

  • Node.js组成部分
    • v8 : Javascript Runtime, 诊断调试工具 (inspector)
    • acron : 社区的 npm 代码
    • node-inspect : 调试工具
    • libuv : 封装了操作系统 API 来实现跨平台的 IO 操作,以及 Node.js 中的 eventloop, 线程池
    • nghhttp2 : http2 相关的模块
    • zlib : 做常见的压缩和解压缩的算法
    • c-ares : 做一些常见的 dns 查询库
    • llhttp: 做 http 协议的解析, 序列化和反序列化
    • OpenSSL : 常用在网络层的加密解密工具
  • 场景
    • 使用 node-fetch 发起请求时, 会发生什么
      • 首先在 npm 中安装了 node-fetch 模块后,在用户代码中就可以调用 node-fetch 模块
      • 接着在 V8 中执行, 因为要发生网络请求, 所以 node-fetch 在底层会调用 http 模块 [Node.js Core(javascript)], 之后 http 模块将会调用更底层的 c++ API
      • 之后调用 llhttp 来实现 http协议 的序列化和反序列化
      • 最终将得到的数据通过 libuv 建立 TCP 连接,将数据发给远端
  • 特点
    • 异步 IO
      • 如定时器
      • image.png
      • 当 Node.js 执行 IO 操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存空间等待
    • 单线程
      • 在 Node.js 版本大于 12 之后, 可以使用 worker_thread 开开启 一个独立的线程。这个独立的线程拥有单独的 V8实例 以及 eventloop。只是这个另外开启的线程和主线程没有太大的差别
      • JS 单线程 其实是指 JS 主线程 是单线程, 还有其他线程比如 uv 线程池V8 任务线程池V8 Inspector 线程
      • 优点
        • 不用考虑多线程状态同步的问题,也就不需要锁
        • 同时还能比较高效地利用系统资源
      • 缺点
        • 阻塞会产生更多负面影响(比如对于延迟比较敏感的场景)
          • 解决办法: 多进程或者多线程(比如 可以使用 worked_thread 来开启额外的线程)
    • 跨平台

3.编写 Http Server

本节目标

  • 编写静态文件服务器
  • 适用 inspector 进行调试,诊断
  • 部署