Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于浏览器渲染 #1

Open
mengxiong10 opened this issue Apr 28, 2017 · 0 comments
Open

关于浏览器渲染 #1

mengxiong10 opened this issue Apr 28, 2017 · 0 comments

Comments

@mengxiong10
Copy link
Owner

mengxiong10 commented Apr 28, 2017

浏览器的渲染过程

  1. Create/Update DOM And request css/image/js:浏览器请求到HTML代码后,在生成DOM的最开始阶段(应该是 Bytes → characters 后),并行发起css、图片、js的请求,无论他们是否在HEAD里。
    注意:发起 js 文件的下载 request 并不需要 DOM 处理到那个 script 节点,比如:简单的正则匹配就能做到这一点,虽然实际上并不一定是通过正则:)。这是很多人在理解渲染机制的时候存在的误区。
  2. Create/Update Render CSSOM:CSS文件下载完成,开始构建CSSOM
  3. Create/Update Render Tree:所有CSS文件下载完成,CSSOM构建结束后,和 DOM 一起生成 Render Tree。
  4. Layout:有了Render Tree,浏览器已经能知道网页中有哪些节点、各个节点的CSS定义以及他们的从属关系。下一步操作称之为Layout,顾名思义就是计算出每个节点在屏幕中的位置。
  5. Painting:Layout后,浏览器已经知道了哪些节点要显示(which nodes are visible)、每个节点的CSS属性是什么(their computed styles)、每个节点在屏幕中的位置是哪里(geometry)。就进入了最后一步:Painting,按照算出来的规则,通过显卡,把内容画到屏幕上。

以上五个步骤前3个步骤之所有使用 “Create/Update” 是因为DOM、CSSOM、Render Tree都可能在第一次Painting后又被更新多次,比如JS修改了DOM或者CSS属性。

Layout 和 Painting 也会被重复执行,除了DOM、CSSOM更新的原因外,图片下载完成后也需要调用Layout 和 Painting来更新网页。

JavaScript 在 DOM、CSSOM 和 JavaScript 执行之间引入了大量新的依赖关系,从而可能导致浏览器在处理以及在屏幕上渲染网页时出现大幅延迟:

  • JavaScript 可以查询和修改 DOM 与 CSSOM。
  • JavaScript 执行要等到 CSSOM 就绪
  • 当浏览器遇到一个 script 标记时(没有defer 或 async), 无论我们使用 <script> 标记还是内联 JavaScript 代码段,DOM 构建将暂停, 直至脚本完成执行。如果是外部 JavaScript 文件,浏览器必须停下来,等待从磁盘、缓存或远程服务器获取脚本,这就可能给关键渲染路径增加数十至数千毫秒的延迟。所以脚本在文档中的位置很重要。

async/defer 异步加载不会阻塞DOM构建

  • async在加载完成后(http请求完成)立刻执行,无法保证执行顺序
  • defer的执行要在所有元素解析完成后,DOMContentLoaded事件之前完成,defer也不一定按照顺序执行,有风险
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant