浏览器架构
浏览器架构对比
多进程结构
现代浏览器通常采用多进程架构,每个进程承担不同的任务,以提高浏览器的性能和安全性。以下是浏览器架构中的多进程分工:
- 浏览器进程:浏览器的主进程,控制其他所有进程。主要任务包括管理用户界面、处理用户输入、浏览器设置等。
- 渲染进程:每个标签页都会有一个渲染进程,负责解析HTML、CSS和JavaScript代码,并将其转化为可视化的网页。渲染进程还负责处理用户交互事件,如点击、滚动等。
- GPU进程:负责处理浏览器中所有的GPU任务,如绘制网页和播放视频。
- 网络进程:负责处理浏览器中的所有网络请求。当用户请求访问一个网页时,网络进程会向服务器发送请求,并将接收到的数据传递给渲染进程。
- 插件进程:负责运行浏览器中的插件,如Flash。
- 协议处理器:负责处理浏览器中的外部协议,如邮件、FTP等。
Q&A
面向服务架构是否会替代多进程架构?
它们都有自己的优缺点和适用场景,并不一定存在替代关系。
面向服务架构是一种松散耦合、基于服务的分布式系统架构,通过服务的组合和调用来构建复杂的应用。面向服务架构强调服务的独立性、可组合性和可重用性,通常采用 HTTP、SOAP 或者 REST 等协议进行通信。
多进程架构是一种将应用程序拆分为多个进程运行的架构,每个进程都有自己独立的内存空间和系统资源,进程之间通过进程间通信(IPC)进行通信。多进程架构可以提高系统的可靠性和安全性,因为一个进程崩溃不会影响其他进程的运行。
尽管面向服务架构可以实现分布式系统,但是在某些场景下,多进程架构仍然是更合适的选择。例如,需要高度的可靠性、安全性和并发性时,多进程架构可能更适合。而在需要快速迭代和部署、业务逻辑比较简单的场景下,面向服务架构可能更适合。
渲染进程
综述
内部是多线程实现,主要负责页面渲染、脚本执行、事件处理、网络请求等
渲染进程的主要职责是将 HTML、CSS、JavaScript 代码转换成页面,生成 DOM 树和渲染树,并进行页面布局和绘制。在渲染页面时,渲染进程还需要处理各种用户输入事件,例如鼠标点击、键盘输入等,进行响应和交互。
为了保证网页的安全性和稳定性,渲染进程通常会被限制在一个沙箱环境中运行,无法访问操作系统的底层资源。渲染进程也需要遵守同源策略,即只能访问同源的资源,不能跨域访问其他网站的资源。同时,为了提高性能和资源利用率,渲染进程还会采用一些优化技术,例如页面预加载、缓存、进程复用等。
内部的线程
- JS 引擎线程:用于执行 JavaScript 代码,并把执行结果反馈给渲染引擎。
- GUI 渲染线程:用于将 HTML、CSS 和 JavaScript 转换为页面展示的像素信息。GUI 渲染线程负责页面的布局、绘制和排版,并将最终的页面渲染到屏幕上。
- 定时器触发线程:用于处理 JavaScript 中的定时器操作,确保定时器能够按照预期执行。
- 网络线程:用于处理网络请求,包括 DNS 解析、TCP 连接、HTTP 请求等。
- 事件触发线程:用于处理 JavaScript 中的事件操作,例如用户鼠标点击事件、键盘事件等。
JS引擎 & 渲染引擎
JS引擎负责解析和执行JavaScript代码,并且提供各种优化策略以提高性能。常见的JS引擎包括V8、SpiderMonkey、JavaScriptCore等,它们都是独立的代码库,可以被嵌入到各种应用程序中。在浏览器中,JS引擎通常是单独的线程,用于执行JavaScript脚本。
渲染引擎则负责将HTML、CSS、JavaScript等资源转换成渲染树,并进行布局和绘制,最终呈现给用户。渲染引擎通常包含了多个线程,包括GUI渲染线程、网络线程、事件触发线程等。常见的渲染引擎包括WebKit、Blink、Gecko等。
在浏览器中,JS引擎和渲染引擎通常是分离的,它们之间通过接口进行交互。当浏览器需要渲染一个网页时,它首先会使用网络线程下载页面资源,然后将HTML、CSS等解析成DOM、CSSOM等内部数据结构,并将它们交给渲染引擎处理。渲染引擎会根据解析出来的内部数据结构构建渲染树,并使用GUI渲染线程进行绘制。在渲染过程中,如果遇到JavaScript脚本,渲染引擎会将它交给JS引擎执行,并根据执行结果更新渲染树。这样,就完成了网页的渲染过程。
Chrome运行原理
浏览器地址输入URL后发生了什么?
输入处理
1.用户Url框输入内容的后,UI线程会判断输入的是一个URL地址呢,还是一个query查询条件
2.如果是URL,直接请求站点资源
3.如果是query,将输入发送给搜索引擎
开始导航
1.当用户按下回车,U线程通知网络线程发起一个网络请求,来获取站点内容
2.请求过程中,tab处于loading状态
读取响应
1.网络线程接收到HTTP响应后,先检查响应头的媒体类型(MIMEType)
2.如果响应主体是一个HTML文件,浏览器将内容交给染进程处理
3.如果拿到的是其他类型文件,比如zip、exe等,则交给下载管理器处理
寻找渲染进程
1.网络线程做完所有检查后,会告知主进程数据已准备完毕,主进程确认后为这个站点寻找一个染进程
2.主进程通过IPC消息告知染进程去处理本次导航
3.染进程开始接收数据并告知主进程自己已开始处理,导航结束,进入文档加载阶段
资源加载
1.收到主进程的消息后,开始加载HTML文档
2.除此之外,还需要加载子资源,比如些图片,CSS样式文件以及JavaScript脚本
构建渲染树
1.构建DOM树,将HTML文本转化成浏览器能够理解的结构
2.构建CSSOM树,浏览器同样不认识CSS,需要将CSS代码转化为可理解的CSSOM
3.构建染树,染树是DOM树和CSSOM树的结合
页面布局
1.根据染树计算每个节点的位置和大小
2.在浏览器页面区域绘制元素边框
3.遍历染树,将元素以盒模型的形式写入文档流
页面绘制
1.构建图层:为特定的节点生成专用图层
2.绘制图层:一个图层分成很多绘制指令,然后将这些指令按顺序组成一个绘制列表,交给合成线程
3.合成线程接收指令生成图块
4.栅格线程将图块进行栅格化
5.展示在屏幕上
性能优化
首屏优化
- 压缩、分包、删除无用代码
- 静态资源分离
- JS脚本非阻塞加载
- 缓存策略
- SSR
- 预置loading、骨架屏
渲染优化
- GPU加速
- 减少回流、重绘
- 离屏渲染
- 懒加载
JS优化
- 防止内存泄漏
- 循环尽早break
- 合理使用闭包
- 减少Dom访问
- 防抖、节流
- Web Workers