我有一个完全静态的网站 - index.html 和一些 CSS/JS/PNG 文件。我想使用服务工作者缓存它们所有。看起来 Workbox 应该能够轻松实现这一点。这是我的 sw.js:
importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.5.0/workbox-sw.js');
workbox.precaching.precacheAndRoute([]);
workbox.routing.registerNavigationRoute('/index.html');
这是我的构建脚本:
const workboxBuild = require("workbox-build");
// NOTE: This should be run *AFTER* all your assets are built
const buildSW = async () => {
console.log("Generating sw.js...")
const {count, size, warnings} = await workboxBuild.injectManifest({
swSrc: "src/sw.js",
swDest: "build/sw.js",
globDirectory: "build",
globPatterns: [
"**/*.{js,css,html,png}",
]
})
warnings.forEach(console.warn);
console.log(`${count} files will be precached, totaling ${size} bytes.`);
}
buildSW();
这一切看起来都很顺利。构建脚本运行,服务工作者已激活,即使我离线时我的网站仍然可以工作。太棒了!
然后我对index.html进行了一些修改。我重新加载页面。我在控制台上看到这个消息,表明它已经缓存了我的index.html,尽管浏览器仍然显示旧的页面:
Precaching 1 file. 35 files are already cached.
我认为这是正确的,它会在显示缓存文件后缓存新的index.html。所以下一次重新加载就应该显示新的index.html了,对吧?
错!再次重新加载,仍然显示旧的index.html。多次重复这个过程,没有任何变化。要想实际上看到新的index.html,普通的重新加载永远不起作用,我需要做ctrl+shift+R。
这不可能是它的正常工作方式,对吗?我肯定遗漏了一些显而易见的东西,但我的代码非常简单,几乎是从Workbox网站的示例中拿来的,我不知道我哪里出错了。
编辑:我在GitHub上放了一个非常简单的例子来说明这个问题。我感到很愚蠢 - 这个例子是如此简单,但我仍然不明白为什么它会表现出这样的行为。