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

浏览器渲染原理浅析 #17

Open
shuch opened this issue Jun 14, 2020 · 0 comments
Open

浏览器渲染原理浅析 #17

shuch opened this issue Jun 14, 2020 · 0 comments
Labels
browser 浏览器相关

Comments

@shuch
Copy link
Owner

shuch commented Jun 14, 2020

浏览器多线程

浏览器是多线程的

  • GUI 渲染线程
  • JavaScript 引擎线程
  • 定时器线程
  • 事件线程
  • 异步请求线程

为了防止渲染出现不可预期的结果(js可能修改domcss),GUI 渲染线程和JavaScript引擎线程互斥。

share

渲染线程

  • 解析 HTML 构建DOMDom Tree
  • 解析 CSS 构建 CSS 规则树 CSS Rule Tree
  • CSS规则树附加到 DOM树上,删除不可见元素,形成渲染树 Render Tree
  • 回流(ReflowLayout):计算每个元素盒子位置和大小
  • 重绘(Repaint):根据元素的位置和大小,计算元素的绝对像素
  • 渲染(Display):将绝对像素发给GPU,将多个合成层合并,形成一个层。

68747470733a2f2f692e696d6775722e636f6d2f64384b785a53772e706e67

元素新增和删除以及位置或大小改变会触发节点的回流(Reflow),之所以叫回流是因为浏览器默认的布局方式是流式布局。参考回流和重绘

优化方式

  • 尽量避免js操作dom
  • style 样式改变通过class而不是手动修改
  • 开启GPU加速渲染will-changetranslateZ
  • documentFragment离线操作 dom
  • 耗时操作放在web worker中完成

Render-Process-Skipping

script defer和async

  • async 属性会异步下载script,下载后立即执行,下载完成前不影响html解析。
  • defer 属性会异步下载script,下载后延迟执行,等到html解析完成,执行完成后触发DOMContentLoaded 事件
  • async是无序的,而 defer有序

参考

你真的了解回流和重绘吗

@shuch shuch added the browser 浏览器相关 label Jun 23, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
browser 浏览器相关
Projects
None yet
Development

No branches or pull requests

1 participant