设备内存 API

W3C 工作草案,

关于本文档的更多信息
该版本:
https://www.w3.org/TR/2026/WD-device-memory-1-20260330/
最新发布版本:
https://www.w3.org/TR/device-memory/
编辑草案:
https://www.w3.org/TR/device-memory/
之前版本:
历史记录:
https://www.w3.org/standards/history/device-memory-1/
反馈:
GitHub
编辑:
(Google)
(Microsoft)
前编辑:
Shubhie Panicker (Google)

摘要

本文档定义了一个 HTTP 客户端提示(Client Hint)头和一个 JavaScript API,用于公开设备的内存能力 (设备内存),以便让 Web 应用根据设备内存限制自定义内容。

本文档状态

本节描述了本文档在发布时的状态。 当前 W3C 出版物列表和本技术报告的最新修订版可在 W3C 标准与草案索引中找到。

本文档由 Web 性能工作组(Web Performance Working Group)推荐规范流程 作为工作草案发布。 作为工作草案发布,并不代表 W3C及其成员的认可。

这是一个草案文档,可能会随时被更新、替换或废弃为其他文档。 除了作为进行中的工作之外,引用此文档并不合适。

关于本规范的讨论,建议使用 GitHub Issues

本文件受 2025年8月18日 W3C 流程文件 管理。

本文件由按 W3C 专利政策运作的组织出品。 W3C 维护与本组交付物相关的 公开专利披露列表; 该页面还包括了披露专利的说明。 若个人确实知晓某专利并认为包含基本专利权要求, 必须按 W3C 专利政策第6节进行披露。

1. 简介

设备类别信号被用于多种原因,包括:

基于公开的User-Agent以及客户端其他特征进行设备识别与分类,常用于选择并提供优化的内容。这类方案往往依赖于商业设备数据库,而这些数据库价格昂贵,集成困难且维护成本高。

本规范定义了(客户端提示)头字段JavaScript API,它们公开了近似的设备内存(RAM)信息,以无需设备数据库的方式满足这些需求。

2. 计算设备内存值

用户代理deviceMemory 按如下步骤计算:
  1. physicalDeviceMemory为物理内存字节数。

  2. minimumLowerBound实现自定义的最低边界。

  3. maximumUpperBound实现自定义的最大边界。

  4. deviceMemory等于physicalDeviceMemory/1024.0。

  5. power为0。

  6. deviceMemory大于1时循环:

    1. 按位右移deviceMemory一位。

    2. power加1。

  7. lowerBound为2的power次方。

  8. upperBound为2的|power + 1|次方。

  9. 如果physicalDeviceMemorylowerBoundupperBoundphysicalDeviceMemory,则deviceMemory的值为lowerBound

  10. 否则deviceMemory的值为upperBound

  11. 如果deviceMemory < minimumLowerBound,则deviceMemoryminimumLowerBound

  12. 如果deviceMemory > maximumUpperBound,则deviceMemorymaximumUpperBound

  13. 返回deviceMemory

本算法允许实现自定义的最大边界和最小边界。这两个边界范围应包含大部分设备的内存值,但应排除罕见的内存值以减少设备指纹风险。实现可随着时间调整这些边界,这些边界在不同类型设备间也可不同。

3. Sec-CH-Device-Memory(客户端提示)头字段

Sec-CH-Device-Memory头字段是HTTP客户端提示头。它是结构化头值,包含一个,其值为十进制数,用于指示客户端大致拥有的设备内存(RAM)容量(单位:GiB)。

如果`Sec-CH-Device-Memory`头字段在一个消息中出现多次,则最后一个值覆盖所有先前出现的值。

该`Sec-CH-Device-Memory`头字段的ABNF(扩充巴克斯-诺尔范式)语法如下:

Sec-CH-Device-Memory = sf-decimal

`Sec-CH-Device-Memory`的值应设置为用户代理deviceMemory

3.1. 客户端提示示例

服务器通过`Sec-CH-Device-Memory`HTTP客户端提示,使用Accept-CH头字段或带http-equiv属性的等效HTML meta元素来表示支持:
Accept-CH: Sec-CH-Device-Memory

随后,在接收到服务器的上述偏好设置后,兼容的用户代理会通过`Sec-CH-Device-Memory`请求头字段通知设备的内存能力:

GET /example HTTP/1.1
Sec-CH-Device-Memory: 8
...

4. 设备内存JavaScript API

[
    SecureContext,
    Exposed=(Window,Worker)
] interface mixin NavigatorDeviceMemory {
    readonly attribute double deviceMemory;
};

Navigator includes NavigatorDeviceMemory;
WorkerNavigator includes NavigatorDeviceMemory;

NavigatorDeviceMemorydeviceMemory getter 步骤是返回 用户代理deviceMemory

4.1. JavaScript 示例

网页应用可以根据设备内存启用或禁用功能。

注意:网页应用应考虑如何处理不支持该API的浏览器:要么默认启用,要么默认禁用。

const mem = navigator.deviceMemory;

// 如果已知为低内存设备,可禁用功能提升体验
if (mem && mem < 2) {
    // 禁用功能以提升体验
}

// 或者,仅当设备内存未知或已知高于最低要求时才启用功能
if (!mem || mem > 4) {
    // 启用功能以提升体验
}
RUM 解决方案可通过navigator.deviceMemory API查询设备内存,并将其作为补充信息包含在性能 beacon 中,以帮助解释或细分数据。
const mem = navigator.deviceMemory;
const analyticsData = {
    memory: mem;
    ... 其他指标
}
navigator.sendBeacon("/endpoint", analyticsData);

5. 安全与隐私注意事项

`Sec-CH-Device-Memory`客户端提示头和JavaScript API仅适用于HTTPS安全上下文。

为减少指纹识别风险,报告的值会四舍五入到仅保留一位有效比特,而不是上报精确值。此外,实现可能会对上报值施加特定的最大和最小边界。随着常用设备内存特性改变,这些边界也应定期审核。定义这些边界时应考虑设备类型,因为移动设备与台式机、笔记本的特性通常不同。

6. IANA注意事项

本文档定义了`Sec-CH-Device-Memory`HTTP请求头字段,并将其注册到永久消息头字段注册表([RFC3864])。

6.1. Sec-CH-Device-Memory 头字段

头字段名称

Sec-CH-Device-Memory

适用协议

http

状态

standard

作者/变更控制者

IETF

规范文档

本规范(§ 3 Sec-CH-Device-Memory(客户端提示)头字段

7. 致谢

特别感谢前任编辑Shubhie Panicker以及所有贡献者,感谢他们的技术意见和建议,使本规范得以改进。

一致性

文档约定

一致性要求通过描述性断言与 RFC 2119 术语结合表达。 本规范中的规范性部分对于关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”、“OPTIONAL” 需按照 RFC 2119 所述解释。但为便于阅读, 本规范未将这些词全部用大写字母表示。

除被明确标记为非规范性、示例和注意事项外,规范所有文本均为规范性内容。[RFC2119]

规范中的示例以内文“for example”引入,或通过class="example" 方式与规范性文本区分,如下:

这是一个说明性示例。

说明性注释以“Note”开头,通过class="note" 与规范性文本区分,如下:

注意,这是一个说明性注释。

一致性算法

作为算法的一部分呈现的要求(如“去除任何前导空格字符”或“返回 false 并中止这些步骤”)应按照引入算法时使用的关键字(如“必须”、“应当”、“可以”等)解释。

以算法或具体步骤表达的一致性要求可用任何实现方式达成,只要最终效果一致即可。特别地,规范中定义的算法旨在易读理解,而非保证性能。鼓励实现者优化实现。

索引

本规范定义的术语

引用中定义的术语

参考文献

规范性引用

[HTML]
Anne van Kesteren 等。HTML 标准。 Living Standard。URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren;Domenic Denicola。Infra 标准。Living Standard。URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner。在 RFC 中用于指示需求级别的关键字。1997 年 3 月。Best Current Practice。URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC8941]
M. Nottingham;P-H. Kamp。HTTP 的结构化字段值。2021 年 2 月。Proposed Standard。URL: https://httpwg.org/specs/rfc8941.html
[RFC8942]
I. Grigorik;Y. Weiss。HTTP 客户端提示。 2021 年 2 月。Experimental。URL: https://www.rfc-editor.org/rfc/rfc8942
[WEBIDL]
Edgar Chen;Timothy Gu。Web IDL 标准。Living Standard。URL: https://webidl.spec.whatwg.org/

补充性引用

[RFC3864]
G. Klyne; M. Nottingham; J. Mogul. Registration Procedures for Message Header Fields(消息头字段注册程序). 2004年9月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc3864

IDL 索引

[
    SecureContext,
    Exposed=(Window,Worker)
] interface mixin NavigatorDeviceMemory {
    readonly attribute double deviceMemory;
};

Navigator includes NavigatorDeviceMemory;
WorkerNavigator includes NavigatorDeviceMemory;