当前位置: 首页 > news >正文

服务工作者线程中的 Cache 和 CacheStorage

JavaScript 服务工作者(Service Worker)线程中CacheCacheStorage的主要区别:

特性CacheCacheStorage
定义表示一个具体的缓存实例,用于存储请求-响应对。是所有缓存(Cache 对象)的容器,提供对多个命名缓存的访问和管理。
接口类型Cache接口CacheStorage接口
获取方式通过caches.open('cache-name')返回一个 Promise,解析为 Cache 实例。通过全局变量caches(即self.caches)直接访问,其类型为 CacheStorage。
-主要方法-add(request)
-addAll(requests)
-put(request, response)
-match(request)
-delete(request)
-keys()
-open(cacheName)→ 返回 Promise<Cache>
-has(cacheName)→ 检查是否存在
-delete(cacheName)→ 删除整个缓存
-keys()→ 获取所有缓存名称
作用范围单个命名缓存(如'v1-assets')内的操作。管理多个命名缓存的整体集合。
类比类似于一个“文件夹”中的内容操作。类似于“文件系统根目录”,可创建/删除/列出多个“文件夹”(缓存)。
使用场景添加、查找或删除特定资源的缓存条目。创建新缓存、清理旧版本缓存、列出当前所有缓存等生命周期管理。

💡提示在 Service Worker 中,caches是一个全局属性,等价于self.caches,其类型就是CacheStorage通过它你可以打开具体的Cache实例进行细粒度操作。

例如:

// caches 是 CacheStorage 实例 const cache = await caches.open('my-cache'); // cache 是 Cache 实例 await cache.put('/app.js', new Response('console.log("cached")'));

Cache 与 CacheStorage 全部方法对比表

类别方法签名返回值类型功能说明
CacheStorage(通过caches访问)open(cacheName)Promise<Cache>打开指定名称的缓存;若不存在则创建并返回新 Cache 实例。
has(cacheName)Promise<boolean>检查是否存在指定名称的缓存。
delete(cacheName)Promise<boolean>删除指定名称的整个缓存;成功删除返回true,否则false
keys()Promise<string[]>返回当前所有缓存名称的数组。
Cache(通过caches.open()获取)match(request, options?)Promise<Response | undefined>在缓存中匹配一个请求,返回对应的响应(或 undefined)。
matchAll(request?, options?)Promise<Response[]>匹配所有符合条件的响应(可选请求和选项)。
add(request)Promise<void>抓取指定请求并将其响应存入缓存(等价于fetch + put)。
addAll(requests)Promise<void>批量抓取多个请求并缓存其响应(原子操作:任一失败则全部不缓存)。
put(request, response)Promise<void>将指定请求-响应对直接存入缓存(需注意响应可读流只能消费一次)。
delete(request, options?)Promise<boolean>从缓存中删除匹配的请求-响应对;删除成功返回true
keys(request?, options?)Promise<Request[]>返回缓存中所有(或匹配的)请求对象数组。

📌 补充说明

  • options参数(可选)可包含:

    • ignoreSearch: 忽略 URL 查询字符串(?a=1)。
    • ignoreMethod: 忽略请求方法(默认只匹配 GET)。
    • ignoreVary: 忽略Vary响应头。
    • prefixMatch: (非标准,部分浏览器可能支持)前缀匹配。
  • 注意事项

    • Cache.add()addAll()会发起真实网络请求,因此需确保资源可访问。
    • Cache.put()要求传入的Response对象是未被使用过的(因为 Body 是不可重用的流)。
    • 所有方法均为异步,返回Promise
    • CacheStorage是缓存的“顶层容器”,而Cache是具体缓存的“操作接口”。

💡 示例速览

// CacheStorage 操作 await caches.has('v1'); // 检查是否存在 const cache = await caches.open('v1'); // 获取 Cache 实例 await caches.delete('old-v1'); // 删除旧缓存 const names = await caches.keys(); // ['v1', 'assets'] // Cache 操作 await cache.add('/index.html'); await cache.put('/api/config', new Response(JSON.stringify({}))); const res = await cache.match('/index.html'); await cache.delete('/temp-file'); const requests = await cache.keys();

此表覆盖了截至2025 年Web 标准中CacheCacheStorage接口的全部官方方法。


CacheStorage() 也有match方法?


Qwen3-Max

没有,CacheStorage接口本身没有match()方法。


✅ 正确理解:

  • match()Cache接口的方法,用于在某个具体缓存(Cache 实例)中查找匹配的请求。
  • CacheStorage(即全局的caches)不直接提供match()方法,因为它管理的是多个命名缓存(Cache 对象)的集合,而不是缓存条目本身。

📌 常见误解澄清

不能这样写:

// ❌ 错误!CacheStorage 没有 match 方法 const response = await caches.match('/some-url');

但你可以遍历所有缓存手动实现类似功能,或者更常见的是:先打开特定缓存再 match

// ✅ 正确方式:先 open 一个 Cache,再 match const cache = await caches.open('my-cache'); const response = await cache.match('/some-url');

或者,在 Service Worker 的fetch事件中,通常使用:

self.addEventListener('fetch', (event) => { event.respondWith( caches.match(event.request) // ← 注意:这是全局快捷方式! ); });

⚠️ 这里caches.match(request)看起来像是 CacheStorage 的方法,但实际上它是CacheStorage接口的一个便捷别名(convenience method)


🔍 补充说明:caches.match()到底是什么?

根据 MDN 和 W3C 规范,CacheStorage确实定义了一个match()方法

所以,结论更新如下:

CacheStorage确实有match()方法,但它不是用来查单个缓存,而是在所有已创建的缓存中按顺序查找第一个匹配项


✅ 官方方法签名(来自规范)

caches.match(request, options?)
  • 作用:遍历当前 origin 下所有缓存(按创建顺序?实际是实现定义),返回第一个匹配该请求的响应。
  • 等价于
    const keys = await caches.keys(); for (const key of keys) { const cache = await caches.open(key); const res = await cache.match(request, options); if (res) return res; } return undefined;

🆕 更新后的完整答案:

接口是否有match()方法?行为
Cache✅ 有当前缓存实例中匹配请求。
CacheStorage✅ 有(常被忽略!)所有命名缓存中查找第一个匹配项。

✅ 所以:CacheStorage确实有match()方法,但它的用途和Cache.match()不同。


💡 使用建议

  • 如果你知道资源在哪个缓存(如'assets-v1'),用cache.match()更高效。
  • 如果不确定缓存在哪个名字里(比如清理旧缓存后只剩最新版),可以用caches.match()全局查找。
  • 在 Service Worker 的fetch事件中,caches.match(event.request)是常见模式,正是调用了CacheStorage.match()

📚 参考资料

  • MDN: CacheStorage.match()
  • W3C Service Workers Spec - CacheStorage

总结
是的,CacheStoragematch()方法,用于跨所有缓存查找第一个匹配项。此前认为“没有”是常见误解。

http://www.jsqmd.com/news/123438/

相关文章:

  • 2025年造纸机旋转接头制造企业源头厂家权威推荐榜单:烘缸旋转接头/蒸汽旋转接头/周边加热辊旋转接头源头厂家精选 - 品牌推荐官
  • EasyGBS助力智慧医院打造全方位视频监控联网服务体系
  • 使用 Elasticsearch Agent Builder 构建对话式费用助手,结合 Telegram 、 n8n 和 AWS Bedrock
  • 2025年电磁吸盘按需定制认证厂家推荐,圆形电磁吸盘企业全解析 - myqiye
  • 数据孤岛不再!:Open-AutoGLM实现跨部门实时调度的4大关键技术突破
  • LangChain LangGraph V1.0深度解析:零基础构建高效AI智能体
  • 2025沪上金属材料特色厂家TOP5权威推荐:专业制造商甄选指南 - mypinpai
  • 【AI医疗】医疗AI智能体架构全解析:六大核心模块与七种专业智能体类型!
  • 南阳视频拍摄剪辑供应企业哪家专业?哪家合作案例多? - mypinpai
  • 户外光伏电站测试仪
  • 2025年度湖南氢氧化钠烧碱排行榜,氢氧化钠烧碱哪家? - myqiye
  • 揭秘Open-AutoGLM如何重构电子病历管理:医生工作效率翻倍的底层逻辑
  • 【万字长文】基于 GPU 及 vLLM 的大模型推理加速技术分享:实践与案例,提升AI推理效率的关键!
  • Open-AutoGLM vs AppDynamics监控集成实战(5大关键差异曝光)
  • 哺乳动物细胞表达系统
  • 小白也能懂:Agent工作流入门指南,从工具调用到智能决策的产品策略全解析
  • 2025防脱洗发水十大品牌评选:最安全的防脱牌子,口碑种草榜单出炉 - 博客万
  • 实现模仿tab页
  • 告别 Notepad++!网络工程师必备的 6 款配置文件编辑神器
  • 【Open-AutoGLM数字孪生联动控制】:揭秘工业4.0时代智能控制核心引擎
  • 【Open-AutoGLM技术内幕】:基于20年AI经验谈其多模态设计哲学
  • 【研知有术论文发表】2025被降区但巨好投的毕业神刊!环境科学期刊推荐,非常好发
  • Shell Daily 2025-12-22: 变量安全检查 (Set Nounset)
  • Open-AutoGLM医疗辅助落地实践(挂号效率提升90%的秘诀)
  • Kubernetes Operator 模式与云原生数据库的联系
  • 智能体式AI实战指南:从零构建IT自动化系统,程序员必学收藏教程
  • 2025南阳短视频制作公司TOP5权威推荐:短视频推广怎么做? - 工业推荐榜
  • 工业数据孤岛怎么破?Open-AutoGLM模型融合技术让多源数据实时协同
  • 【Open-AutoGLM智慧城市协同调度】:揭秘未来城市交通智能调度的5大核心技术
  • 国产检漏仪实力厂家盘点:广东中量科技领跑行业创新 - 品牌推荐大师