Работник кеша ломает PDF файлы после первой загрузки - PullRequest
0 голосов
/ 04 января 2019

Я использую sw-toolbox , чтобы включить кэширование на одном из сайтов моих клиентов. Обычно он работает хорошо, за исключением того, что по какой-то причине он разрывает PDF-файлы после первой загрузки. Я подозреваю, что когда он сохраняет PDF-файлы в кэш-памяти, они каким-то образом повреждаются, но я все равно могу сохранить PDF-файл локально со сломанной страницы, и он откроется очень хорошо.

Это мой работник службы:

((global) => {
    // disable the service worker for post previews
    global.addEventListener("fetch", (event) => {
        if (event.request.url.match(/preview=true/)) {
            return;
        }
    });

    // ensure the service worker takes over as soon as possible
    global.addEventListener("install", event => event.waitUntil(global.skipWaiting()));
    global.addEventListener("activate", event => event.waitUntil(global.clients.claim()));

    // set up the cache
    global.toolbox.precache(["/", "/offline/"]);

    global.toolbox.router.get("/wp-content/uploads/(.*)", toolbox.cacheFirst);
    global.toolbox.router.get("/(.*)", toolbox.networkFirst, { NetworkTimeoutSeconds: 5 });

    // redirect offline queries to offline page
    self.toolbox.router.get("/(.*)", function (req, vals, opts) {
        return toolbox.networkFirst(req, vals, opts).catch((error) => {
            if (req.method === "GET" && req.headers.get("accept").includes("text/html")) {
                return toolbox.cacheOnly(new Request("/offline/"), vals, opts);
            }

            throw error;
        });
    });
})(self);

Некоторые вещи, которые я пробовал:

  • Добавить дополнительный маршрут global.toolbox.router.get("/wp-content/uploads/(.*).pdf", toolbox.networkOnly);
  • Изменить /wp-content/uploads/(.*) маршрут для перенаправления на URL-адрес PDF с заголовком «без кэширования»

    global.toolbox.router.get("/wp-content/uploads/(.*)", function (req, vals, opts) {
        if (req.url.match(/\.pdf$/)) {
            const pdf_headers = new Headers();
    
            pdf_headers.append("Content-Type", "application/pdf");
    
            return toolbox.networkOnly(new Request(req.url, {
                method:  "GET",
                headers: pdf_headers,
                mode:    "same-origin",
                cache:   "no-cache",
            }), vals, opts);
        } else {
            return toolbox.cacheFirst;
        }
    });
    
  • Исключая PDF-файлы так же, как исключается preview=true:

    global.addEventListener("fetch", (event) => {
        if (event.request.url.match(/preview=true/) || event.request.url.match(/\.pdf$/)) {
            return;
        }
    });
    

У меня нет идей, и я был бы признателен за некоторые рекомендации. Страница тестирования доступна здесь: https://www.westmontparks.org/about-us/board-minutesbid-docs/

1 Ответ

0 голосов
/ 05 января 2019

Вероятно, это связано с этой ошибкой Chrome , которая влияет на версию Chrome 71.

...