前言

浏览器的内核是指支持浏览器运行的最核心的程序,分为两个部分,一是渲染引擎,另一个是JS引擎,渲染引擎在不同的浏览器中也不是都相同的.目前市面上常见的浏览器内核可以分为4种: Trident( IE ), Gecko( FireFox ), Blink( Chrome,Opera ), Webkit( Safari ),以 Webkit 为例,对现代浏览器的渲染过程进行一个深度的剖析

页面加载过程

简介要点如下:

  • 浏览器根据 DNS 服务器得到域名的 IP 地址
  • 向这个 IP 的机器发送 HTTP 请求
  • 服务器收到,处理并返回 HTTP 请求
  • 浏览器得到返回内容

浏览器渲染过程

大体上分为如下三部分

  1. 浏览器会解析三个东西:

    1.1 一是HTML/SVG/XHTML, HTML 字符串描述了一个页面的结构,浏览器会把 HTML 结构字符串解析转换 DOM 树形结构

    1.2 二是CSS,解析 CSS 会产生 CSS 规则树,它和 DOM 结构比较像

    1.3 三是 JavaScript 脚本,等到 JavaScript 脚本文件加载后, 通过 DOM API 和 CSSOM API 来操作 DOM Tree 和 CSS Rule Tree

  2. 解析完成后,浏览器引擎会通过 DOM Tree 和 CSS Rule Tree 来构造 Rendering Tree

    2.1 Rendering Tree 渲染树并不等同于 DOM树,渲染树只会包括需要显示的节点和这些节点的样式信息

    2.2 CSS 的Rule Tree 主要是为了完成匹配并把 CSS Rule 附加上 Rrendering Tree 上的每个 Element(也就是每个 Frame)

    2.3 然后,计算每个 Frame 的位置,又叫做 layout 和 reflow 过程

  3. 最后通过调用操作系统 Native GUI 的 API 绘制

构建DOM

浏览器会遵循一套步骤将文件转换为 DOM 树:

  • 浏览器从磁盘或网络读取 HTML 的原始字节,并根据文件的指定编码将它们转换成字符串
  • 将字符串转换为Token,例如<html> <body>等. Token 中会标志出当前 Token 是"开始标签"或是"结束标签"或"文本"等信息,以维护节点与节点间的关系
  • 生成节点对象并构建DOM.构建 DOM 的过程中,不是等所有 Token 都转换完成后再去生成节点对象,而是一边生成 Token 一边消耗 Token 来生成节点对象,即每个Token被生成后,会立刻消耗这个 Token 创建出节点对象.带有结束标签标志的 Token 不会创建节点对象

假设有段 HTML 文本:

<html>
<head><title>Web page parsing</title>
</head>
<body><div><h1>Web page parsing</h1><p>This is an example Web page.</p></div>
</body>
</html>

上面这段HTML会解析成这样:

构建CSSOM

DOM 会捕获页面的内容,但浏览器还需要知道页面如何展示, 所以需要构建CSSOM

构建CSSOM的过程和构建DOM的过程非常相似,当浏览器接收到一段CSS,浏览器首先要做的是识别出Token,然后构建节点并生成CSSOM

假设有这一段CSS:

body {font-size: 16px;}
p {color: red;}
p span {display:none;}
span {font-size: 14px;}
img {float: right;}

在经过一系列步骤后生成的CSSOM:

从图中还可以看出.body节点的子节点继承了 body 的样式规则(font-size: 16px).这就是层叠规则以及CSS为什么叫CSS(层叠样式表)

注意:CSS 匹配 HTML 元素是一个相当复杂和有性能问题的事情,所以,DOM树要小,CSS要尽量用id和class,不要过度层叠下去

构建渲染树

生成 DOM 树和 CSSOM 树之后,就要将这两棵树组合为渲染树.

渲染树只会包括需要显示的节点和这些节点的样式信息,如果某个节点是 display: none ,n那么就不会再渲染树中显示

渲染过程中,如果遇到 <script> 就停止渲染,执行 JS 代码.因为浏览器有 GUI 渲染线程与 JS 引擎线程,为了防止渲染出现不可预期的结果,这两个线程是互斥的关系. JavaScript 的加载,解析与执行会阻塞 DOM 的构建,也就是说,在构建 DOM 的时候,HTML 解析器若遇到了 JavaScript,就会暂停构建 DOM,等到 JavaScript 加载完毕,浏览器再从中断的地方恢复 DOM 构建

JS 文件不只是阻塞 DOM 的构建,它会导致 CSSOM 也阻塞 DOM 的构建

因为JavaScript不只是可以改 DOM,它还可以改 CSSOM.因为不完整的 CSSOM 是无法使用的,所以如果浏览器此时尚未完成 CSSOM 的下载和构建,却想要加载运行脚本,那么浏览器将延迟脚本执行和 DOM 构建,直至其完成 CSSOM 的下载和构建.也就是说, 在这种情况下,浏览器会先下载并构建 CSSOM,再执行JavaScript,最后再继续构建 DOM

因此,想首屏渲染的越快,就越不应该在首屏就加载 JS 文件,这也是都建议将 script 标签放在 body 标签底部的原因.当然在当下,并不是说 script 标签必须放在底部,因为你可以给 script 标签添加 defer 或者 async 属性

前端学习(一) 浏览器渲染原理相关推荐

  1. 浏览器渲染原理_web前端培训课程

    在我们正式开始学习之前,首先让我们了解一些浏览器的一些知识点,然后再对浏览器渲染原理深刻的理解一下,这次学习是针对Chrome浏览器的渲染机制. 最新的Chrome浏览器包括:1个浏览器主进程,一个G ...

  2. 浏览器渲染机制面试_前端面试大全:浏览器渲染原理-文件无法渲染

    在这一篇文章中,我们将一起学习浏览器渲染原理这部分的知识.你可能会有疑问,我又不是做浏览器研发的,为什么要来学习这个?其实我们学习浏览器渲染原理更多的是为了解决性能的问题,如果你不了解这部分的知识,你 ...

  3. 前端浏览器渲染原理及优化

    文章目录 一.浏览器组成 1. 对浏览器内核的理解 2. 浏览器的主要组成部分 二.浏览器渲染原理 1.浏览器的渲染过程 步骤一: 步骤二: 步骤三: 步骤四: 步骤五: 2.相关概念 ①重排(更新元 ...

  4. 浏览器渲染原理的学习与总结

    参考文章:浏览器渲染原理 浏览器渲染原理 1. 进程和线程 进程包涵线程, 微信是一个进程, 里面有很多诸如用户登录等线程. a.线程共享内存, 进程独立内存: 进程与进程之间是相互独立的, 他们各自 ...

  5. 前端性能优化之浏览器渲染原理和关键渲染路径、复合线程、图层及优化、JS 开销及优化和 HTML 和 CSS 优化

    一.浏览器渲染原理和关键渲染路径 浏览器构建渲染树,DOM 树和 CSSDOM 树合成为 Render Tree 渲染树. 浏览器的渲染流程,如下所示: JavaScript -> Style ...

  6. 浏览器渲染机制面试_浏览器渲染原理

    本文目录结构 问题 浏览器渲染原理 渲染过程 1. 浏览器接收到 HTML ⽂件并转换为 DOM 树 当我们打开⼀个⽹⻚时,浏览器都会去请求对应的 HTML ⽂件.虽然平时我 们写代码时都会分为 JS ...

  7. 浏览器渲染原理-通俗易懂版本

    文章目录 浏览器渲染原理 前言 1. 网页的解析过程 2. 浏览器的功能与组成 2.1 浏览器内核 2.2 进程与线程 3. 浏览器渲染流程 3.1 渲染引擎解析过程 3.2 渲染引擎主要模块 4. ...

  8. 一篇文章理解浏览器渲染原理和机制

    浏览器渲染原理和网页打开机制 举一个例子,如果说JS是工具,前端开发时操作工具的人.如果说JS是一辆汽车,而前端开发是司机,那么高速公路就是浏览器,这是它的工作环境. 为什么很多新人加入前端开发不好找 ...

  9. Chrome浏览器渲染原理笔记

    以前没怎么系统性的深入学习这方面,今天看了篇文章后还是觉得要好好整理归纳下的.顺便尝试能不能养成写笔记的习惯. 目录 浏览器的架构 Chrome浏览器的多进程架构 多进程架构的好处 多进程架构优化 C ...

最新文章

  1. 黑客基础知识与防护(二)
  2. oracle的乐观锁和悲观锁
  3. “xxxx“.zip:这个压缩文件格式未知或者数据已经被损坏,打不开压缩文件,总出现这个提示的解决方法
  4. python经典100例答案pdf-Python 入门 100 案例,PDF免费下载
  5. 大肠结构笔记(持续更新中)
  6. ios10不能定位 window.navigator.geolocation.getCurrentPosition(定位第一节)
  7. 解放重复劳动丨华为云IoT API Explorer对接小程序实现系统化应用
  8. fastjson map转json_Java对象转JSON咋这么头疼?不!那是你还没使用Fastjson
  9. python新手入门代码-新手零基础入门Python项目实战
  10. 2008-05-23
  11. postgreSQL 自动递增序号
  12. 温度传感器、VB.NET
  13. python用opencv实现图片的美白磨皮_OpenCV 磨皮-Python
  14. Dell台式计算机BIOS放电,戴尔BIOS设置电池维修笔记本电脑电池BIOS设置图形方法...
  15. 使用ScanPort、SuperScan、Nmap进行端口扫描
  16. Duplicate Cleaner Pro(电脑重复文件清理软件)官方中文版V5.15.0 | 重复文件查找王下载
  17. 不知道RabbitMQ中Exchange类型Internal是什么意思?这边来~
  18. 100个常用的 PHP 类库、资源和技巧小结
  19. Gocv图片合成视频(无音频)
  20. 硬盘开启NCQ功能全解

热门文章

  1. 解决Win10-PL2303驱动安装自动更新问题
  2. 使用U盘安装CenTOS6
  3. 2017年免费OA系统选型综合分析
  4. 强力磁钢变脸因缘:陋习如实“举报”!
  5. Echarts Y轴添加单位
  6. 周杰伦 jay《最长的电影》mp3 下载/试听/MV/在线播放
  7. vue实现分页的两种方式
  8. 贪吃蛇c语言代码图片,【图片】C语言小游戏~贪吃蛇【c语言吧】_百度贴吧
  9. u盘格式化的格式及分配单元大小
  10. stm32单片机c语言入门,STM32入门教程1,初学者入门,从零开始,使用keil建立一个简单的ST...