WebAssembly Web API

W3C 候选推荐草案

关于本文档的更多细节
本版本:
https://www.w3.org/TR/2025/CRD-wasm-web-api-2-20251102/
最新发布版本:
https://www.w3.org/TR/wasm-web-api-2/
编辑草案:
https://webassembly.github.io/spec/web-api/
历史记录:
https://www.w3.org/standards/history/wasm-web-api-2/
实现报告:
https://webassembly.org/features/
反馈:
GitHub
编辑:
Ms2ger (Igalia)
问题追踪:
GitHub Issues

摘要

本文件描述了 WebAssembly 与更广泛 Web 平台的集成方式。

这是一组相关文档的一部分: WebAssembly 核心规范WebAssembly JS 接口, 以及 WebAssembly Web API

本文档状态

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

本文件由 WebAssembly 工作组 作为候选推荐草案通过 推荐路径 发布。

作为候选推荐(Candidate Recommendation)发布并不意味着 W3C 及其成员的背书。候选推荐草案融合了工作组计划在后续候选推荐快照中纳入的对前一候选推荐的修改。

WebAssembly 工作组计划将本出版物维持在候选推荐状态并持续更新为“动态标准”,而不是转为最终推荐。在任何情况下,推荐(REC)流程转阶段不会早于 2025 年 12 月 2 日申请。

本文档随时维护并可能更新。文档部分内容仍在开发中。

讨论本规范,推荐优先在 GitHub Issues 提出。 所有问题与评论均有 存档

本文档由 WebAssembly 工作组 制定。

本文档由采纳 W3C 专利政策 的工作组制定。 W3C 维护着一份 所有专利披露的公开名单 ,该页面也包含专利披露说明。 任何个人确实知悉某专利并认为该专利包含必要专利声明 ,务必依据 W3C 专利政策第 6 节 披露相关信息。

本文档受 2025 年 8 月 18 日 W3C 流程文件 约束。

1. 介绍

本文基于 WebAssembly 规范 [WEBASSEMBLY] 以及 WebAssembly JavaScript 嵌入规范 [WASMJS]。 它描述了 WebAssembly 如何集成进更广泛的 Web 平台,例如用户代理实现但超出 JavaScript [ECMASCRIPT] 自身范围的额外 API。

2. 流式模块编译与实例化

[Exposed=(Window,Worker)]
partial namespace WebAssembly {
  Promise<Module> compileStreaming(Promise<Response> source, optional WebAssemblyCompileOptions options = {});
  Promise<WebAssemblyInstantiatedSource> instantiateStreaming(
      Promise<Response> source, optional object importObject, optional WebAssemblyCompileOptions options = {});
};
当调用 compileStreaming(source, options) 方法时,返回用 sourceoptions 编译潜在 WebAssembly 响应 的结果。
当调用 instantiateStreaming(source, importObject, options) 方法时,执行如下步骤:
  1. promiseOfModule 为用 sourceoptions 编译潜在 WebAssembly 响应 的结果。

  2. 返回用导入 importObjectpromiseOfModule 实例化 promise Module 的结果。

要用一个 Response 的 promise sourceWebAssemblyCompileOptions options 编译潜在 WebAssembly 响应,请遵循如下步骤:

注: 此算法接收 Response 对象或其 promise,并编译和实例化响应得到的字节。此过程可后台异步流式实现。如果 Response 不是 CORS 同源、非 ok 状态 或未匹配 `application/wasm` MIME 类型, 则返回的 promise 会以 TypeError 拒绝; 如果编译或实例化失败,promise 将以 CompileError 或相关错误类型拒绝,视失败原因而定。

  1. returnValue新的 promise

  2. 监听 source 状态:

    • 如果 source 正常完成并返回 unwrappedSource

      1. responseunwrappedSourceresponse

      2. mimeType 为从 responseheader list 获取 `Content-Type` 的结果。

      3. mimeType 为 null,则使用 TypeError 拒绝 returnValue 并中止本分支。

      4. 去除 mimeType 首尾的所有 HTTP 制表或空格字节

      5. mimeType 不是 字节忽略大小写 匹配 `application/wasm`, 则使用 TypeError 拒绝 returnValue 并中止。

        注: 格式不允许附加参数,包括空的 `application/wasm;`

      6. response 不是 CORS 同源,则用 TypeError 拒绝 returnValue 并中止。

      7. responsestatusok 状态,则用 TypeError 拒绝 returnValue 并中止。

      8. 消费 response 的 body 为 ArrayBuffer, 并赋结果给 bodyPromise

        注: 这里描述响应消耗完毕才编译只是为了规格表述简单;实现中一般会流式处理,两者对外不可区分,因而采用了易于理解的模型。

      9. 监听 bodyPromise

    • 如果 source 被拒绝,原因为 reason

      1. Reject returnValue,原因为 reason

  3. 返回 returnValue

3. 序列化

Web 用户代理必须为 Module 接口添加 [Serializable] 扩展属性。

当给定 valueserializedforStorage 时,序列化步骤为:

  1. forStorage 为 true,抛出 "DataCloneError" DOMException

  2. 设置 serialized.[[Bytes]] 为 value.[[Bytes]] 的 子串序列化

  3. 设置 serialized.[[AgentCluster]] 为 当前 Realm 对应的 agent cluster

给定 serializedvaluetargetRealm反序列化步骤为:

  1. bytesserialized.[[Bytes]] 的 子串反序列化

  2. 设置 value.[[Bytes]] = bytes

  3. 如果 targetRealm 对应的 agent cluster 不等于 serialized.[[AgentCluster]],则抛出 "DataCloneError" DOMException

  4. 编译 WebAssembly 模块 使用 bytes,并设置 value.[[Module]] 为其结果。

引擎在执行结构化序列化时应尝试共享/复用内部编译代码,尽管某些极端情况下如 CPU 或浏览器升级可能无法做到,则需重新编译。

注: 结构化序列化的语义等价于将用来编译 Module 的二进制源程序序列化、反序列化,再在目标 realm 重新编译。鉴于上述引擎优化,结构化序列化为开发者提供了对已编译代码缓存和窗口/worker间代码共享的显式控制力。

4. 面对开发者的显示约定

本节为非规范性内容。

浏览器、JavaScript 引擎和离线工具在引用 JS 结构和语法单元时有通用方式。例如 JavaScript 源码位置常用于堆栈追踪或错误信息,并以文本文件中的十进制行列表示。函数名变量名直接取自源码。即使不同实现的堆栈追踪字符串格式未必一致,源码位置仍跨浏览器易于理解。

为实现 WebAssembly 构造体通用表达,本规范采纳如下约定:

WebAssembly 位置指代二进制中特定指令,可在浏览器或引擎中与 JS 源代码位置类似场景显示。格式为:

${url}:wasm-function[${funcIndex}]:${pcOffset}

其中

备注:

虽然 导出函数实例的 "name" 属性由 JS API 规范定义,合成函数名也用于调试器调用栈和堆栈追踪字符串等场景。 若模块含 name section, 合成函数名用法如下:

请注意本文档不定义堆栈帧字符串等格式,这样可使引擎保留原 JS 格式(以兼容已有代码),且 WebAssembly 帧输出风格仍与 JS 一致。

5. 媒体类型注册

application/wasm 媒体类型已在 IANA 媒体类型数据库注册 [IANA-MEDIA-TYPES], 注册模板如下 registration template

application/wasm

类型名(Type Name):
application
子类型名(Subtype Name):
wasm
所需参数(Required Parameters):
可选参数(Optional Parameters):
编码注意事项(Encoding Considerations):
binary(二进制)
安全注意事项(Security Considerations):

WebAssembly 是一种标准、安全、可移植、低级代码格式。与执行 WebAssembly 代码相关的安全注意事项详见 https://www.w3.org/TR/wasm-core/#security-considerations。

WebAssembly 格式不包含完整性或隐私保护。如需此类保护,必须外部实现,如通过 HTTPS。

互操作性注意事项(Interoperability Considerations):
详见 WebAssembly Core 一致性
https://www.w3.org/TR/wasm-core/#conformance
已发布规范(Published specification):
https://www.w3.org/TR/wasm-core-1/ https://www.w3.org/TR/wasm-js-api-1/ https://www.w3.org/TR/wasm-web-api-1/
应用用途(Application Usage):
application/wasm 媒体类型用于描述通过 HTTP 发送、被浏览器执行的 WebAssembly 文件,这是一种常见场景。此外,该类型也被多种 WebAssembly 运行时采用,兼具安全性、可移植性、高效执行及紧凑表达。
片段标识符注意事项(Fragment Identifier Considerations):
使用限制(Restrictions on usage):
临时注册(Provisional Registrations):
N/A
附加信息(Additional information):
此类型已废弃别名(Deprecated alias names for this type):
魔数(Magic number(s)):
0x00 0x61 0x73 0x6D
文件扩展名(File extension(s)):
.wasm
Macintosh 文件类型码(Macintosh file type code(s)):
对象标识符或 OID(Object Identifier(s) or OID(s)):
预期用途(Intended usage):
通用(Common)
其他信息与评论(Other Information & Comments):
通用(Common)
联系人(Contact Person):
联系人姓名(Contact Name):
Eric Prud’hommeaux
联系邮件(Contact Email Address):
eric@w3.org
作者/变更控制方(Author/Change Controller):
W3C

6. 安全与隐私注意事项

本节为非规范性内容。

WebAssembly 除了通过 JS API 规范中描述的 JavaScript API 外,不会访问周围环境。 因此,WebAssembly 无法收集或暴露任何信息(无论是个人的、敏感的还是其他)给网站或任何第三方,超出 JavaScript 能收集、暴露或处理的信息。 WebAssembly 内存的生命周期与周围 JavaScript 环境中的对象一致,且不会被持久化或序列化(除非通过拷贝给 JavaScript 并用现有序列化 API)。 不会提供对底层平台或硬件、其他设备,或用户代理原生界面的访问权限。

WebAssembly 是一种额外的程序执行机制,可以在 JavaScript 可执行的任何地方被执行。 因此,其威胁模型本质上与 JavaScript 代码相同,也有类似的传输安全(如 WebAssembly 代码在传输过程中应受到主动和被动网络攻击者的保护) 和策略考量(如某些加载机制或执行通过同源策略或内容安全策略等机制受到限制)。

7. 变更历史

本节为非规范性内容。

自 WebAssembly 规范初始 1.0 发布以来,已有很多扩展提案被集成。 下列各节概述了都有哪些变更。

7.1. 2.0 版本

媒体类型注册已完成

application/wasm 媒体类型的注册已成功完成。

一致性

文档约定

一致性要求以描述性断言与 RFC 2119 术语相结合表达。 本规范中规范性部分用到的 “MUST”、 “MUST NOT”、 “REQUIRED”、 “SHALL”、 “SHALL NOT”、 “SHOULD”、 “SHOULD NOT”、 “RECOMMENDED”、 “MAY”、 “OPTIONAL” 均须按 RFC 2119 中描述进行解释。 不过,为了可读性,这些词在本规范中不会全部大写。

除显式标为非规范性的章节、示例和注释外,本规范其余所有文本均为规范性内容。[RFC2119]

本规范中的示例以“例如”引入,或用 class="example" 与规范性文本区分,如下所示:

这是一个信息性示例。

信息性备注以 “Note” 为开头,并用 class="note" 与规范性文本区分,如下所示:

Note,此处为一条信息性备注。

一致性算法

以祈使语气表述的算法要求(如“去除所有前导空格字符”或“返回 false 并中止这些步骤”),应按关键字 (如“must”、“should”、“may”等)在算法前文中指定的含义来理解。

以算法或具体步骤表述的一致性要求可用任何方式实现,只要最终结果等价即可。 特别是,本规范定义的算法目的是便于理解,不追求高性能。鼓励实现者做优化。

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[ECMASCRIPT]
ECMAScript 语言规范。URL: https://tc39.es/ecma262/multipage/
[FETCH]
Anne van Kesteren. Fetch 标准。Living Standard. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. 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
[WASM-JS-API-2]
. Ms2ger. WebAssembly JavaScript 接口。 2025年11月1日。CRD。URL: https://www.w3.org/TR/wasm-js-api-2/
[WASMJS]
WebAssembly JS 集成规范。草案。URL: https://webassembly.github.io/spec/js-api/
[WEBASSEMBLY]
WebAssembly 核心规范。草案。URL: https://webassembly.github.io/spec/core/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 标准。Living Standard. URL: https://webidl.spec.whatwg.org/

参考性引用

[IANA-MEDIA-TYPES]
媒体类型。URL: https://www.iana.org/assignments/media-types/

IDL 索引

[Exposed=(Window,Worker)]
partial namespace WebAssembly {
  Promise<Module> compileStreaming(Promise<Response> source, optional WebAssemblyCompileOptions options = {});
  Promise<WebAssemblyInstantiatedSource> instantiateStreaming(
      Promise<Response> source, optional object importObject, optional WebAssemblyCompileOptions options = {});
};