预加载/预获取指南 - 资源提示选择
根据资源类型和加载场景,推荐使用preload、prefetch还是preconnect标签。
UD5工具箱
| # | 资源URL | 类型 | 持续时间 | DNS | TCP | 请求耗时 | 响应耗时 | 传输大小 | 协议 |
|---|---|---|---|---|---|---|---|---|---|
| 正在加载数据... | |||||||||
暂无统计数据
Resource Timing API 是 Web Performance API 的一部分,它提供了网页加载的每个资源(如图片、CSS、JS、XHR请求等)的详细网络计时信息。通过 performance.getEntriesByType('resource') 可以获取所有这些计时数据,包括DNS解析时间、TCP连接时间、请求响应时间等,帮助开发者分析和优化页面性能。
浏览器为 Resource Timing 条目维护一个有限大小的缓冲区(默认通常为 250条)。当页面加载大量资源(如大型SPA应用、包含许多图片的页面)时,超过缓冲区容量的计时条目会被丢弃,导致无法获取完整的性能数据。通过 performance.setResourceTimingBufferSize(n) 可以调整缓冲区大小,通过监听 resourcetimingbufferfull 事件可以在缓冲区满时采取措施(如增大缓冲区或发送数据到服务器)。
可以通过 transferSize 属性判断:如果 transferSize === 0 且资源成功加载(status为200或304),说明资源来自缓存(本地缓存或Service Worker缓存)。如果 transferSize > 0,则是从网络传输的实际大小。注意:跨域资源如果没有 Timing-Allow-Origin 响应头,transferSize 也会是0。
处理策略有3种:
1️⃣ 增大缓冲区:调用 performance.setResourceTimingBufferSize(newSize) 设置更大的值。
2️⃣ 清空缓冲区:调用 performance.clearResourceTimings() 清空后再收集新数据(注意旧数据会丢失)。
3️⃣ 主动收集:在事件触发前定期调用 performance.getEntriesByType('resource') 获取数据并存储到自己的数组中,然后清空缓冲区。
推荐做法:在事件中先增大缓冲区,同时将当前数据发送到分析服务器。
常见原因:
• 跨域资源:如果没有 Timing-Allow-Origin 响应头,详细计时(DNS、TCP、请求响应时间等)会被归零,只有 startTime 和 duration 可用。
• 缓存命中:从缓存加载的资源网络阶段时间为0。
• HTTP/3或QUIC:某些连接阶段不适用(如 secureConnectionStart 在非HTTPS下为0)。
• 同源重定向:重定向相关时间可能为0。
PerformanceObserver 是更高效的方式,可以实时接收新的资源计时条目而不需要轮询:const observer = new PerformanceObserver((list) => {
list.getEntries().forEach(entry => {
// 处理新的resource timing条目
});
});
observer.observe({ type: 'resource', buffered: true });
其中 buffered: true 参数可以获取调用前已存在的条目。在现代浏览器中推荐使用此方式。
Navigation Timing(通过 performance.getEntriesByType('navigation') 或 performance.timing)只记录主页面的加载计时,包括重定向、DNS、TCP、DOM解析、DOMContentLoaded、Load事件等。
Resource Timing 记录页面中每一个子资源(图片、脚本、样式、XHR等)的加载计时。两者结合可以全面分析页面性能。
根据资源类型和加载场景,推荐使用preload、prefetch还是preconnect标签。
对一个耗时函数应用记忆化,展示相同输入下第二次调用速度的提升和缓存命中。
输入第三方域名,生成<link rel='preconnect'>或dns-prefetch等资源提示标签。
提取当前页面Performance API的navigation、resource与paint数据,可视化展示加载各阶段时长。
对localStorage和IndexedDB的读写操作进行计时,比较两者性能差异。
上传或粘贴 source map 文件,展示原始代码与编译后代码的对应关系,辅助调试。
输入 HTML,模拟浏览器的预加载扫描器,列出将提前请求的资源。
将上传的小文件或文本转换为可直接嵌入HTML/CSS的data: URI格式。
拖放小图片或文本文件,转换为可嵌入HTML/CSS的Data URI,设置MIME类型。
连续输入头脑中的杂念,提交后基于关键词自动归类,清空大脑。
创建多个存储桶并设置不同的持久化策略,管理数据生命周期。
演示如何使用TextEncoderStream和TextDecoderStream分批对大文本进行编码和解码。
输入同一数据源的两种 API 响应,并排展示结构差异,理解两种风格的数据组织。
导入 Postman Collection JSON 文件,按顺序执行请求并显示响应,模拟简单的自动化测试。
通过PerformanceObserver获取首次绘制(FP)和首次内容绘制(FCP)时间。
使用现代浏览器文件系统访问API打开、编辑并保存本地文件,演示权限流程。
展示 navigator.connection 提供的有效连接类型(4g/3g/2g)、下行速度和往返时间。
实时查看当前域名下所有localStorage键值对,支持编辑、删除和导出,前端调试利器。
拖拽构建阶段与任务,配置触发条件,生成对应的GitLab CI或GitHub Actions YAML代码。
在线URL编码解码工具,支持将字符串进行encodeURIComponent/decodeURIComponent处理,适用于参数传递。
输入长 URL,通过 TinyURL 或类似 API 生成短链接,并可复制或生成 QR 码。
添加多个周期任务和一次性延迟任务,在时间轴上观察其调用过程,学习JS定时器。
支持多层递归解码及批量URL编码操作,自动识别已编码字符,适合复杂参数解析与网络调试。
通过滑块调节LCP、FID、CLS等指标值,实时显示对应的谷歌核心网页指标评分与颜色。
编辑RAML定义,实时渲染资源结构、方法及响应示例,适合REST API设计初期。
为外部 JavaScript/CSS 文件计算 SHA-256/384/512 哈希并生成完整的 integrity 属性代码。
粘贴以data:开头的链接,自动判断MIME类型并预览内容,或提供下载按钮。
模拟 prefers-contrast: more/less 媒体特性,预览页面在高对比度模式下的视觉效果。
进行比特、字节、千字节、兆字节、吉字节等数字存储单位的快速换算,支持十进制和二进制前缀。
添加楼层请求,观察电梯在不同调度算法下的移动轨迹和等待时间。