【问题标题】:Is it possible to cache a broken image?是否可以缓存损坏的图像?
【发布时间】:2020-03-10 16:00:39
【问题描述】:

我正在寻找一种方法来确保浏览器缓存无效/损坏的“图像”,以便在重新获取时立即加载。

以下是我特别感兴趣的两个场景。

1) 第一个是我尝试从包含不同类型资源的 url 加载图像(例如,在本例中为 text/html)。请求状态为200,但资源不是图片

2) 第二个是我尝试加载根本不存在的图像。请求状态为404

// takes ~500ms to load
const urlText = "https://goodreads.com"
const brokenTextImage = new Image();
brokenTextImage.src = urlText;

// takes ~500ms to load
const url404 = "https://broken.com/${gres.psm}.png"
const broken404Image = new Image();
broken404Image.src = url404; 

// looking to cache - should take ~0ms to load
const cachedTextImage = new Image();
cachedBrokenTextImage.src = urlText; 

// looking to cache - should take ~0ms to load
const cached404Image = new Image();
cached404Image.src = url404;

在这两种情况下,我都希望将加载时间减少到 ~0 毫秒,就像您对有效图像 url 的缓存机制所期望的那样。这可能吗?


请参阅此处的图片以获取此失败缓存的示例。您可以看到 404 图像的获取次数,以及 goodreads“图像”以及来自“磁盘缓存”的成功图像示例

图像响应时间:

【问题讨论】:

  • 我不确定您要在这里做什么。如果问题是“我如何缓存我的 404 图像”,就像缓存所有其他图像一样。
  • @RobertHarvey 我希望浏览器能够自动缓存资源,就像有效的图像 url 一样,但事实并非如此。我会在 OP 中添加一张图片来澄清
  • 哦,所以你要缓存一个不存在的资源?我不确定有没有办法做到这一点。您必须前往服务器才能识别 404。
  • 我认为大部分时间来自处理请求的服务器。将服务器升级到 http/2 并使用服务器推送

标签: javascript html


【解决方案1】:

现代浏览器带有一个叫做服务工作者的东西 -> https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API

服务工作者启动并运行后,您可以注册一个 fetch 事件 -> https://developer.mozilla.org/en-US/docs/Web/API/FetchEvent

这样您就可以完全控制资源的缓存方式。 另请注意,fetch 事件会影响所有资源加载,包括 HTML / Ajax 和当然 fetch。

【讨论】:

  • 这是一个有趣的解决方案,但有没有办法在没有服务人员的情况下做到这一点?不幸的是,我不能仅仅为了这个用例在我当前的环境中介绍它们。可能 blob 预取工作?
  • 我能想到的唯一其他方法是使用代理服务器并获取它来缓存 404 的..或者如果您可以访问生成 404 的服务器,请让它推出很长的时间到期..
猜你喜欢
  • 2012-04-13
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多