javascript - 第一次加载后,Service Worker 缓存会破坏 PDF

标签 javascript google-chrome caching service-worker

我正在使用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/(.*) 路由以重定向到 header 为“no-cache”的 PDF URL

    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/

最佳答案

这可能与 this chrome bug 有关这会影响 Chrome 版本 71。

关于javascript - 第一次加载后,Service Worker 缓存会破坏 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54044711/

相关文章:

javascript - 如何为我所有的 Express 中间件设置默认的拒绝 promise 行为?

python - ChromeDriver 打不开网站

Java - 连续并行流之间的缓存一致性?

c - 提高缓存命中率

php - MongoDB 作为 MySQL 缓存

javascript - 使用 Ordnance Survey/Openlayers api 拖动标记

javascript - 如何为许多实例重构此 JavaScript 代码

javascript - jQuery DOMWindow 脚本不释放内存

css - Mac 和 Windows 上的 chrome 滚动条行为不同

javascript - 使用音量增益时如何正确释放audioContext