首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用服务工作者预先缓存每次部署时都会更改名称的资产?

如何使用服务工作者预先缓存每次部署时都会更改名称的资产?
EN

Stack Overflow用户
提问于 2019-05-17 21:07:33
回答 1查看 1.3K关注 0票数 2

我们正在使用Workbox来预先缓存“下一步”页面的一些资源,但是我们的资源URL包含部署的日期和散列。例如"/css/2019-05-15/f00ba5/home.css“。

我们面临的问题是如何将URL的更改部分("2019-05-15/f00ba5")传递给服务工作者,并使Workbox预先缓存资产列表。

我们正在使用Workbox,我们尝试使用workbox-window从网页向SW发送消息,直到这里...啊,真灵!

但是既然SW知道了散列,我们就不知道如何利用它,因为如果我们从事件侦听器内部调用workbox.precaching.precacheAndRoute()方法,workbox.precaching模块的导入就会以某种方式失败。

在page.html中

代码语言:javascript
复制
<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中

代码语言:javascript
复制
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);
    }
});

我得到了错误

代码语言:javascript
复制
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数组中的文件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-17 22:44:37

您遇到的特定错误是由于安装service worker后对调用is importScripts()的限制造成的,这是通过workbox-sw库在幕后发生的。Workbox documentation中对此进行了更详细的描述,并提供了实现相同功能的替代方法。

也就是说,“动态”使用workbox-precaching不是一个好的选择。如workbox-precaching documentation中所述,您应该使用构建工具(如workbox-cliworkbox-webpack-plugin )来生成此列表,并自动将预缓存清单插入到您的服务工作者文件中。由于更新的预缓存清单而导致的对服务工作者文件的更改将触发服务工作者更新生命周期事件,这反过来将确保您的预缓存资产保持最新。

如果您不想使用构建工具并预先生成预缓存清单,那么设置routing rules并使用运行时缓存策略比预缓存更合适。您可以使用workbox-windowpass in a list of URLs您想要在运行时缓存的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56187066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档