【问题标题】:How to generate predefined manifest with versioning using workbox-build for Service Worker如何使用 Workbox-build 为 Service Worker 生成带有版本控制的预定义清单
【发布时间】:2020-10-16 19:38:49
【问题描述】:

我正在尝试配置 workbox-build 以创建服务工作者 (generateSW) 或将清单 (injectManifest) 注入到现有的服务工作者基于 预定义 URL 列表 而不是模式匹配,以便 preCache 上的特定资源应用加载。

不是这样的:

const { generateSW } = require('workbox-build');

const swDest = 'app/cache-sw.js';
generateSW({
    globDirectory: "app/",
    globPatterns: [
        "**/*.{html,js,png,css,json,txt,ico,config}"
    ]
    swDest
}).then(({ count, size }) => {
    console.log(`Generated ${swDest}, which will precache ${count} files, totaling ${size} bytes.`);
});

不过是这样的:

const { generateSW } = require('workbox-build');

const swDest = 'app/cache-sw.js';
generateSW({
    globDirectory: "app/",
    manifestURLs: [
        "/index.html",
        "/favicon.ico",
        "/info.txt",
        ...
    ],
    swDest
}).then(({ count, size }) => {
    console.log(`Generated ${swDest}, which will precache ${count} files, totaling ${size} bytes.`);
});

因此自动生成的 service worker 包含类似于以下内容的清单:

[
        {
            "url": "/index.html",
            "revision": "487659b6e9c542e7cd8227e0e9d0bed1"
        },
        {
            "url": "/favicon.ico",
            "revision": "29459c5d9c542e7cd8227e0e9d0if83"
        },
        {
            "url": "/info.txt",
            "revision": "73932c5d9c542e7cd8227e0e9z7el19"
        },
        ...
]

当资源发生变化时,版本会在构建期间更新,以便下次加载时浏览器中的缓存失效。

提前致谢!

【问题讨论】:

    标签: service-worker workbox cache-manifest sw-precache


    【解决方案1】:

    没有任何通配符的glob pattern 应该匹配文字文件名。您应该能够通过使用这些文件名作为传递给globPatterns 的值来完成您描述的内容:

    const { generateSW } = require('workbox-build');
    
    const swDest = 'app/cache-sw.js';
    generateSW({
        globDirectory: "app/",
        globPatterns: [
            "index.html",
            "favicon.ico",
            "info.txt",
            ...
        ]
        swDest
    }).then(({ count, size }) => {
        console.log(`Generated ${swDest}, which will precache ${count} files, totaling ${size} bytes.`);
    });
    

    【讨论】:

    • 嗨,Jeff,是否可以延迟加载预缓存(workbox.precache.precache)或在激活软件后在软件生命周期中更新它?这样我们就可以在应用加载时向服务工作者发布一条消息,告诉它要加载哪个清单?为了正确看待事情,我们有 2 个应用程序(不同的文件清单)在单个域下运行。谢谢!
    • 最好的办法是生成 sw1.jssw2.js,每个都有不同的清单,然后使用适当的服务工作者文件的 URL 调用 navigator.serviceWorker.register(),具体取决于您的任何运行时条件有。您可以在您的代码中检查navigator.serviceWorker.controller 以检查是否已经注册了一个SW(对于重复访问者),并且一旦完成一次就无需再次注册。
    猜你喜欢
    • 2022-12-05
    • 2021-07-10
    • 2019-09-03
    • 2020-03-20
    • 1970-01-01
    • 2021-01-14
    • 2021-03-17
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多