浏览器渲染原理

这篇具有很好参考价值的文章主要介绍了浏览器渲染原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

浏览器的渲染原理

当你在地址栏输入内容回车后,浏览器进程中的UI线程会捕捉输入内容,如果访问的是网址,会启动一个网络线程来进行DNS解析;后面连接服务器获取数据;如果输入的不是网址而是关键词,就会使用默认配置的搜索引擎来进行查询

网络进程获取到数据后会使用safeBrowsing检查站点是否是恶意站点,如果是恶意站点则会提醒,阻止访问,当然你也可以强行访问(safeBrowsing是谷歌内部安全系统,比如检查数据来源ip是不是在谷歌黑名单内)

浏览器获取到数据后,通过IPC(Inter-Process Communication)通知浏览器进程,浏览器进程再通过IPC将数据传给渲染器进程的主线程,进行后续的渲染

渲染过程

浏览器渲染原理

1》解析html,HTML Parser

解析html,生成dom树(document object model 为有后续做准备,object操作起来比字符串方便)

解析过程中遇到css,会解析css,遇到js会执行js

大概过程:

转换:浏览器从磁盘或网络读取 HTML 的原始字节,并根据文件的指定编码(例如 UTF-8)将它们转换成各个字符。

令牌化:浏览器将字符串转换成规定的各种令牌,例如,“”、“”,以及其他尖括号内的字符串。每个令牌都具有特殊含义和一组规则。

词法分析:发出的令牌转换成定义其属性和规则的“对象”。

DOM构建:由于 HTML 标记定义不同标记之间的关系,创建的对象链接在一个树数据结构内

2》样式计算

这一步会把样式表的属性值标准化,如颜色全转为rgb格式,em/rem转换为px单位,字体的bold转为700

样式计算的过程:

  • 格式化样式表
  • 标准化样式表
  • 计算每个DOM节点具体样式
3》布局Layout

构建布局树 Layout Tree

Dom树和 布局树不是一一对应的;Dom树是和html对应的;而布局树是Dom树和计算好的样式生成的,和最后展示在屏幕上的节点对应;

比如display:none的节点没有集合信息,不会生成到Dom树;Dom树中不存在伪元素节点,但是伪元素content的内容会出现在布局树中,还有匿名行盒、匿名块盒等等都会导致DOM树和布局树无法一一对应

补充:内容必须在行盒中;行盒和块和不能相邻;不满足的时候就会有匿名盒子产生

4》分层Layer

生成图层树(Layer Tree),浏览器的 layers 可以看到分层信息

拥有层叠上下文属性的元素会被提升为单独一层

图层

  • 普通图层:正常文档流、absolute/fix布局的元素都在这一图层
  • 复合图层:开启了硬件加速的元素,会位于新的图层,其重绘/重排(回流)不会影响普通图层。开启硬件加速的方法包括:
    • 最常用的方式:translate3dtranslateZ
    • opacity属性/过渡动画(需要动画执行的过程中才会创建合成层,动画没有开始或结束后元素还会回到之前的状态)
    • <video><iframe><canvas><webgl>等元素
    • will-chang属性

层叠上下文

HTML根元素本身就具有层叠上下文

普通元素设置position不为static并且设置了z-index属性,会产生层叠上下文。

元素的 opacity 值不是 1

元素的 transform 值不是 none

元素的 filter 值不是 none

**will-change:**提前告诉浏览器在一开始就把元素放到新的图层,后面用GPU 渲染的时候,不需要做图层的新建

CSS硬件加速:GPU可以快速计算简单重复的任务

CSS大部分样式还是通过 CPU 来计算的,但CSS 中也有一些 3d 的样式和动画的样式,重复、简单且大量的计算任务,是由GPU 来计算的,不在主线程中进行;opacity 需要改变每个像素的值,符合重复且大量的特点,会新建图层,交给 gpu 渲染。transform 是动画,每个样式值的计算也符合重复且大量的特点

5》绘制Paint

主线程遍历Layout Tree,创建绘制记录表

渲染主线程的工作到此位置,上面步骤交给其他线程完成
浏览器渲染原理

将绘制信息交给合成器线程,合成器线程进行分块,并对每个块进行栅格化

6》分块 Tiles

分块将每一层分为多个小的区域,在合成线程中完成(也在渲染进程中)

为什么分块:

有时候,你的图层很大,或者说你的页面需要使用滚动条,然后页面的内容太多,这个时候需要滚动好久才能滚动到底部,但是通过视口,用户只能看到页面的很小一部分,所以在这种情况下,要绘制出所有图层内容的话,就会产生太大的开销,而且也没有必要,这样也能加快首屏展示的事件

因为后面图块(非视口内的图块)数据要进入 GPU 内存,考虑到浏览器内存上传到 GPU 内存的操作比较慢,即使是绘制一部分图块,也可能会耗费大量时间。针对这个问题,Chrome 采用了一个策略: 在首次合成图块时只采用一个低分辨率的图片,这样首屏展示的时候只是展示出低分辨率的图片,这个时候继续进行合成操作,当正常的图块内容绘制完毕后,会将当前低分辨率的图块内容替换。这也是 Chrome 底层优化首屏加载速度的一个手段;而且首先画的是视觉窗口内的内容

7》光栅化Raster

将图块转为位图

现在谷歌栅格化方案为合成,就是将页面的各个部分分块,分别进行栅格化,在专门的合成线程中进行

完成分块后,合成线程会将信息交给GPU进程,告诉完成光栅化

GPU会开启多个线程来完成光栅化,并且它优先处理靠近视口的块

  • 图块是栅格化执行的最小单位
  • 渲染进程中专门维护了一个栅格化线程池,专门负责把图块转换为位图数据
  • 合成线程会选择视口附近的图块(tile),把它交给栅格化线程池生成位图
  • 生成位图的过程实际上都会使用 GPU 进行加速,生成的位图最后发送给合成线程

栅格线程将每个图块转为位图然后合成器线程根据这些位图得到合成器帧帧

8》显示

合成器线程生成合成器帧,合成器帧frame通过IPC传给浏览器进程,浏览器进程通过IPC传给GPU进程,GPU进程将绘制信息提交给GPU硬件,完成屏幕成像

重绘与回流

重绘repaint

重绘是当节点需要更改外观而不会影响布局的

比如颜色改变、背景色变化

浏览器渲染原理

回流reflow

就是会影响布局的样式发生了改变

比如滚动页面、窗口变化、元素宽高改变等都会引起回流

浏览器渲染原理

阻塞问题

JS的加载与解析会不会阻塞html解析?

js会阻塞页面的渲染,GUI渲染线程与JS引擎线程互斥;但是不一定阻塞html解析

默认情况下使用script标签如果在body前面,是会阻塞html解析的,因为js可能会修改html解构(因为js可能会改变dom,所以他会暂停html和css的解析),如果js中调用了document.write()方法,那么之前的html解析就没有意义了;所以我们要将script标签放到合适的位置,或者加上defer或async

defer与async的区别

<script></script>
<script defer></script>
<script async></script>

1》async和defer的最主要的区别就是async是异步下载并立即执行,然后文档继续解析,defer是异步加载后解析文档,然后再执行脚本

2》defer脚本会在DOMContentLoaded和load事件之前执行
async会在load事件之前执行,但并不能确保与DOMContentLoaded的执行先后顺序

3》如果有多个声明了defer的脚本,则会按顺序下载和执行
如果有多个声明了async的脚本,其下载和执行也是异步的,不能确保彼此的先后顺序

浏览器渲染原理

    <script type="module"></script>

默认行为与defer一致,唯一区别是会将脚本中import的其它脚本也一并加载完

    <script type="module" async></script>

解析html的同时可以加载js,加载完后会立即执行脚本;而且会将脚本中import的其它脚本也一并加载完

注意:并不是非要等到HTML解析完才会触发绘制、显示,只要有完整CSS规则树+部分DOM树即可触发页面内容显示(尽管内容不全)

load事件和DOMContentLoaded事件

1》DOMContentLoaded事件

当纯 HTML 被完全加载以及解析时,DOMContentLoaded*事件会被触发,而不必等待样式表,图片或者子框架完成加载

2》load事件

在整个页面及所有依赖资源如样式表和图片都已完成加载时触发文章来源地址https://www.toymoban.com/news/detail-469787.html

SS规则树+部分DOM树即可触发页面内容显示(尽管内容不全)

load事件和DOMContentLoaded事件

1》DOMContentLoaded事件

当纯 HTML 被完全加载以及解析时,DOMContentLoaded*事件会被触发,而不必等待样式表,图片或者子框架完成加载

2》load事件

在整个页面及所有依赖资源如样式表和图片都已完成加载时触发

到了这里,关于浏览器渲染原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 渡一大师课笔记(重点:事件循环、浏览器渲染原理)

    响应式原理(渡一) 什么是数据响应式? 函数与数据的关联(重要) 数据变化后,会自动重新运行依赖该数据的函数(重要) 被监控的函数 render、computed回调、watch、watchEffect 函数运行期间用到了响应式数据(响应式数据一定是个对象) 响应式数据变化会导致函数重新运行

    2024年02月15日
    浏览(47)
  • 前端面试的话术集锦第 7 篇:高频考点(浏览器渲染原理 & 安全防范)

    这是记录 前端面试的话术集锦第七篇博文——高频考点(浏览器渲染原理 安全防范) ,我会不断更新该博文。❗❗❗ 注意:该章节都是⼀个⾯试题。 1.1.1 浏览器接收到HTML⽂件并转换为DOM树 当我们打开⼀个⽹⻚时,浏览器都会去请求对应的 HTML ⽂件。虽然平时我们写代码时

    2024年02月03日
    浏览(58)
  • pinokio让你在本地轻松跑多种AI模型的神奇浏览器

    想要探索生成式人工智能的前沿进展吗?订阅我们的中文简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!点击订阅,https://rengo

    2024年02月03日
    浏览(47)
  • 浏览器渲染机制

    学习渡一课程、参考 必须明白的浏览器渲染机制 - 掘金 HTML解析 布局 分层 绘制 分块 光栅化 画 解析html会生成一个 dom树和cssom树   document.styleSheets  可以看到cssom树     渲染阻塞 在渲染的过程中,遇到一个script标记时,就会停止渲染,去请求脚本文件并执行脚本文件,因为

    2024年02月11日
    浏览(43)
  • 浏览器渲染流程

    解析HTML,生成DOM树,解析CSS,生成CSSOM树 将DOM树和CSSOM树结合,生成渲染树(Render Tree) Layout(回流):根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小) Painting(重绘):根据渲染树以及回流得到的几何信息,得到节点的绝对像素 Display:将像素发送给GPU,展示在

    2024年02月09日
    浏览(47)
  • 【前端】浏览器的渲染流程(完整)

    本文主要包含以下内容: 浏览器渲染整体流程 解析 HTML 样式计算 布局 分层 生成绘制指令 分块 光栅化 绘制 常见面试题 浏览器,作为用户浏览网页最基本的一个入口,我们似乎认为在地址栏输入 URL 后网页自动就出来了。殊不知在用户输入网页地址,敲下回车的那一刻,浏

    2024年02月04日
    浏览(49)
  • 前端性能优化之浏览器渲染优化

    在当今互联网高速发展的时代,用户对于网页加载速度和性能的要求越来越高。作为前端开发者,我们需要关注并致力于提升网页的加载和渲染性能,以提供更好的用户体验。而浏览器渲染优化正是我们实现这个目标的关键。在本文中,我们将探讨一些关于浏览器渲染优化的

    2024年02月11日
    浏览(41)
  • 【autodesk】浏览器中渲染rvt模型

    Forge是什么 为什么能够渲染出来rvt模型 Forge是由Autodesk开发的一套云端开发平台和工具集。 在Forge平台中,有一个名为\\\"Model Derivative\\\"的服务,它可以将包括RVT(Revit)在内的多种BIM(Building Information Modeling)文件格式转换为可在Web上浏览和渲染的格式。 具体来说,\\\"Model Derivat

    2024年02月09日
    浏览(41)
  • 记录--浏览器渲染15M文本导致崩溃怎么办

    最近,我刚刚完成了一个阅读器的txt文件阅读功能,但在处理大文件时,遇到了文本内容过多导致浏览器崩溃的问题。 一般情况下,没有任何样式渲染时不会出现什么问题,15MB的文件大约会有3秒的空白时间。 尽管目前还没有严重的问题,但随着文件继续增大,肯定会超过浏

    2024年02月13日
    浏览(56)
  • 从浏览器输入地址到页面渲染都经历了哪些过程

    这是一道比较综合的面试题,答案也不是固定的,从浏览器输入地址到页面渲染经过了很多的过程,且每个过程都可以深挖出很多知识点,面试官可以用这一道题区分出不同面试者的水平。下面我们就来具体学习下本道面试题。 构建请求 1.查找强缓存 浏览器会先检查是否存

    2023年04月09日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包