网页渲染的几个相关问题整理

299 阅读3分钟

从地址栏输入url到页面渲染发生了什么

  1. 根据 url 进行 dns 解析,获取主机 ip
  2. 根据主机 ip 请求服务器,建立连接(TCP。三次握手连接/四次挥手断连)。https 会增加 TSL(SSL) 连接。
  3. 从服务器获取对应文件。 第一次直接从服务器读取,后续同 url 请求会根据设置的缓存机制决定是否从缓存读取。
  4. 获取 HTML 文件,构建 DOM 树。通常请求的是 HTML 文件,然后根据文件中的 link 获取 CSS 及 JS 文件。解析过程是边下载边解析。
  5. 获取相关资源文件(CSS 及 JS)
  6. 根据 CSS 文件构建 CSSOM 树。边下载边解析。
  7. 根据 DOM 树及 CSSOM 树构建渲染树,设置样式。主要是将对应的 CSS 样式赋给对应的 DOM 节点。
  8. 构建布局树。确定节点渲染位置,以及隐藏 “display: none” 节点。
  9. 构建分层树。主要是构建 z 轴层级关系。
  10. 将分层树块化利用光栅找到视图窗口下对应的位图,主要是避免渲染视窗外的部分,提升性能。
  11. 渲染进程渲染页面

JS 及 CSS 引入顺序的差异

CSS 放在 head 中,JS放在 </body> 前。

优点:

  • 防止 JS 解析阻碍树的构建
  • 防止在 JS 中获取不到对应的 DOM 节点

缺点:

  • JS 解析时间过长依旧会影响整个系统的响应时间。

什么是重绘/重排,以及如何避免

重绘: 指同布局下对 DOM 节点的样式修改导致的浏览器重新绘制。

重排: 指会改变 DOM 节点结构的样式修改操作。修改节点的宽高及位置等会引起浏览器对整个布局的重新计算。

重绘影响较小,重排影响较大。

避免方式

js 尽量减少对样式的操作,能用 css 完成的就用 css
对 dom 操作尽量少,能用 createDocumentFragment 的地方尽量用
如果必须要用 js 操作样式,能合并尽量合并不要分多次操作
resize 事件 最好加上防抖,能尽量少触发就少触发 加载图片的时候,提前写好宽高

作者:杰杰的风
链接:juejin.cn/post/688884…

重点在于减少 JS 对 DOM 及样式的操作频率及操作次数。

浏览器缓存机制

缓存方式

协商缓存及强缓存两种。前者是通过请求头来“商量”什么时候直接从缓存读取即可,什么时候从服务器重新获取。后者是强制从缓存中读取。

实现方式

缓存控制请求头

cache-control

  • max-age: 缓存过期时间,是一个相对时间
  • public: 表示客户端和代理服务器都会缓存
  • private: 表示只在客户端缓存
  • no-cache: 协商缓存标识符,表示文件会被缓存但是需要和服务器协商
  • no-store: 表示文件不会被缓存

强缓存

http1.0 中设置 Expires 为绝对值。http1.1 中设置 max-age:600。

协商缓存

  • Last-Modified/if-Modified-Since
    对比改动时间,来决定是否重新从服务器获取。精度为秒级

  • Etag/If-None-Match
    根据文件内容生成标记,对比标记决定是否重新获取。

缓存位置

  • from memeory cache
  • from dist cache
  1. 大文件缓存至 dist,需要再读取,小文件缓存至内存中。
  2. css 一般不常变化,一般存dist。
  3. 具体情况由浏览器决定。