页面白屏原因与优化

分析页面加载白屏的原因及优化方案

问题

导致页面加载白屏时间长的原因有哪些,如何进行优化?

解答

什么是白屏时间

白屏时间是指用户点击链接或输入 URL 后,从屏幕空白到显示第一个画面的时间。白屏时间越短,用户体验越好,可以有效降低跳出率,提升页面留存率。

页面加载过程

从输入 URL 到页面展示的完整流程:

  1. 浏览器地址栏输入 URL
  2. 检查浏览器缓存、系统缓存、路由器缓存,有缓存则直接显示
  3. DNS 解析,获取服务器 IP 地址
  4. 建立 TCP 连接(三次握手)
  5. 发送 HTTP 请求
  6. 服务器处理请求并返回数据
  7. 浏览器接收 HTTP 响应
  8. 解析 HTML 源码
  9. 构建 DOM 树、解析 CSS 样式、执行 JS,最终渲染页面

浏览器渲染机制

浏览器下载 HTML 后的处理流程:

  1. 解析头部代码,下载样式表
  2. 继续解析 HTML,构建 DOM 树,同时下载样式
  3. DOM 树构建完成后,开始构建 CSSOM 树
  4. 两棵树构建完毕后,构建渲染树
  5. 进行页面绘制

阻塞情况:

  • 内联 JS 代码会阻塞 DOM 树构建
  • CSS 文件未下载完成时,会阻塞 JS 执行
  • JS 执行被阻塞时,HTML 解析也会暂停

JavaScript 会阻塞 DOM 生成,样式文件会阻塞 JavaScript 执行,因此需要重点关注 JS 文件和样式表文件的加载顺序。

优化方案

1. DNS 解析优化

  • 启用 DNS 缓存
  • 使用 DNS 预加载策略
  • 选择稳定可靠的 DNS 服务器

2. TCP 网络链路优化

  • 使用 CDN 加速
  • 选择更优质的网络服务

3. 服务端处理优化

  • 使用 Redis 缓存
  • 优化数据库查询
  • 启用 Gzip 压缩
  • 优化中间件配置

4. 浏览器渲染优化

  • 精简 HTML 代码和结构
  • 优化 CSS 文件和结构
  • 合理放置 JS 代码,避免使用内联 JS
  • 将首屏关键 CSS 内联到 HTML 中
  • 延迟加载首屏外的图片

图片懒加载实现:

// 获取屏幕可视区域高度
const viewHeight = document.documentElement.clientHeight;

// 获取元素相对于文档顶部的高度
const offsetTop = element.offsetTop;

// 判断元素是否在首屏
if (offsetTop < viewHeight) {
  // 优先加载首屏图片
  loadImage(element);
}

关键点

  • 白屏时间主要受 DNS 解析、TCP 连接、服务器响应、浏览器渲染四个环节影响
  • JS 会阻塞 DOM 构建,CSS 会阻塞 JS 执行,需要优化加载顺序
  • 将首屏关键 CSS 内联到 HTML 可以加快首屏渲染
  • 使用图片懒加载,优先加载首屏可见内容
  • 服务端优化包括缓存、压缩、数据库优化等多个方面