无需登录 数据私有 本地保存

资源提示标签生成器 - dns-prefetch/preconnect/preload

35
0
0
0
资源提示标签生成器

生成 <link> 资源提示标签,优化页面加载性能

dns-prefetch
DNS预解析
preconnect
预连接
preload
预加载
prefetch
预获取
modulepreload
模块预加载
https://
请输入域名(如 example.com 或 https://example.com)
已生成的标签 0
在左侧生成标签,它们会出现在这里
资源提示知识点

dns-prefetch(DNS预解析)告诉浏览器在后台提前对指定域名进行DNS查询。当用户后续真正访问该域名的资源时,DNS解析已经完成,可以节省约20-120毫秒。

适用场景:页面中引用了第三方域名的资源(CDN、API、图片等),但不确定资源具体路径,只需要提前解析DNS。

示例:<link rel="dns-prefetch" href="https://cdn.example.com">

preconnect 比 dns-prefetch 更全面,它除了DNS解析外,还会预先完成TCP握手和TLS协商(HTTPS)。这意味着连接已经完全建立,后续请求可以立即发送。

代价:preconnect 消耗更多资源,因为需要建立和维护连接。建议只对确定会使用的关键第三方域名使用preconnect(通常不超过4-6个),其他次要域名使用dns-prefetch即可。

最佳实践:preconnect 常与 dns-prefetch 配合作为fallback:
<link rel="preconnect" href="https://api.example.com">
<link rel="dns-prefetch" href="https://api.example.com">

preload 用于强制浏览器提前加载当前页面即将需要的资源,优先级较高。它告诉浏览器"这个资源很重要,尽快下载"。

必须指定 as 属性来告诉浏览器资源类型,这样浏览器才能正确设置优先级和缓存策略。常见as值:script、style、font、image、fetch。

注意:如果预加载的资源在3秒内未被使用,浏览器会在控制台输出警告。因此请确保预加载的资源确实会被用到。

示例:<link rel="preload" as="font" href="/fonts/main.woff2" crossorigin="anonymous">

两者都是预加载资源,但优先级和用途不同:

preload(预加载):用于当前页面确定需要的资源,优先级高,浏览器会尽快下载。在页面加载阶段使用。

prefetch(预获取):用于未来可能需要的资源(如下一页可能访问的页面),优先级低,浏览器在空闲时才会下载。常用于提升下一页的加载速度。

简单记忆:preload = 当前页面马上要用的;prefetch = 将来可能用到的。

modulepreload 是专门用于ES模块的预加载方式。与preload as="script"不同,modulepreload不仅下载模块文件,还会解析和编译模块,并递归处理模块的依赖图。

使用preload加载模块时如果指定type="module",也可以实现类似效果,但modulepreload是更语义化、更高效的选择。

示例:<link rel="modulepreload" href="/js/app.js">

as属性告诉浏览器资源的类型,用于确定请求优先级和缓存策略。完整的可选值包括:

script - JavaScript脚本
style - CSS样式表
font - 字体文件(通常需要crossorigin)
image - 图片资源
fetch - 通过fetch/XMLHttpRequest获取的资源
document - HTML文档
worker - Web Worker
video / audio - 媒体文件
track - 文本轨道(字幕等)
embed / object - 插件资源

CSS的@font-face加载字体时,默认使用CORS(跨域资源共享)模式,即使用户的字体文件和页面在同一域名下。因此,preload字体时也必须添加crossorigin="anonymous"属性,否则浏览器会下载两次字体文件——一次是preload(无CORS),一次是@font-face请求(带CORS),造成浪费。

这是最常见的preload使用陷阱。只要as="font",就建议加上crossorigin="anonymous"。

所有资源提示标签(dns-prefetch、preconnect、preload、prefetch、modulepreload)都应该放在HTML的<head>中,且尽可能靠前放置。这样浏览器可以在解析HTML的早期阶段就发现并开始处理这些提示。

特别地,preload标签应该放在使用该资源的<script><link>标签之前,以确保资源提前开始下载。

可以通过以下方式验证:

1. Chrome DevTools Network面板:查看资源的Initiator列,如果显示为"Other"且带有资源提示类型,说明提示生效。
2. Performance面板:录制页面加载过程,查看网络请求的时间线,可以看到预连接的建立和预加载资源的提前下载。
3. Lighthouse审计:会检查是否正确使用了资源提示。
4. 观察控制台警告:如果preload的资源未被及时使用,浏览器会发出警告。

浏览器对资源提示的处理优先级从高到低:

1. preload - 最高优先级,浏览器会立即开始下载
2. preconnect - 高优先级,尽快建立连接
3. dns-prefetch - 中优先级,在空闲时进行DNS解析
4. prefetch - 最低优先级,仅在浏览器完全空闲时下载

modulepreload的优先级类似于preload,但专门针对ES模块。建议不要过度使用preload,通常2-4个关键资源即可,过多会稀释优先级。