Как использовать MVC Bundling + Service Worker Cache - PullRequest
0 голосов
/ 16 ноября 2018

Проблема

Если я загружаю страницу без работника службы, все в порядке, но когда я представляю работника службы, страница не загружается в первый раз (когда он-лайн), потому чтов нем отсутствуют мои связанные файлы, что вызывает проблемы как CSS, так и скрипта.Если я обновляю страницу, то все работает, потому что работник службы кэширует запросы на выборку, когда они происходят.

Настройка

Скажем, у меня есть такой пакет, как

bundles.Add(new ScriptBundle("~/js/main").Include(
    "~/Scripts/jquery-3.3.1.min.js",
    "~/Scripts/moment.min.js",
    "~/node_modules/sweetalert/dist/sweetalert.min.js"));

и работника службы в моем корневом каталоге, такого как

var cacheName = 'v1:static';

self.addEventListener('install', function (e) {
e.waitUntil(
    caches.open(cacheName).then(function (cache) {
        return cache.addAll([
            '/images/keypad/number 0.png',
            '/',
            '/Menu/MainMenu',
            '**TODO: Cache Bundles**'
        ]).then(function () {
            self.skipWaiting();
        });
    })
);
});


self.addEventListener('fetch', function (event) {
    if (event.request.method != "POST") {
        event.respondWith(
        caches.match(event.request).then(function (response) {
            if (response) {
                return response;
            }

            fetch(event.request).then(function (fetchResponse) {
                caches.open(cacheName).then(function (cache) {
                    cache.put(event.request, fetchResponse.clone());
                });

                return fetchResponse;
            });
        })
    );
}
});

Вопрос

Как кэшировать мои связанные файлы в моем работнике службы в обоихРежим отладки и выпуска, потому что отладка отображает их как отдельные файлы, в то время как Release объединяет их, а я не знаю URL-адреса пакетов?

Дополнительные мысли

Выне могу вставить Razor @ ... в этот файл, потому что это не cshtml.

Я не хочу перечислять каждый файл в обоих местах и ​​поддерживать оба.

Я думал об использовании обработчика на стороне сервера для генерации моего файла service-worker.js, но мне было интересноесли есть действительно чистый способ сделать это, не сходя с ума.

Спасибо!

1 Ответ

0 голосов
/ 05 декабря 2018
  1. @Scripts.Url ("~ / bundles / yourBundleName") используйте это, чтобы получить оттуда абсолютный URL-адрес для URL, вы можете получить карту имени пакета в переменную и использовать эту переменную в установке сервисного работника.событие, чтобы активы кэшировались при самой загрузке.

примечание: одна ошибка, которую я делал. Также, пожалуйста, не ссылайтесь файл serviceworker.js напрямую на index.html, это будетбыть загруженным во время регистрации из файла sw-registration.js

...