客户端容器丨青训营笔记

153 阅读2分钟

⁤ ​⁣⁢​⁡‍​​⁢⁣‍‌ ⁢‌ ​⁣‍⁢‍‍​‌‬⁢⁣​⁡⁢ ⁡⁤‌⁣‌⁢‬⁤⁡​ ⁣​⁣⁡ 字节前端训练营 - 客户端容器.pptx - 飞书云文档

本文同步发布于博客(xblc.netlify.app),如果有更新博客会在第一时间更新

浏览器架构

image.png

任务管理器

  • 浏览器是主进程
  • 实用程序就是微服务
  • 标签页是渲染进程,用于将网络传输得到的文件渲染成用于可以交互的网页

多进程分工 image.png

架构发展

  • 单进程架构出现的原因:节省资源
  • 面向服务架构有进化成多进程架构的趋势

浏览器内核

image.png

  • Blink 是 Chromium 的一部分

渲染进程

多进程架构

image.png

JS 引擎 & 渲染引擎

image.png

  • HTML 和 CSS 各自渲染得到树只有渲染到 显存(VRAMorGPU?)
  • JS 有字节码解析执行和机器码直接运行两种运行方式
  • 两个进程中的引擎通过桥接的方式来通信

渲染进程是怎么在多线程工作流程中工作的

image.png

  • 网络线程和事件线程分别处理网页资源和各种请求
  • 后者主要依靠任务队列+事件循环来持续处理
// 获取当前时间戳
const now = Date.now();

// 定时器1:10ms后输出"time10"和定时器1的执行延时
setTimeout(() => {
  console.log('time10', Date.now() - now); // 输出1:?
}, 10);

// 定时器2:30ms后输出"time30"和定时器2的执行延时
setTimeout(() => {
  console.log('time30', Date.now() - now); // 输出2:?
}, 30);

// 一直执行循环,直到距离当前时间戳至少过去20ms
while (true) {
  if (Date.now() - now >= 20) {
    break;
  }
}

// 输出当前已经过去的时间(自now开始计算)
console.log(Date.now() - now); // 输出3:?
  • 计时器线程会异步通过事件进程来回调执行
  • 等主线程被 JS 引擎执行完才回调执行
  • 后面实际执行的事件取决于任务队列里是否有其他应用

Chrome 运行原理

获取使用网页的全过程

  • 解析 -> DNS -> TCP -> HTTP
  • 关闭或保持连接
  • 解析 -> 请求可能引用的其他资源
  • 渲染树 -> 布局 -> 绘制
  • 交互 -> 关闭

跨端容器

理由

  • 效率、成本
  • 一致性体验

生态

  • 许多流行库都支持跨端开发

方案

  • webview
  • 小程序
  • RN/WeeX
  • Lynx
  • Flutter

通用原理

方案对比