在Transformers.js中试验提出的跨域存储API
本文介绍了跨域存储(COS)API提案,该API允许Web应用跨域共享大型文件(如AI模型和Wasm运行时),通过加密哈希而非URL标识文件,从而避免重复下载和存储。文章以Transformers.js为例,展示了当前浏览器缓存隔离导致的问题,以及COS如何通过哈希标识、可升级的访问控制和安全完整性检查来解决这些问题。
在Web开发中,Transformers.js库让开发者能够通过任务特定的管道轻松在Web应用中使用Transformer模型。例如,创建自动语音识别(ASR)管道只需几行代码。然而,当多个不同来源的Web应用使用相同的AI模型或Wasm运行时文件时,浏览器会因缓存隔离而重复下载和存储这些资源,造成带宽和存储浪费。
Chrome等浏览器通过网络隔离键(由顶级站点和当前框架站点组成)来隔离缓存,即使资源URL完全相同也不会命中缓存。这意味着,如果两个不同来源的应用都使用同一份Wasm运行时文件,每个应用都必须独立下载和缓存。例如,一个简单的ASR模型(Xenova/whisper-tiny.en)在跨域时会导致177 MB的重复下载。更糟糕的是,即使是不同的AI模型,如果它们共享相同的Wasm运行时(如4.7 MB的ort-wasm-simd-threaded.asyncify.wasm),也会被重复下载和缓存。
为此,有人提出了跨域存储(COS)API。该API引入navigator.crossOriginStorage接口,允许应用通过加密哈希而非URL标识文件,实现跨域共享。当应用需要资源时,先尝试通过哈希从COS中获取;若失败,则从网络下载并写入COS供后续使用。由于哈希相同,不同来源的应用可以共享同一份缓存。
COS还提供了精细的访问控制:origins: '*'表示全局共享;指定具体源列表则限制访问;省略origins则仅同站点可用。访问权限只能升级(从限制到开放),不能降级,以防止恶意篡改。另外,写入文件时浏览器会自动验证哈希是否匹配,确保数据的完整性。
尽管COS目前仍处于早期提案阶段,尚未被任何浏览器原生实现,但开发者可以通过安装官方扩展来注入polyfill进行实验。该API的潜力在于解决AI模型和Wasm运行时等大型资源的跨域重复缓存问题,提高Web应用的性能和存储效率。