首屏优化
文章目录
首屏优化
提醒
很多同学其实都陷入了一个误区,面试问你性能优化,其实并不是要你背性能优化八股文的!
一、性能指标
其中 FP、FCP 都可以用 Performance 工具检测 ,FMP 我们可以自己使用 MutationObserver 来实现
实际意义
FP: 告诉用户"页面开始响应了"
FCP: 告诉用户"页面开始有内容了"
FMP: 告诉用户"页面主要内容出来了"
二、优化策略
1. 减少首屏加载文件资源体积
优化图片:使用合适的图片格式(如 WebP),并对图片进行压缩。确保图片尺寸适合其显示区域,不要使用过大的图片。
延迟加载:使用懒加载(lazy loading)技术,只有在用户滚动到特定区域时才加载相关资源。
精简 CSS 和 JavaScript:
代码压缩:移除代码中的空格、注释和多余字符,减少文件大小。
合并文件:将多个 CSS 和 JavaScript 文件合并为一个文件,减少 HTTP 请求次数。
树摇(Tree Shaking):移除未使用的代码,减少打包文件的体积。
使用 CDN:将静态资源托管在内容分发网络(CDN)上,缩短资源加载的时间。
减少第三方库:评估和移除不必要的第三方库,使用更轻量级的替代方案。
启用浏览器缓存:设置适当的缓存策略,使浏览器能够缓存常用的文件,减少重复加载。
压缩文本资源:启用 Gzip 或 Brotli 压缩,减少 HTML、CSS 和 JavaScript 文件的体积。
服务端渲染和静态生成:使用服务端渲染或静态生成技术,减少客户端渲染的压力。
2. 预加载主要内容
2.1 使用 <link rel="preload"> 标签
预加载关键资源如字体、图片、CSS 和 JavaScript 文件
示例:
html
<link rel="preload" href="styles/main.css" as="style" /> <link rel="preload" href="scripts/main.js" as="script" /> <link rel="preload" href="fonts/myfont.woff2" as="font" type="font/woff2" crossorigin="anonymous" />
2.2 优先加载关键 CSS
将关键 CSS 直接嵌入到 HTML 文件的头部,减少首次渲染的阻塞
示例:
html
<style> /* Critical CSS */ body { margin: 0; padding: 0; font-family: Arial, sans-serif; } </style>
2.3 异步加载和延迟加载 JavaScript
使用
async或defer属性来加载非关键的 JavaScript 文件,避免阻塞 HTML 解析示例:
html
<script src="scripts/main.js" defer></script>
2.4 预加载字体
通过预加载字体资源,避免首次渲染时的字体闪烁(FOIT)
示例:
html
<link rel="preload" href="fonts/myfont.woff2" as="font" type="font/woff2" crossorigin="anonymous" />
2.5 预加载关键图片
对于首屏关键图片,可以使用预加载标签提前加载,确保它们尽快显示
示例:
html
<link rel="preload" href="images/main-image.jpg" as="image" />
2.6 使用 HTTP/2
如果服务器支持 HTTP/2,可以配置服务器在客户端请求 HTML 时推送关键资源
示例:
nginx
location / { http2_push /styles/main.css; http2_push /scripts/main.js; }
3. 预渲染(SSG)
可参考 2 个预渲染库
4. 服务端渲染(SSR)
SSR 的优势 性能优化:
更快的首屏渲染(FCP/FMP) 减少客户端 JavaScript 执行时间 更好的感知性能
SEO 友好:
搜索引擎可直接获取完整内容 更好的社交媒体分享预览
用户体验:
在慢网络环境下表现更好 即使 JavaScript 失效也能显示内容
SSG 和 SSR 的区别
- SSG 示例场景:
博客网站 → 构建时生成所有文章页面 → 部署到 CDN
用户访问 → 直接返回静态 HTML 文件
- SSR 示例场景:
电商网站 → 用户请求商品页面 → 服务器查询数据库 → 生成 HTML 返回
每次请求都是最新数据
详细对比