从脚本标签启动时从网络下载的资产

时间:2019-01-04 11:22:53

标签: service-worker workbox workbox-webpack-plugin

我正在将workbox与workbox-webpack-plugin一起使用以缓存某些资产。 我当前的配置应该缓存两个文件:.js和.css。 这两个文件都已正确缓存,但是问题是浏览器仍然从网络上下载它们,我不知道为什么。

这是我的webpack配置中的工作箱插件,可生成服务工作者:

new GenerateSW({
  swDest: 'service-worker.js',
  importWorkboxFrom: 'local',
  chunks: ['myChunk'],
  skipWaiting: true,
  clientsClaim: true,
  ignoreUrlParametersMatching: [/.*/],
  cacheId: 'myCacheId',
}),

以下是生成的服务工作者:

/**
 * Welcome to your Workbox-powered service worker!
 *
 * You'll need to register this file in your web app and you should
 * disable HTTP caching for this file too.
 * See https://xxx
 *
 * The rest of the code is auto-generated. Please don't update this file
 * directly; instead, make changes to your Workbox build configuration
 * and re-run your build process.
 * See https://xxx
 */

importScripts("workbox-v3.6.3/workbox-sw.js");
workbox.setConfig({modulePathPrefix: "workbox-v3.6.3"});

importScripts(
  "precache-manifest.14645da973669ef1d2247d1863e806bd.js"
);

workbox.core.setCacheNameDetails({prefix: "myCacheId"});

workbox.skipWaiting();
workbox.clientsClaim();

/**
 * The workboxSW.precacheAndRoute() method efficiently caches and responds to
 * requests for URLs in the manifest.
 * See https://xxx
 */
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.suppressWarnings();
workbox.precaching.precacheAndRoute(self.__precacheManifest, {
  "ignoreUrlParametersMatching": [/.*/]
});

预缓存清单:

self.__precacheManifest = [
  {
    "revision": "9b22d66a17276ac21d45",
    "url": "myChunk.js"
  },
  {
    "revision": "9b22d66a17276ac21d45",
    "url": "myChunk.css"
  }
];

预缓存实际上有效,但是看起来fetch事件未被服务工作者截获。如果我尝试直接从Chrome浏览器的地址栏中下载文件,则该文件已从Service Worker正确加载。但是,当它从我页面的script标签加载时,它仍然是从网络上下载的。

这是从脚本标记加载时的请求标头:

GET /assets/myChunk.js?1546600720154 HTTP/1.1
Host: localhost:5000
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: */*
Referer: http://localhost:5000/xxx
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,fr-BE;q=0.8,fr;q=0.7,te-IN;q=0.6,te;q=0.5
Cookie: visitor_id=f86c312d-76e2-468d-a5c5-45c47fa3bbdc

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:0)

根据您发布的HTTP流量摘要,您的<script>标签会导致请求/assets/myChunk.js?1546600720154。尝试将请求与预缓存的网址进行匹配时,1546600720154查询参数位导致不匹配。

我建议两件事之一

  1. Configure webpack来添加内容哈希作为URL的一部分,并使用该哈希来支持基于时间的URL参数来进行缓存清除。 Workbox应该能够按原样读取这些哈希URL。

  2. 继续使用基于时间的URL查询参数进行缓存清除,但将Workbox配置为在确定是否与预缓存的URL匹配时忽略这些参数。您可以使用ignoreUrlParametersMatching选项来实现。它需要一个RegExp数组,并且类似ignoreUrlParametersMatching: [/^\d+$/]这样的东西足以告诉Workbox忽略所有完全由数字组成的查询参数。

如果可以的话,我可能会选择选项1。