如何在HTML中通过caches.open创建命名缓存空间存储Response对象

夏丽君_4993

夏丽君_4993

2026-06-08

1024人浏览

原创

caches.open() 在普通页面脚本中调用会报 typeerror: caches is not defined 或返回 undefined,因为它仅在 service worker 全局作用域(self)中可用,且需 sw 已注册并激活;正确做法是在 sw.js 的 install 等事件中通过 await caches.open('name') 或 .then() 调用,传入合法缓存名(如 'v1-static'),并确保使用 response 对象或 url 字符串进行缓存操作。

如何在html中通过caches.open创建命名缓存空间存储response对象

cache.open() 为什么总是返回 undefined 或抛出 TypeError?

直接调用 caches.open() 前必须确保当前环境支持 Service Worker 且已注册激活——它**不是普通 HTML 页面脚本里能直接用的 API**。浏览器会报 TypeError: caches is not defined 或 undefined,因为 caches 对象只在 Service Worker 全局作用域(self)中可用,且依赖 navigator.serviceWorker.ready 就绪状态。

常见错误写法:
<script>caches.open('my-cache')</script> → 必然失败。

正确路径是:先注册 SW 脚本,再在 SW 文件内部调用 caches.open()。

如何在 Service Worker 中安全调用 caches.open() 创建缓存空间

caches.open() 返回 Promise,必须 await 或 .then() 处理;传入的缓存名是字符串,建议用常量避免拼写错误。它不会覆盖已有缓存,而是复用同名缓存空间。

实操要点:

  • 缓存名不能含 /、..、空格等非法字符,推荐只用字母、数字、短横线(如 'v1-static-assets')
  • 同一缓存名多次调用 caches.open() 返回的是同一个 Cache 实例,不是新建
  • 若想清旧缓存建新名,需手动 caches.delete('old-name'),否则旧缓存残留
  • Chrome/Firefox 支持良好,但 Safari 对 caches 的 matchAll() 等方法支持有限,命名缓存本身无兼容问题

示例(写在 sw.js 中):

Wechat HTML Publisher
Wechat HTML Publisher

直接上传HTML富文本到微信公众号草稿箱。支持完整的HTML格式,无需Markdown转换。

下载
self.addEventListener('install', event => {
  event.waitUntil(
    caches.open('v1-pages').then(cache =>
      cache.addAll([
        '/',
        '/index.html',
        '/style.css'
      ])
    )
  );
});

Response 对象怎么进缓存?add()、addAll()、put() 选哪个?

只有 Response 对象(或能转为它的 URL 字符串)才能存进 Cache。关键区别:

  • cache.add(url):自动 fetch 该 URL,成功后存响应;失败则整个操作 reject
  • cache.addAll(urls):批量执行 add,任一失败即 reject,不保证原子性(部分可能已存)
  • cache.put(request, response):最灵活,适合自定义响应(如 fallback 页面、伪造 200 响应),request 可是 Request 实例或 URL 字符串

注意:cache.put() 的 response 必须是真实 Response 对象(比如从 fetch 得来),不能是普通 JSON 或字符串。常见错误是直接 cache.put('/api', {data: 1}) → 报错。

安全写法示例:

// 在 fetch 事件中拦截并缓存 API 响应
self.addEventListener('fetch', event => {
  const url = new URL(event.request.url);
  if (url.origin === self.location.origin && url.pathname.startsWith('/api/')) {
    event.respondWith(
      fetch(event.request).then(response => {
        // 克隆响应(Response 流只能读一次)
        const clonedResponse = response.clone();
        caches.open('api-responses').then(cache =>
          cache.put(event.request, clonedResponse)
        );
        return response;
      })
    );
  }
});

缓存名冲突和清理时机容易被忽略

缓存名不是“作用域”,而是全局唯一标识。不同 SW 版本如果用了相同缓存名,会互相读写——这既是便利也是风险。比如 v1 SW 存了 'pages',v2 SW 想升级结构,却没删旧缓存,就可能读到过期资源。

几个硬要记住的点:

  • Service Worker 更新时,旧 SW 仍控制页面,新 SW 需手动 skipWaiting + clients.claim 才能立即生效,否则新缓存逻辑不触发
  • caches.keys() 可列出所有缓存名,适合做版本迁移(如删除 'v0-*' 缓存)
  • 缓存不会自动过期,cache.match() 查到的就是上次 put() 或 add() 存的原始响应,包括其 headers 和 status
  • 调试时可在 Chrome DevTools > Application > Cache Storage 下直接查看各缓存内容,比猜强得多

真正麻烦的从来不是“怎么开缓存”,而是“什么时候删旧缓存”和“Response 流被消费后无法二次使用”——这两个点卡住的人最多。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

html 前端开发

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

5775

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3272

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

2950

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

2959

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4779

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

2921

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2709

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2428

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2448

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB 17.2 官方文档集合
GDB 17.2 官方文档集合

共0课时 | 0人学习

Bootstrap 入门安装配置
Bootstrap 入门安装配置

共0课时 | 0人学习

38+ PhpStorm 提示和技巧
38+ PhpStorm 提示和技巧

共1课时 | 220人学习