客户端容器|青训营笔记

96 阅读8分钟

一、浏览器架构

浏览器架构演进
  • 单进程架构:浏览器所有功能模块都是运行在同一个进程里

所有功能模块包含了网络、插件、JavaScript运行环境、渲染引擎和页面等,这么多模块运行在一个进程中,是导致单进程浏览器不稳定、不流畅和不安全的一个主要因素

  • 多进程架构:浏览器进程、渲染进程、GPU进程、网络进程、插件进程等进程

为了解决单进程架构的问题加上硬件上的升级,开始拆分为多个进程。每个标签页分配给一个单独的进程。

  • 面向服务架构:将原来的UI、数据库、文件、设备、网络等模块重构为基础服务,类似操作系统底层服务

每个服务(Service)都可以在独立的进程中运行,访问服务必须使用定义好的接口,通过 IPC 来通信,从而构建一个更内聚、松耦合、易于维护和扩展的系统,更好实现 Chrome 简单、稳定、高速、安全的目标。

浏览器各架构对比

浏览器各架构对比

多进程架构分析
进程名称进程描述
浏览器进程主要负责界面显示、用户交互、子进程管理,同时提供存储等功能
渲染进程核心任务是将HTML、CSS 和 JavaScript 转换为用户可以与之交互的页面,排版引擎Blink和Javascript引擎V8都是运行在该进程中,默认情况下,Chrome会为每个Tab标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下
GPU进程GPU 的使用初衷是为了实现 3D CSS 的效果,只是随后网页、Chrome 的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 成为浏览器普遍的需求
网络进程主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程
插件进程主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响

二、渲染架构

浏览器内核JS引擎
IE/EdgeTrient(<=IE10);EdgeHTMLJScript(<IE9);chakra(IE9+及Edge)
SafariWebkit/Webkit2JSCore/Nitro(4+)
ChromeChromium(Webkit);BlinkV8
FirefoxGeckoSpiderMonekey(<3.0);TraceMonkey(<3/6);JaegerMonkey(4.0+)
OperaPresto;BlinkFuthark(9.5-10.2)
渲染进程多线程架构

内部是多线程实现,主要负责页面渲染,脚本执行,事件处理,网络请求等

JS引擎VS渲染引擎
JS引擎和渲染引擎是浏览器中两个非常重要的组件。
它们分别负责处理JavaScript代码和渲染网页内容。

渲染引擎:渲染引擎负责解析HTML和XML文档,构建DOM树。然后,渲染引擎会解析CSS样式,并将样式信息附加到DOM树上,生成渲染树。接下来,渲染引擎会计算每个节点的布局信息(如位置和大小),并将渲染树转换为屏幕上的像素。这个过程被称为“绘制”或“渲染”。比如 chrome 的 blink,老版本的 webkit。

JS引擎:也称为 js解析器。用来读取网页的 javaScript 代码,对其处理后运行,比如 chrome 浏览器 V8,不负责解析XML或生成渲染树。然而,JavaScript可以通过DOM API操作DOM树,从而间接地影响渲染树的生成和更新。。

多线程工作流程
  1. 网络线程负责加载网页资源
  2. JS引擎解析JS脚本并且执行
  3. JS解析引擎空闲时,渲染线程立即工作
  4. 用户交互、定时器操作等产生回调函数放入任务队列中
  5. 事件线程进行事件循环,将队列里的任务取出交给JS引擎执行

三、chrome运行原理

主进程工作流程

1. 输入解析

浏览器首先解析输入的内容,判断它是一个有效的URL还是搜索查询。如果输入的内容被识别为搜索查询,浏览器将使用默认的搜索引擎进行搜索。

2. DNS查询

如果输入的内容是一个有效的URL,浏览器将进行域名系统(DNS)查询以将域名解析为对应的IP地址。浏览器会首先检查本地DNS缓存,如果找不到对应的记录,它会向DNS服务器发送查询请求。

3. 建立连接

浏览器与目标服务器建立一个TCP连接。这通常包括三次握手过程,以确保双方都准备好进行数据传输。

4. 发送HTTP请求:

TCP连接建立后,浏览器向服务器发送一个HTTP请求。请求通常包括请求方法(如GET或POST)、请求的资源路径、HTTP协议版本、请求头(包含诸如用户代理、接受的编码和语言等信息)以及可能的请求体(如POST请求所包含的表单数据)。

5.接收响应:

服务器处理HTTP请求,并将响应数据发送回浏览器。响应通常包括HTTP状态码(如200表示成功,404表示未找到等)、响应头(包含诸如内容类型、内容长度等信息)以及响应体(通常是HTML文档)。

6. 关闭或重用连接:

一旦浏览器接收到完整的响应数据,它可以选择关闭TCP连接或将其保持在活动状态以用于后续请求

7. 解析HTML:

浏览器解析HTML文档,构建DOM树。在解析过程中,浏览器可能遇到<script>标签或其他需要立即执行的脚本,这时浏览器将暂停解析,执行脚本,然后继续解析。

8. 请求其他资源:

HTML文档通常包含其他资源的引用,如CSS、JavaScript和图片等。浏览器将发送额外的HTTP请求来获取这些资源。这些请求可能与初始请求的服务器相同,也可能涉及其他服务器。

9. 构建渲染树:

浏览器解析CSS样式,并将其应用于DOM树,生成渲染树。渲染树包含了所有可见元素及其样式信息。

10. 布局:

浏览器计算渲染树中每个元素的位置和大小,生成布局信息。

11. 绘制:

浏览器根据渲染树和布局信息将元素绘制到屏幕上。这个过程称为绘制或渲染。浏览器会将各个层的元素绘制到位图中,然后将这些位图合成到屏幕上显示的最终图像。

12. 交互:

在完成页面绘制后,浏览器开始接收和处理用户的交互,如点击、滚动、输入等。这些交互可能会触发JavaScript事件处理程序,从而修改DOM或应用新的样式。这些修改可能会导致浏览器重新布局和绘制页面的部分或全部内容。

13. 关闭或卸载:

当用户导航到其他页面或关闭浏览器选项卡时,浏览器将触发相应的页面卸载事件,如beforeunloadunload。这给开发者一个机会来执行清理操作,如保存用户数据或取消挂起的网络请求。一旦完成这些操作,浏览器将卸载页面并释放相关资源

渲染进程工作流程

渲染进程工作流程

浏览器性能优化
  1. 防止内存泄露
  2. 循环尽早break
  3. 合理使用闭包
  4. 减少Dom访问
  5. 防抖、节流
  6. Web Workers

四、跨端容器

跨端的由来

1. 开发成本、效率

跨端开发可以帮助降低成本和提高开发效率。使用跨端技术,开发者只需编写一份代码,就可以在多个平台(如iOS、Android和Web)上运行。这可以减少开发和维护的工作量,节省时间和资源。同时,开发团队可以更快地推出新功能和修复问题,因为他们只需关注一份代码库。

2. 一致性体验

跨端开发可以确保在不同平台上提供一致的用户体验。使用跨端技术,开发者可以更容易地保持应用的外观和功能一致,无论用户在什么设备上使用。这有助于提高用户满意度和用户留存率。

3. 前端开发生态

跨端开发受益于强大的前端生态系统。许多流行的前端框架和库,如React Native、Flutter和Ionic,都支持跨端开发。这些工具为开发者提供了丰富的资源和丰富的社区支持,帮助他们更轻松地实现跨端功能。

常见的跨端方案
  • webview
  • 小程序
  • RN/Weex
  • Lynx
  • Flutter

课程总结

参考:客户端容器 - web浏览器以及跨端方案(万字笔记) | 青训营笔记