【问题标题】:Chrome install Service Worker addAll failed to fetchChrome 安装 Service Worker addAll 无法获取
【发布时间】:2018-04-02 14:18:43
【问题描述】:

我正在使用服务人员为我的网站资产(HTML、JS、CSS)提供缓存。

当我使用 Firefox 时,我的 sw.js 已正确安装并缓存了所需的文件。如果我进入离线模式,我会正确设置网站样式,除了数据之外的所有内容(这是正确的,因为数据没有被缓存)。

但是,当我使用 Chrome 时,我收到了 TypeError: Failed to fetch 错误。我真的不确定为什么会收到此错误,因为它在 Firefox 中有效。此外,每当fetch 事件触发并且请求不在缓存中的资产(并且正在调用 fetch 函数)时,我都会收到相同的错误。

如果我将一个空数组传递给 cache.addAll 函数,在尝试实际处理 fetch 事件之前我不会收到任何错误。

值得注意的是,我缓存的所有文件都不是来自本地主机,也不是来自任何其他来源,所以我看不出这是一个跨域问题。


这是安装 service worker 时的控制台输出:

这是安装 Service Worker 后刷新页面时的控制台输出:


这是我的服务人员的代码:

const CACHE_NAME = 'webapp-v1';
const CACHE_FILES = [
    '/',
    '/public/app.css',
    '/public/img/_sprites.png',
    '/public/js/app.min.js',
    '/public/js/polyfills.min.js'
];

self.addEventListener('install', event => {
    console.log("[sw.js] Install event.");
    event.waitUntil(
        caches.open(CACHE_NAME)
            .then(cache => cache.addAll(CACHE_FILES))
            .then(self.skipWaiting())
            .catch(err => console.error("[sw.js] Error trying to pre-fetch cache files:", err))
    );
});

self.addEventListener('activate', event => {
    console.log("[sw.js] Activate event.");
    event.waitUntil(
        self.clients.claim()
    );
});

self.addEventListener('fetch', event => {
    if (!event.request.url.startsWith(self.location.origin)) return;
    console.log("[sw.js] Fetch event on", event.request.url);
    event.respondWith(
        caches.match(event.request).then(response => {
            console.info("[sw.js] Responded to ", event.request.url, "with", response ? "cache hit." : "fetch.");
            return response || fetch(event.request);
        }).catch(err => {
            console.error("[sw.js] Error with match or fetch:", err);
        })
    );
});

任何帮助都会很棒。

【问题讨论】:

    标签: javascript google-chrome caching service-worker


    【解决方案1】:
    cache.addAll(CACHE_FILES)
    

    当文件中的 1 个不可访问时将失败(HTTP 400,401 等,有时还有 5XX 和 3XX)以避免在 1 个失败时全部失败,在地图循环中使用单独的 catch 语句,如https://github.com/GrosSacASac/server-in-the-browser/blob/master/client/js/service_worker.js#L168

    它不会因空数组而失败这一事实可能意味着您在 CACHE_FILES 中有一个不可访问的资源。

    也许 firefox 的限制性较差,并且会缓存 400 响应的正文。

    在您的 fetch 处理程序中,您尝试直接使用 caches.match,但我认为这是不合法的。您必须先打开缓存,然后从打开的缓存中执行 cache.match。见https://github.com/GrosSacASac/server-in-the-browser/blob/master/client/js/service_worker.js#L143

    【讨论】:

    • 如果您确实对任何文件有 4XX 或 5XX 响应,并且 Firefox 让该滑动,他们没有正确实施规范。 #justsayin
    • 我尝试单独添加 CACHE_FILES 中的项目,但打印出来无法获取缓存文件中的每个文件。但是文件被正确提供。如果它们没有被正确提供,Firefox 在离线模式下肯定不能正确显示页面,因为会丢失资产?
    • 您在请求的 http 标头中看到了什么?我可以尝试在家里重现这个错误吗,你有这个项目的 github repo 吗?
    • 所以我现在所做的是将 CACHE_FILES 设置为一个空数组,我将尝试修复 fetch 事件中的错误,因为我认为根本问题我的两个问题都是 FetchAPI 出现的一些奇怪现象。所以现在服务工作者安装正确并且没有缓存。当我重新加载页面时,它会尝试获取“/”,这就是请求出现在 Chrome 的网络面板中的方式:i.imgur.com/sZ9raUt.png。请求在状态栏中显示为 net::ERR_FAILED
    猜你喜欢
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多