JavaScript PerformanceObserver.supportedEntryTypes 检查浏览器可用性能条目的配置方法
跨浏览器使用 PerformanceObserver 时,不要先假定所有用户代理都支持同一组性能条目。更稳妥的做法是先读取 PerformanceObserver.supportedEntryTypes,把业务真正需要的类型与支持列表求交集,再决定是否调用 observe()。这样既能避开无效的 entryTypes,也能把“不支持该指标”与“指标暂时没有数据”区分开。
supportedEntryTypes只说明用户代理支持哪些条目类型,不保证当前页面已经产生数据。- 一次观察多个类型使用
entryTypes;需要buffered或durationThreshold时使用单一type。 - 能力探测结果为空时应跳过观察,不能用改写字符串或混合参数来“凑”出兼容配置。
先把支持列表和业务需求求交集
PerformanceObserver.supportedEntryTypes 返回字符串数组,例如某个浏览器可能支持 navigation、resource 或 paint。列表内容会随浏览器和平台变化,所以代码应把它当作运行时能力信息,而不是写死的兼容性常量。属性本身也可能在较旧环境中不存在,首个判断要覆盖这一层。
const wantedTypes = ["navigation", "resource", "paint"];
// 先确认观察器和能力列表存在,避免旧环境直接读取 undefined
const observerTypes = window.PerformanceObserver?.supportedEntryTypes;
const supportedTypes = Array.isArray(observerTypes) ? observerTypes : [];
// 只保留业务需要且当前用户代理声明支持的类型
const usableTypes = wantedTypes.filter((entryType) =>
supportedTypes.includes(entryType)
);
if (usableTypes.length === 0) {
// 没有可观察类型时保留普通页面逻辑,不把它误报成“没有性能数据”
console.info("当前环境没有可用的性能条目类型");
} else {
// 多类型观察使用 entryTypes;回调只会收到这些类型的条目
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
console.info(entry.entryType, entry.name);
}
});
observer.observe({ entryTypes: usableTypes });
}
这里的交集只回答“能不能尝试观察”。如果列表包含某种类型,不代表该页面一定会产生对应条目,也不代表所有相关字段在不同浏览器中都完全一致。回调内仍应按 entry.entryType 分支处理,并把缺少条目视为正常结果,而不是直接抛出业务错误。

按观察任务选择 entryTypes 或 type
只想同时监听多个普通类型时,使用 observe({ entryTypes: [...] })。但 buffered 和 durationThreshold 只能与单个 type 配合,不能和 entryTypes 混写。需要回放观察开始前已经进入性能时间线的条目时,也要确认目标类型支持缓冲读取。
function observeOne(type, options = {}) {
const supported = window.PerformanceObserver?.supportedEntryTypes ?? [];
// 单类型配置前再次检查,避免把不支持的 type 交给浏览器
if (!Array.isArray(supported) || !supported.includes(type)) {
return false;
}
const observer = new PerformanceObserver((list) => {
// 只处理当前 type,避免回调混入其他观察任务的判断
for (const entry of list.getEntries()) {
console.info(`${type}: ${entry.name}`);
}
});
// buffered、durationThreshold 等单类型选项必须跟 type 一起使用
observer.observe({ type, ...options });
return true;
}
// 需要读取已经存在的 resource 条目时,使用单一 type
observeOne("resource", { buffered: true });
如果只是多类型订阅,不要为了使用 buffered 把数组拆成多次不必要的观察;如果确实要读取历史缓冲条目,则应按类型分别调用并分别记录结果。另一个容易忽略的点是:entryTypes 与 type 不能同时提供,后者也不能一次写入多个逗号分隔的类型。

空交集和不支持类型怎样降级
降级策略应由业务目标决定。性能观测通常是增强能力,最安全的默认动作是跳过该观察,不阻塞页面主流程;如果产品确实需要某项数据,则可以记录一次低噪声的能力缺失事件,或切换到已有的普通计时方案,但不能把替代数据冒充成同一种 PerformanceEntry。
| 检查结果 | 建议动作 |
|---|---|
| 属性不存在 | 视为无法做精确能力探测,跳过可选观测或走兼容分支。 |
| 属性存在但目标类型不在列表 | 不要调用该类型的观察配置,避免把不支持能力当成无数据。 |
| 交集包含多个类型 | 用 entryTypes 一次观察,并在回调按 entryType 分支。 |
| 需要 buffered 或 durationThreshold | 改用单个 type,不要和 entryTypes 混用。 |
常见问题
supportedEntryTypes 返回支持列表就一定有对应条目吗?
不一定。它描述用户代理支持的类型,页面是否已经产生条目还取决于导航、资源加载和页面行为。
能不能直接把所有类型写入 entryTypes?
不建议。先求交集可以减少无效配置,也能让代码明确区分“不支持”和“当前没有数据”。
为什么 buffered 配置要改用 type?
规范化的观察接口把 buffered 和 durationThreshold 设计为单类型选项,它们不能与 entryTypes 数组同时使用。
JavaScript ResizeObserver 怎样读取 contentBoxSize 尺寸
- 上一篇
- JavaScript ResizeObserver 怎样读取 contentBoxSize 尺寸
- 下一篇
- JavaScript FormData 怎样上传多个同名字段
-
- 文章 · 前端 | 31分钟前 |
- JavaScript CSS.registerProperty 怎样声明可动画自定义属性
- 109浏览 收藏
-
- 文章 · 前端 | 32分钟前 |
- JavaScript URL.canParse 怎样在创建 URL 前判断地址能否解析
- 246浏览 收藏
-
- 文章 · 前端 | 34分钟前 | 前端 · javascript · JavaScript input textarea setRangeText selectionStart selectionEnd
- JavaScript setRangeText 替换文本后怎样保留选区
- 313浏览 收藏
-
- 文章 · 前端 | 35分钟前 |
- JavaScript FormData 怎样上传多个同名字段
- 459浏览 收藏
-
- 文章 · 前端 | 57分钟前 | 前端 · javascript · 浏览器API · JavaScript ResizeObserver ResizeObserverEntry contentBoxSize inlineSize blockSize
- JavaScript ResizeObserver 怎样读取 contentBoxSize 尺寸
- 427浏览 收藏
-
- 文章 · 前端 | 58分钟前 |
- JavaScript Element.getHTML 怎样序列化可序列化的 Shadow DOM
- 257浏览 收藏
-
- 文章 · 前端 | 1小时前 | 前端 · 流式处理 · javascript · JavaScript ReadableStream TransformStream pipeThrough Streams API
- JavaScript TransformStream 怎样组织自定义转换管道
- 402浏览 收藏
-
- 文章 · 前端 | 1小时前 |
- 前端 checkVisibility 返回 true 为什么仍看不到元素
- 258浏览 收藏
-
- 文章 · 前端 | 1小时前 |
- JavaScript URLPattern 怎样匹配带命名参数的路径
- 340浏览 收藏
-
- 文章 · 前端 | 1小时前 |
- JavaScript CompressionStream 怎样把文本流压缩成 gzip
- 489浏览 收藏
-
- 文章 · 前端 | 19小时前 |
- Web Performance Long Tasks 的定位与拆分
- 330浏览 收藏
-
- 文章 · 前端 | 19小时前 | 前端 · 输入校验 表单安全 Next.js Server Actions
- Next.js Server Actions 输入校验的边界
- 114浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 766次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 764次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 845次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 815次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 643次使用
-
- JavaScript函数定义及示例详解
- 2025-05-11 502浏览
-
- 智能体安全引领产业升级——国内AI安全产品市场深度分析
- 2026-08-21 501浏览
-
- CSS变量简化按钮悬停效果技巧
- 2026-05-31 501浏览
-
- JavaScript符号类型详解与应用
- 2026-05-31 501浏览
-
- HTML剪贴板复制粘贴怎么用
- 2026-05-26 501浏览

