我们正在使用 Workbox 来预缓存“下一个”页面的一些资产,但我们的资产 URL 包含部署的日期和哈希值。例如“/css/2019-05-15/f00ba5/home.css”。
我们面临的问题是如何将 URL 的变化部分(“2019-05-15/f00ba5”)传递给 service worker,并使 Workbox 预缓存资产列表。
我们正在使用 Workbox,我们尝试使用 workbox-window 从网页向 SW 发送消息,直到这里......它成功了!
但是现在 SW 知道哈希,我们不知道如何利用它,因为如果我们从事件侦听器内部调用 workbox.precaching.precacheAndRoute() 方法,workbox.precaching 模块的导入会以某种方式失败.
在 page.html
<script type="module">
import {Workbox} from 'https://storage.googleapis.com/workbox-cdn/releases/4.0.0/workbox-window.prod.mjs';
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
const wb = new Workbox('/service-worker.js');
wb.messageSW({type: 'hash', payload: "12345"});
wb.register();
})
}
</script>
在 service-worker.js
const file1 = "/css/{hash}/home.css";
const file2 = "/js/{hash}/home.js";
const file3 = "/img/{hash}/hero.jpg";
addEventListener('message', (event) => {
if (event.data.type === 'hash') {
// TODO: replace {hash} with event.data.payload in file1, 2, 3
const precacheManifest = [ file1, file2, file3 ];
workbox.precaching.precacheAndRoute(precacheManifest);
}
});
我得到错误
workbox-sw.js:1 Unable to import module 'workbox-precaching' from 'https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-precaching.prod.js'.
loadModule @ workbox-sw.js:1
get @ workbox-sw.js:1
(anonymous) @ service-worker.js:39
workbox-sw.js:1 Uncaught DOMException: Failed to execute 'importScripts' on 'WorkerGlobalScope': The script at 'https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-precaching.prod.js' failed to load.
at Object.loadModule (https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js:1:954)
at Object.get (https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js:1:727)
at https://brioni.f31.lcl/service-worker.js:39:13
loadModule @ workbox-sw.js:1
get @ workbox-sw.js:1
(anonymous) @ service-worker.js:39
framework.js:1441 STORE::LazyLoad.Init
我希望它能够工作并预缓存precacheManifest
数组中的文件。