资源加载优先级
浏览器根据资源的重要性自动分配加载优先级。了解浏览器资源优先级机制并使用 fetchpriority 属性进行微调,可以显著提升页面加载性能。本节将详细介绍浏览器资源优先级的分类、默认行为,以及如何通过 HTML 属性控制资源加载顺序。
前置知识
阅读本节前,建议先了解:关键渲染路径
浏览器资源优先级
默认优先级分类
| 优先级 | 说明 | 典型资源 |
|---|---|---|
| Highest | 最高 | CSS、主文档(HTML) |
| High | 高 | 首屏图片、关键字体 |
| Medium | 中 | 异步加载的图片、预加载资源 |
| Low | 低 | 预取(prefetch)资源 |
| Auto | 自动 | 默认的优先级 |
各资源类型的默认优先级
| 资源类型 | 默认优先级 | 阻塞渲染? |
|---|---|---|
<link rel="stylesheet"> | Highest | 是 |
<script>(同步) | Highest | 是 |
<script defer> | High | 否 |
<script async> | Low | 否 |
<img>(首屏) | High | 否 |
<img>(视口外) | Low | 否 |
<img loading="lazy"> | Low | 否 |
<link rel="preload"> | High | 取决于 as |
<link rel="prefetch"> | Low | 否 |
fetchpriority 属性
fetchpriority 属性可以覆盖浏览器对资源加载优先级的自动判断。
语法
html
<img src="hero.jpg" alt="首屏大图" fetchpriority="high" />
<img src="gallery-1.jpg" alt="图片" fetchpriority="low" loading="lazy" />属性值
| 值 | 说明 | 使用场景 |
|---|---|---|
high | 高优先级 | 首屏图片、关键字体 |
low | 低优先级 | 非首屏图片、延迟加载 |
auto | 自动(默认) | 浏览器自行判断 |
使用场景
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>资源优先级示例</title>
</head>
<body>
<!-- 首屏 Hero 图片:高优先级 -->
<img src="hero-banner.jpg" alt="首屏横幅" fetchpriority="high" />
<!-- 非首屏内容图片:低优先级 + 懒加载 -->
<img src="content-image-1.jpg" alt="内容图片" fetchpriority="low" loading="lazy" />
<img src="content-image-2.jpg" alt="内容图片" fetchpriority="low" loading="lazy" />
<!-- 背景装饰图片:低优先级 -->
<img src="background-pattern.png" alt="" role="presentation" fetchpriority="low" loading="lazy" />
</body>
</html>各元素的优先级控制
img 标签
html
<!-- 首屏关键图片:高优先级 -->
<img
src="hero-image.jpg"
alt="首屏图片"
fetchpriority="high"
width="1200"
height="630"
/>
<!-- 首屏以下图片:低优先级 + 懒加载 -->
<img
src="below-fold.jpg"
alt="内容图片"
fetchpriority="low"
loading="lazy"
width="800"
height="600"
/>
<!-- LQIP(低质量占位图)先加载,高清图后加载 -->
<img src="hero-blur.jpg" alt="首屏图片" fetchpriority="high" />script 标签
html
<!-- 高优先级关键脚本 -->
<script src="critical.js" fetchpriority="high"></script>
<!-- 低优先级非关键脚本 -->
<script src="analytics.js" fetchpriority="low" defer></script>link 标签
html
<!-- 高优先级预加载关键字体 -->
<link rel="preload" href="/fonts/main.woff2" as="font" type="font/woff2" crossorigin fetchpriority="high" />
<!-- 低优先级预取下一页资源 -->
<link rel="prefetch" href="/next-page/data.json" fetchpriority="low" />iframe 标签
html
<!-- 高优先级:首屏嵌入的 iframe -->
<iframe src="embedded-widget.html" fetchpriority="high"></iframe>
<!-- 低优先级:非首屏的 iframe -->
<iframe src="comment-section.html" loading="lazy" fetchpriority="low"></iframe>实战示例:首屏加载优化
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>资源加载优先级优化</title>
<!-- 关键 CSS 内联 -->
<style>
body { margin: 0; font-family: sans-serif; }
.hero { position: relative; height: 60vh; overflow: hidden; }
.hero img { width: 100%; height: 100%; object-fit: cover; }
.content { padding: 2rem; max-width: 800px; margin: 0 auto; }
</style>
<!-- 预加载关键字体 -->
<link rel="preload" href="/fonts/main.woff2" as="font" type="font/woff2" crossorigin fetchpriority="high">
<!-- 预连接到 CDN 域名 -->
<link rel="preconnect" href="https://cdn.example.com" fetchpriority="high">
<!-- 非关键 CSS 异步加载 -->
<link rel="preload" href="/styles/main.css" as="style" onload="this.onload=null;this.rel='stylesheet'" fetchpriority="low">
</head>
<body>
<header class="hero">
<!-- 首屏大图:高优先级 -->
<img
src="https://cdn.example.com/images/hero-banner.jpg"
alt="首页横幅"
fetchpriority="high"
width="1200"
height="600"
/>
</header>
<main class="content">
<h1>资源加载优化示例</h1>
<p>首屏内容优先加载,非首屏内容延迟加载。</p>
<!-- 非首屏图片:低优先级 + 懒加载 -->
<img
src="https://cdn.example.com/images/content-1.jpg"
alt="内容图片"
fetchpriority="low"
loading="lazy"
width="800"
height="400"
/>
<img
src="https://cdn.example.com/images/content-2.jpg"
alt="内容图片"
fetchpriority="low"
loading="lazy"
width="800"
height="400"
/>
</main>
<!-- 非关键脚本:低优先级 + defer -->
<script defer fetchpriority="low" src="/scripts/analytics.js"></script>
<script defer fetchpriority="low" src="/scripts/non-critical.js"></script>
</body>
</html>注意事项
- 不要滥用 fetchpriority="high":过多高优先级资源会导致带宽竞争
- 配合 loading="lazy" 使用:非首屏图片使用低优先级+懒加载
- 设置 width 和 height:防止图片加载导致的布局偏移(CLS)
- 使用预加载提示:配合 preload/preconnect 提升关键资源加载速度
最佳实践
- 首屏关键图片设置
fetchpriority="high" - 非首屏图片设置
fetchpriority="low"+loading="lazy" - 非关键脚本设置
fetchpriority="low"+defer - 关键字体使用
preload+fetchpriority="high" - 为所有图片设置
width和height防止 CLS - 使用 Chrome DevTools Network 面板检查资源优先级
下一节
继续学习:延迟与异步加载