Chrome浏览器是如何工作的?(一)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
.cn 域名,1个 12个月
云解析 DNS,旗舰版 1个月
简介: Chrome浏览器是如何工作的?(一)

image.png

Chrome浏览器是如何工作的?(一)


前言:

观看视频有感,随手记录一下。并且对于自己身为一个前端工程师,连一个浏览器的页面渲染的大致过程都无法正确表达出来,深深感到羞愧。

tips: 本文是纯新手向,只会以自己初学的理解讲解大致过程,给和我有同样疑问的新手提供一个大致的思路,并且会同步讲解其它额外相关知识。本文并不会牵扯源码级别的实现,请各位深知其中细节大佬键⌨️下留情。

一.当你刚打开浏览器时


双击浏览器图标

紧接着系统分配给浏览器一块内存

随后浏览器创建一个进程准备工作(process
以Mac为例子,在聚焦内搜索活动监视器,就会出现类似于          Windows 任务管理器很相似的窗口,可以看到这台机器上运行着已经开启的 Chrome 应用进程。

1c332a25892c4bff84fe10d33dd72c12_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.jpg

二.浏览器启动后


恭喜你获得了一个空白的 Chrome 首页,但是没想到吧~它此时已经同步开启了多个进程来协助它完成后续工作。

image.png

找到 Chrome 右上角头像旁边的三个点点,找到更多工具,点击任务管理器,就可以看到此时 Chrome 浏览器运行时,同步开启了哪些进程。

image.jpeg

你自定义的拓展工具也会各自开启一个进程。

image.png

回过头看一下这些进程分别代表着什么

image.png

浏览器进程(主进程,但不负责Tab)主要控制-> 地址栏、书签、后退、前进,并负责进行浏览器和其它进程之间的调度协调。
主进程又细分为:
  1. GPU进程 (负责整个浏览器页面的渲染,包含顶部的搜索栏,和Tab标签页的内容)
  2. Network:网络进程 (看名字就显而易见,负责网络请求的处理)
  3. Storage:缓存进程 (顾名思义,管理缓存之类)
  4. Audio: 音频进程 (顾名思义)
  5. Data Decoder :数字解码进程
  6. Plugin :在这里没有明确写出 Plugin 这几个字,其实它就是我们浏览器一些

4. 可以很清晰的看到,每个 Tab 页都有属于自己的一个进程,这也就保证了某一个页面卡死,但是并会不影响其它页面的正常工作。

image.png

但是这样一个 Tab 一个进程点分配原则是一定的吗?并不一定,这取决于你浏览器设置的进程模型是什么。这里贴一下 Chromium文档

image.png

其中 Chrome 默认使用的的就是第一个 Process-per-site-instance 模型,可以简单的理解为每个 Tab 都会分配一个进程去处理。另外三个模型可以自行了解,这里我暂时还未搞懂,就不误导大家了。

三.当你在url地址栏输入网站敲下回车后


此时浏览器进程会开启一个 UI 线程去捕捉你输入的到底是关键字还是域名。 这里假设你输入的是 www.baidu.com (输入的是域名,并不是关键字。)

UI 线程判断你输入的是域名,然后它会把用户输入的信息通知给Network 进程。(这里就需要了解一下进程之间的通讯是通过 IPC inter process communication)

Network 进程收到通知后,会去请求 DNS(domain name system)域名解析系统,解析域名相对应的 IP 地址。

如果你输入的是关键词,那么 Network 进程会使用默认的搜索引擎去查找相对应的输入内容。

当网络进程拿到站点服务器返回的数据后,(注意,此时你已经拿到相对应的页面信息,但是还没渲染到页面上)首先 Chrome 自带的 SafeBrowsing 会检查站点是否⚠️为风险站点。(通常是检查站点 ip 是否在谷歌的黑名单里)

ok,假设你访问的并不是风险网站。那么 Network 进程会通知 UI 进程我这边处理好了,该你上场了。

image.png

UI 线程拿到网站数据后,会创建一个渲染进程(Renderer Process)来渲染页面。(通过 IPC 传递)

四.页面渲染流程


渲染进程拿到数据后,也就是.html文件后,将会解析该文件。构建对应的 Dom 节点。(拿到的其实就是这个样子)

image.png

紧接着进行 Render 进程进行 Tokeniser 词法解析。这个过程有些抽象,这里我简单举个栗子🌰。(比如:我今天吃了一个冰激凌🍦,其中【我】是主语,【吃】是动词,【冰激凌】是名词,这些都是我们人类主观定义好的词性,如何让机器去理解这写词语的词性,就是词法解析。)映射到这里,就好比我们写的<div>、<img> 等标签,都是我们人主观定义好的,告诉机器如何去理解对应的数据,这个过程就是词法解析。

当解析好以后,紧接着会进行 DOM Tree 构造。

image.png

⚠️注意此时真实 DOM 还未构造出来。

这时候会创建 Document 对象,body对象,节点对象等等。(这里不要觉得很高深。没错,这里创建的 Document 对象并不是什么稀罕玩意,就是我们常用的  document.getElementById 方法中的那个 documentBody 同理。)

文档解析是从上向下解析的,当遇到像<img>等行内替换元素是不会阻塞 Dom Tree 的构造的。但是当遇到<script>标签的时候,就会停止解析.html文件,直到.js文件解析完毕。为什么呢?这其实也是 JS 为什么要设计成单线程的原因,如果解析 domJS 并行,那么就会造成某一时刻 dom 要将一个div渲染成一个蓝色背景,但是 JS 同时修改了这个 div 的背景颜色为红色,那我到底该听谁的呢?通常就会造成页面无法正常工作。

image.png

也对应了最开始学习html标签时的知识,<script> 标签要放到合适的位置。

假设现在最后一行代码已经解析完毕,那么我们就会得到一个完整的 DOM Tree

image.png

五.样式渲染


这个过程就是解析.css 文件的过程,查找每个节点是否有设置类名,然后解析样式对应的数值。

六.元素渲染位置


只拿到了每个元素该渲染成什么样子是不够的,这时候还需要知道各个元素所需要呈现在页面哪个位置。也就是元素所占页面的大小和节点的坐标。这个过程称为 Layout 布局。

Render 主线程通过遍历 DOM Tree 和先前计算好的样式生成与之对应的 Layout TreeLayout Tree 记录了每个节点在页面上对应的(x,y)坐标和尺寸。

image.png

这里需要注意的是,DOM TreeLayout Tree 并不是一一对应的关系。DOM Tree 某个元素如果设置了display:none,则该元素不会出现在 Layout Tree 上。

而如果在样式中设置了 伪类 (如:div::before)并且设置了 content 属性,那么该元素就会出现在 Layout Tree 上,但是并不会出现在 Dom Tree 上。造成这个的根本原因就是 DOM Tree 完全就是根据 html生成的,它并不关心样式。而 Layout Tree 是根据计算 DOM Tree样式计算生成的。

相关文章
|
3月前
|
Web App开发 数据采集 存储
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
本文探讨了如何利用Chrome DevTools Protocol (CDP) 与 Selenium WebDriver 提升浏览器自动化效率,结合代理IP技术高效采集微博数据。通过CDP,开发者可直接操作浏览器底层功能,如网络拦截、性能分析等,增强控制精度。示例代码展示了如何设置代理IP、cookie及user-agent来模拟真实用户行为,提高数据抓取成功率与稳定性。适用于需要频繁抓取互联网数据的应用场景。
520 3
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
|
28天前
|
Web App开发 缓存 安全
WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx
【11月更文挑战第6天】本文介绍了 WIN11 系统中 Chrome 浏览器双击打不开闪退及不能拖拽文件 crx 的原因和解决方法。包括浏览器版本过旧、扩展程序冲突、硬件加速问题、缓存过多、安全软件冲突、系统文件损坏、用户配置文件损坏等问题的解决方案,以及 crx 文件的屏蔽、权限问题和文件格式问题的处理方法。
|
1月前
|
Web App开发 Linux iOS开发
Chrome浏览器如何导出所有书签并导入书签
【11月更文挑战第4天】本文介绍了如何在 Chrome 浏览器中导出和导入书签。导出时,打开书签管理器,点击“整理”按钮选择“导出书签”,保存为 HTML 文件。导入时,同样打开书签管理器,点击“整理”按钮选择“导入书签”,选择之前导出的 HTML 文件即可。其他主流浏览器也支持导入这种格式的书签文件。
|
1月前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
183 9
|
2月前
|
Web App开发 开发者
|
2月前
|
Web App开发 JSON 安全
Chrome浏览器的跨域问题
【10月更文挑战第6天】
|
2月前
|
Web App开发 缓存 安全
Chrome浏览器启动参数大全
这是一组用于定制浏览器行为的命令行参数,包括但不限于:不停用过期插件、放行非安全内容、允许应用中心脚本、停用GPU加速视频、禁用桌面通知、禁用拓展及各类API、调整缓存设置、启用打印预览、隐身模式启动、设定语言、使用代理服务器、无头模式运行等。通过这些参数,用户可以根据需求灵活调整浏览器功能与性能。
|
3月前
|
Web App开发 存储 前端开发
Chrome浏览器的跨域问题
Chrome浏览器的跨域问题
|
4月前
|
Web App开发
Chrome——谷歌浏览器chrome如何模拟其他客户端
Chrome——谷歌浏览器chrome如何模拟其他客户端
107 1
Chrome——谷歌浏览器chrome如何模拟其他客户端
|
4月前
|
Web App开发 JSON 安全
【跨域难题终结者】:一键解锁Chrome浏览器神秘设置,彻底告别开发阶段的跨域烦恼!
【8月更文挑战第20天】跨域是前端开发常遇难题,尤其在前后端分离项目中。浏览器因安全考量会阻止不同源间的请求。本文对比CORS、JSONP、代理服务器等解法,并介绍开发阶段通过调整Chrome设置来临时禁用跨域限制的方法,提供启动Chrome及使用`fetch`API示例,适合快速测试。但请注意这不适用于生产环境,存在一定安全风险。
1062 1