指纹

Device Memory API 与 Web 性能:安全使用内存提示

了解 navigator.deviceMemory 能告诉 Web 应用什么、不能告诉什么,以及如何渐进式调整资源并遵守隐私边界。

文档中心

想直接进入 指纹 文档吗?

这篇文章属于博客内容库。若你要步骤化配置、参考说明和持续更新,请直接进入对应 docs 分区。

navigator.deviceMemory 是帮助 Web 应用选择保守资源方案的粗略提示。它不是内存清单、性能基准,也不是识别用户的依据。把它当作可选输入,与运行时结果结合,并为不提供该属性的浏览器保留可用默认方案。

根据可选内存提示渐进调整 Web 资源

Device Memory API 表示什么

Device Memory API 通过 navigator.deviceMemory 暴露以 GB 为单位的近似设备内存。W3C 规范描述的是经过降低精度和分桶的值,而非精确测量。浏览器可能在返回前进行取整或封顶,因此代码应把它解释为宽泛的能力提示。

这个属性适合在已有资源变体之间做选择,例如延迟加载大图、缩小初始缓存或选择更轻的客户端任务。它不表示当前可用的空闲内存,也不能预测页面是否一定完成。内存提示还不能说明存储配额、CPU 速度、网络质量或用户偏好。

可用性与限制

支持并不普遍。MDN 将 Navigator.deviceMemory 标为实验性且支持有限的功能,浏览器可能完全不提供它,或只在安全上下文中提供。代码必须先检测属性,在缺失时继续工作,不能把缺失值当成低内存。

该值有意保持不精确,也可能受浏览器策略影响。不要把它用作兼容性门槛、权益检查或给设备和用户贴标签的阈值。不能从一个分桶值推断型号、收入、位置或身份。它只是多个隐私敏感表面之一,不是可靠的设备画像。

面向实际负载的渐进调整

先设计不依赖 API 也能工作的基础体验。若提示可用,可据此选择有界的资源变体,再用加载完成、解码失败、长任务和用户取消等普通应用指标观察结果。这些信号比静态硬件估计更能描述当前任务。

一次只调整一种成本,并让决策可回退。例如延迟加载首屏以下媒体、选择较小预览、减少并行 Worker,或推迟可选索引。保持相同的语义内容和无障碍控件。不能仅因提示缺失或较小就移除必需操作。

关于长期浏览器负载的实测预算,可参阅 BrowserContext 容量规划指南。关于浏览器能力决策的回退优先模式,可参阅 WebGL 能力与隐私指南;配置文件中的存储与内存信号则说明了为何不能混淆不同资源值。

尊重隐私的回退方案

把提示限制在实际需要它的决策中。不要把原始值发送到服务器、加入账户标识或作为稳定画像长期保存,除非产品功能确实需要且已清楚说明。粗略值与其他信号结合后仍可能增加指纹识别能力。

优先使用少量资源策略和明确的默认值,并说明该选择只是启发式。尊重省流量等用户设置,并在可行时允许用户请求完整体验。如果调整会改变数据传输,应在发生前解释,并保留可访问的继续方式。

在正确的层使用提示

该 API 应用于展示或调度决策,不应进入身份、授权或计费逻辑。页面可以根据宽泛提示延迟可选预览,而服务器继续执行相同权限并返回必需记录。这样可避免浏览器缺少功能时意外造成访问失败。

不要让服务器依赖可能缺失、取整不同或受策略影响的 JavaScript 值。若服务需要资源偏好,应发送短期且对用户可见的选择,例如“已启用省流量”,而不是原始内存分桶。

结合能力与结果信号

内存只是负载的一部分。低内存提示不证明页面慢,高提示也不保证大包安全。网络延迟、解码成本、CPU 调度、存储压力、屏幕尺寸和用户设置都可能主导结果,应测量用户真正关心的结果。

媒体可观察首张有意义图片是否解码、播放是否开始、用户是否重试;编辑器可观察输入延迟、保存完成和后台恢复。这些指标能指导策略而不把提示变成永久标签。

先设计基础体验

基础体验应包含必需内容、键盘访问、可读文本和重试可选工作的方式。精简变体可以延迟增强,但不能隐藏完成任务的唯一方式。加载状态应诚实说明可选预览仍在加载。

在属性缺失、读取延迟和浏览器返回宽泛分桶时测试基础体验,也测试用户在会话中改变省流量设置的情况。目标是每条分支都能优雅工作,而非完美预测硬件。

选择经得起变化的资源策略

优先采用能跨浏览器版本保持有效的选择:响应式图片、延迟加载、流回压、有界缓存和取消。即使 API 不可用,它们也能减轻网络或电池受限用户的压力。

让变体易于移除。少量名为基础、精简和增强的策略比许多设备分支更易审计;每个策略应说明媒体上限、并发、缓存行为和恢复动作。

日志与留存

应用日志应记录所选策略和结果,而不是不必要的硬件值。resource_policy=reduced 通常足以解释预览为何延迟。若调试暂时需要原始属性,应限制访问、缩短留存并在事件结束后删除字段。

分析也应遵循最小化原则。按应用选择的策略聚合完成率和失败率,不要建立按内存类别排序个人的面板。团队可从结果改进体验而不创建新的跨会话标识。

发布前的复查问题

确认 navigator.deviceMemory 未定义时体验仍完整;必需请求、权限或账户路径不依赖该值;用户能理解并覆盖可选精简;日志、分析和支持导出默认不保留原始提示。

浏览器更新或页面重大变化后重复检查。API 契约可能稳定,但负载内存行为会变。删除属性运行的小型回归测试通常比大量猜测设备类别更有价值。

在不假定浏览器家族的情况下测试可用性

特性检测应是应用中的普通分支,而不是浏览器名称判断。只有在相关 API 存在时读取属性;值为 undefined 时仍使用相同的基础方案。安全上下文、隐私浏览、嵌入框架策略或浏览器设置都可能独立影响可用性。

在支持的环境中测试该分支。测试应确认必需内容和控件仍然可用,而不是要求返回某个固定分桶。浏览器更新可能改变暴露方式或取整策略,因此兼容性测试应关注行为。

将内存提示与性能预算分开

内存提示可以选择起始策略,但性能预算是针对工作负载测量的运行承诺。提示属于页面决策;预算属于版本、主机类别、工作负载版本和观测窗口。这样可以避免旧设备值取代新的容量证据。

页面超出预算时,先检查生命周期、媒体、Worker、缓存和网络,再改变内存策略。泄漏或过大的响应会影响所有设备类别;反之,内存达标时 CPU 或调度仍可能造成输入延迟。

以用户意图为最终依据

资源调整不应覆盖明确的用户选择。用户请求打开完整文档时,可以解释成本并提供渐进加载,但不能静默降级内容。省流量偏好很有用,但它不同于内存估计,应单独处理。

为可选增强提供可见的重试方式,并说明为何延迟。不要仅为选择小图而请求收集硬件值;如果传输昂贵,应使用用户能理解的大小或模式选项。

避免跨会话关联

最尊重隐私的用法是临时使用。渲染当前任务时读取,状态中只保留资源策略,然后丢弃原始值。不要把它与用户 ID、IP 历史、Canvas、字体列表或计时记录组合成更完整的画像。

支持人员需要上下文时,记录策略、浏览器版本和可复现工作负载,而不是内存分桶。聚合报告可以比较基础和精简策略的完成率,同时不追踪跨会话的个人。

规划变化与恢复

资源策略应有负责人、回滚条件和复查日期。浏览器版本、页面包、媒体集或主机类别变化时,重新运行代表性负载。不要假定名为“精简”的策略永远成本相同;在新证据出现前保留基础路径。

恢复也是性能的一部分。用户离开时取消可选任务,预览关闭后释放临时缓冲,并避免压力期间不断重试。这些控制对所有内存类别都有效。

记录公开边界

产品文档应说明该 API 是近似且可选的提示,应用保留基础路径;也应说明它不测量空闲内存、不保证性能、不识别设备、不授权账户。清晰表述能防止兼容功能变成隐藏画像。

记录两条公开来源。W3C 规范支持降精度值与隐私理由,MDN 支持可用性警告。支持行为变化时更新兼容性说明并重新测试回退,而不是增加更强断言。

实现复查还应覆盖每个可选资源的失败路径:图片取消后文字替代和布局仍可用,Worker 无法启动时主线程提供进度或更简单操作,缓存无法分配时使用有界请求而不是反复分配。有限提示看不到瞬时压力、其他标签页或当前文档成本,因此需要用小型合成流程验证首次加载、返回、前后台切换、中断传输和正常关闭。记录完成、取消、输入延迟和恢复,不记录页面内容或账户标识。这样既能改进资源选择,又能让 Device Memory API 保持为可回退的有限信号。

多产品团队可以统一策略名称和含义,再按工作负载调整限制。文档查看器可能缩小预览,协作编辑器可能减少后台索引,但支持人员仍可使用同一个“精简”策略名称。发布用户能理解的行为,不要发布选择它的内存分桶。这样便于无障碍复查,也能在浏览器更新改变提示时保持运维信号稳定。证据不足时应保留更简单的策略,而不是收集更多识别数据。

复查记录保持小而可复现:策略定义、工作负载名称、浏览器版本和结果字段通常已足够。复查者应能在不访问私有客户页面的情况下重跑流程,同时保留后续版本比较所需的证据。

生产复查还应记录提示不可用时显示了哪一种回退,以及用户能否不改变设置就继续完成任务。这样能把 API 决策和实际体验连接起来:较小图片、延迟预览或较少 Worker 都应易于理解并可以恢复。相比保留原始硬件分桶,这种行为证据更有价值,也便于浏览器或工作负载更新后复查。

如果服务端需要解释资源选择,只记录短期策略名称和任务结果即可。不要把内存提示发送为账号属性;这样既能支持回滚和排障,也能避免把一次性的兼容性决定变成跨会话画像。

实用决策清单

  1. 先检测 navigator.deviceMemory,绝不假定支持。
  2. 定义不依赖该提示的基础体验。
  3. 使用宽泛、可回退的资源变体,不给设备分类。
  4. 测量任务结果,根据实际失败调整预算。
  5. 除非用户理解用途,否则不要把该值放入标识符、日志或远程请求。

来源

#Device Memory API#Web 性能#渐进增强#隐私

让 BotBrowser 从研究走向生产

先用这些指南理解模型,再进入跨平台验证、隔离上下文和面向规模化的浏览器部署。