访问不透明响应的头部/正文
不透明响应最直接的限制是,您无法从Response
类的大多数属性中获取有意义的信息,例如headers
,或调用组成Body
接口的各种方法,例如json()
或text()
。这符合不透明响应的黑盒特性。
将不透明响应作为页面上的资源使用
不透明响应可作为网页上的资源使用,只要浏览器允许使用非CORS跨域资源。以下是一些元素的子集,其中非CORS跨域资源和因此不透明响应是有效的,该子集改编自Mozilla Developer Network documentation:<script>
<link rel="stylesheet">
<img>
、<video>
和<audio>
<object>
和<embed>
<iframe>
<script>
元素,但有一些限制以防止泄漏错误信息。由此可知,如果 add()
/addAll()
调用中执行的请求结果是不透明响应,则无法将其添加到缓存中。
fetch()
,然后使用不透明响应调用put()
方法来解决此问题。这样做,您实际上选择了将要缓存的响应可能是由您的服务器返回的错误的风险。const request = new Request('https://third-party-no-cors.com/', {
mode: 'no-cors',
});
// Assume `cache` is an open instance of the Cache class.
fetch(request).then(response => cache.put(request, response));
不透明响应和navigator.storage API
为了避免跨域信息泄漏,对于用于计算存储配额限制(即是否抛出QuotaExceeded
异常)并由navigator.storage
API报告的不透明响应,添加了大量填充。
这种填充的细节因浏览器而异,但对于Google Chrome来说,这意味着任何单个缓存的不透明响应对总体存储使用的最小贡献量约为7兆字节。在确定要缓存多少不透明响应时,您应该记住这一点,因为基于不透明资源的实际大小,您很容易比预期更快地超过存储配额限制。
cdn.x.com/test.jpg
,并且缓存请求转到主域www.x.com/test.jpg
吗? - cglacet/test.jpg
),然后对于每个针对cdn.x.com/test.jpg
的获取请求,我都使用原始域名修改URL(URL变为www.x.com/test.jpg
),我使用类似于这样的代码:const cacheUrl = (url.hostname == 'cdn.x.com')? new URL(event.target.location.origin + url.pathname): url;
。然后,我使用这个新的URLcaches.match(cacheUrl)
请求缓存,这似乎很好用。对此方法有何想法? - cglacet