【问题标题】:Retrieved JavaScript file from cache api not executing从缓存 api 中检索的 JavaScript 文件未执行
【发布时间】:2018-03-27 06:47:43
【问题描述】:

在不使用服务工作者的 Web 纯原生 JavaScript 应用程序中,我想显式缓存位于 AWS S3 文件服务器上的 JavaScript 文件。以下脚本将位于应用程序的 index.html 文件中(我已修改 URL,因为它是客户端项目):

<script>
    caches.match('https://s3.amazonaws.com/com.myproject/myjavascript.js')
    .then(function(response) {
        if (response) {
            return response;
        } else {
            fetch('https://s3.amazonaws.com/com.myproject/myjavascript.js')
            .then(function(res) {
                return caches.open('mycache')
                .then(function(cache) {
cache.put('https://s3.amazonaws.com/com.myproject/myjavascript.js',res.clone());
                   console.log(res.clone());
                   return res;
                });
            });
       }
    });
</script>

我相信这段代码应该执行以下操作:检查 myjavascript.js 文件是否在缓存中。如果是,则返回将由浏览器执行的 JavaScript 文件。如果在缓存中没有找到 myjavascriptfile.js,则将其取出并放置在子缓存“mycache”中,最后返回到执行它的浏览器。

运行此程序后,我在缓存中找到文件的 URL,响应为“Ok”,但浏览器未执行代码,并且在 Chrome 浏览器开发人员中的源代码中看不到文件内容工具。

为什么这不起作用?我的想法有什么问题。

非常感谢, 弗雷德

【问题讨论】:

  • 您在控制台日志中得到了什么?
  • 您确定这不能使用 htaccess、http 标头等中的声明来完成吗?此外,这些 javascript 命令是否与所有当前浏览器兼容?另外,可能有一个 js 库可以处理这个问题。
  • 感谢您的评论 Eyal。 Fetch 有很好的浏览器支持(目前全球 79%:caniuse.com/#search=fetch)。这是一个技术要求,我为此使用了 Vanilla JavaScript,是的,JQuery 可以处理这个问题。

标签: javascript html caching progressive-web-apps


【解决方案1】:

fetch 本身不会执行 JavaScript。它只是对指定的内容发出请求,并使其可供代码访问。如果您真的想继续使用这种方法,可以获取文本并对其进行评估。

const url = 'https://unpkg.com/underscore@1.8.3/underscore-min.js';
caches.match(url)
  .then(function(response) {
    if (response) {
      return response;
    } else {
      return fetch(url)
        .then(function(res) {
          return caches.open('mycache')
            .then(function(cache) {
              cache.put(url,res.clone());
                console.log(res.clone());
                return res;
            });
        });
    }
  })
  .then(function(response) {
    console.log(response);
    response.text().then(function(text) {
      eval(text);
      console.log(_);
    });
  });

注意:Why is using the JavaScript eval function a bad idea?

您拥有的代码示例是 Service Worker 中常见的一种模式。它在这种情况下工作的原因是初始请求来自&lt;script&gt; 标签,而不是fetch 的方向调用。由于&lt;script&gt; 标记,浏览器会自动处理执行返回的内容。

<script src="https://unpkg.com/underscore@1.8.3/underscore-min.js"></script>

【讨论】:

  • 感谢亚伯拉罕出色而清晰的解释。但是,当它第一次执行并尝试在最后的 then 子句中访问 response.text() 时,我收到错误消息 "Cannot read property 'text' of undefined" 。我第二次运行它时,它确实从缓存中提取了脚本,我可以通过控制台日志查看该代码,但它没有执行的代码。当我简单地将
  • 要修复第一次运行时的错误,必须返回 fetch return fetch(url)
  • fetch 不会延迟window.load 事件。该事件在您获取和评估脚本之前触发。
  • 谢谢@abraham。由于 fetch 不会自行调用代码执行,并且在获取和评估脚本时已经发生了 window.load 事件,那么通过什么机制可以让代码在加载此页面时自动运行?跨度>
  • 最好的方法是使用标准的&lt;script src="..."&gt; 标记并将cache 用法移动到Service Worker。它会更简单,并且不必运行 eval。
猜你喜欢
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 2018-02-12
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
相关资源
最近更新 更多