Как сгенерировать предопределенный манифест с управлением версиями с помощью сборки Workbox для Service Worker

Я пытаюсь настроить 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.`);
});

Чтобы автоматически сгенерированный сервис-воркер содержал манифест, похожий на этот:

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

И ревизия обновляется во время сборки, когда ресурс изменяется, так что кеш становится недействительным в браузере при следующей загрузке.

Заранее спасибо!


person Dalton Mangrum    schedule 16.10.2020    source источник


Ответы (1)


glob шаблон без подстановочных знаков должен соответствовать буквальным именам файлов. Вы должны иметь возможность выполнить то, что описываете, используя эти имена файлов в качестве значений, переданных в 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.`);
});
person Jeff Posnick    schedule 17.10.2020
comment
Привет, Джефф, можно ли лениво загрузить предварительный кэш (workbox.precache.precache) или обновить его в жизненном цикле ПО после его активации? Таким образом, мы могли отправить сообщение работнику службы при загрузке приложения, сообщая ему, какой манифест загружать? Для сравнения: у нас есть 2 приложения (разные файловые манифесты), работающие в одном домене. Спасибо! - person Dalton Mangrum; 26.10.2020
comment
Лучше всего было бы сгенерировать sw1.js и sw2.js, каждый с разными манифестами, а затем вызвать navigator.serviceWorker.register() с URL-адресом соответствующего файла сервис-воркера, в зависимости от любых условий выполнения, которые у вас есть. Вы можете проверить navigator.serviceWorker.controller внутри своего кода, чтобы проверить, есть ли уже зарегистрированный SW (для повторных посетителей), и нет необходимости регистрировать его снова, как только это будет сделано один раз. - person Jeff Posnick; 26.10.2020