设备内存 API

W3C 工作草案,

关于本文档的更多信息
该版本:
https://www.w3.org/TR/2025/WD-device-memory-1-20251211/
最新发布版本:
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)
前编辑:
Shubhie Panicker (Google)

摘要

本文档定义了一个 HTTP 客户端提示头和一个 JavaScript API,用于展示设备的内存能力(即设备 RAM),从而使 Web 应用可以根据设备的内存约束定制内容。

本文档状态

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

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

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

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

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

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

1. 介绍

开发者需要设备类别信号用于:
  1. 为低端设备提供网站或特定组件的简化版本。示例:

    • 提供 Google“简版搜索”——在新兴市场使用的、仅10KB的搜索结果页。

    • 在 Facebook 提供简化版视频播放器。

    • 在 Google 地图中提供轻量级的地图瓦片图片。

  2. 标准化分析指标:分析系统需要能够按设备类别标准化其统计数据。例如,在高端设备上耗时 100ms 的长任务问题会比在低端设备上更严重。

设备内存是判断“设备类别”的特别有用的信号。低内存设备(低于512MB,512MB-1GB)广泛用于新兴市场。

1.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: 0.5
...

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

Sec-CH-Device-Memory 头字段是一个 HTTP 客户端提示头。 它是一个 结构化头值,内容为一个 元素,其值为 十进制数,表示客户端设备内存,即约等于的 RAM 容量,单位为 GiB。

Sec-CH-Device-Memory 头字段的 ABNF(增强型巴克斯-诺尔范式)语法如下:

Sec-CH-Device-Memory = sf-decimal

2.1. 设备内存值的计算

该值通过设备实际内存(MiB)计算,先取最接近且只有最高位为1其他位都为0的值(即最近的2的幂),再除以 1024.0 得到 GiB 单位的值。

应该为该值列表设置上下界。

注意:虽然实现可选用不同的范围,但推荐上界为 8GiB,下界为 0.25GiB(即 256MiB)。

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

2.2. 示例

512 MiB 会被报告为:

Sec-CH-Device-Memory: 0.5

1000 MiB 会被报告为:

Sec-CH-Device-Memory: 1

一份完整的可能值列表为:0.25, 0.5, 1, 2, 4, 8

3. 设备内存 JS API

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

Navigator includes NavigatorDeviceMemory;
WorkerNavigator includes NavigatorDeviceMemory;

注意: self.navigator.deviceMemory 返回的是以 GiB 表示的内存大小,具体参考§ 2.1 设备内存值的计算

4. 安全注意事项

Sec-CH-Device-Memory 客户端提示头和 JS API 只对 HTTPS 安全上下文开放。

基于 User-Agent 及其他客户端特征进行设备识别和分类(如设备类型与类别)常用于为不同设备提供优化内容。此类方案常常依赖第三方设备数据库,成本高,集成复杂,维护困难。本规范定义了一种获取设备内存能力的机制,解决了这些技术难题。

为降低指纹识别风险,所报告的值会向下取整到最高有效位(而不是报告精确值),同时对取值施加上下界。

5. IANA 注意事项

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

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

头字段名称

Sec-CH-Device-Memory

适用协议

http

状态

standard

作者/变更控制方

IETF

规范文档

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

6. 致谢

特别感谢 所有贡献者,他们的技术意见和建议提升了本规范。

一致性

文档约定

一致性要求通过描述性断言与 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 标准. 实时标准. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. 用于 RFC 中指示要求级别的关键词. 1997年3月. 最佳现行做法. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC8941]
M. Nottingham; P-H. Kamp. HTTP 的结构化字段值. 2021年2月. 推荐标准. URL: https://httpwg.org/specs/rfc8941.html
[RFC8942]
I. Grigorik; Y. Weiss. HTTP 客户端提示. 2021年2月. 实验性. URL: https://www.rfc-editor.org/rfc/rfc8942
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 标准. 实时标准. URL: https://webidl.spec.whatwg.org/

参考性引用

[RFC3864]
G. Klyne; M. Nottingham; J. Mogul. 消息头字段注册流程. 2004年9月. 最佳现行做法. 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;