Как передать параметр из Razor в рабочий файл службы для PWA? - PullRequest
0 голосов
/ 06 февраля 2019

Я создаю PWA (Progressive Web App) и регистрирую своего сервисного работника в моем представлении:

    if('serviceWorker' in navigator) {
        navigator.serviceWorker.register('@Url.Content("~/sw.js")', { scope: '@Url.Content("~/")' })
          .then(function(registration) {
            console.log('G081 Service Worker Registered');
          });
        navigator.serviceWorker.ready.then(function(registration) {
            console.log('G081 Service Worker Ready');
        });
    }

И одна из первых вещей, которые я делаю в своем сервисном работнике, это импорт idb-keyval библиотека, следующим образом:

(function () {
    "use strict";
    self.importScripts("/3971/lib/idb-keyval/idb-keyval-iife.min.js");
}());

Все хорошо с этим.Это зарегистрировано и работает.Однако, вы заметите, что в моей функции self.importScripts (в моем сервисном работнике) я жестко кодирую часть пути ("3971/").Я делаю это из-за стратегии ветвления, которую мы используем на моей работе.Каждый филиал получает свой сайт на нашем тестовом сервере (в моем случае это 3971).В результате я должен быть в состоянии сказать моему сервисному работнику искать в подпапке 3971 файл javascript idb-keyval.Если я этого не скажу, он смотрит в родительскую папку и не находит его.И это снова изменится, когда мы начнем производство.Затем приложение будет находиться в корневом каталоге сайта, и ему нужно будет искать файл javascript без подпапки «3971».

Я назову это папкой моей области видимости.По сути, мне нужен способ сообщить моему сервисному работнику, какую папку области использовать для ресурсов.Я делаю что-то похожее на моей странице просмотра, как вы видите выше, где я использую Razor для сериализации папки своей области видимости для регистрации моего сервисного работника:

navigator.serviceWorker.register('@Url.Content("~/sw.js")', { scope: '@Url.Content("~/")' })

Визуализация:

navigator.serviceWorker.register('/3971/sw.js', { scope: '/3971/' }) // MY DYNAMIC BRANCH
// and ...
navigator.serviceWorker.register('/sw.js', { scope: '/' }) // PRODUCTION

Есть ли способ, которым я могу передать параметр своему сервисному работнику, чтобы он знал, какую папку области он использует? Например, я могу сделать что-то вроде этого:

navigator.serviceWorker.register('/3971/sw.js?scope=%2F3971%2F', { scope: '/3971/' }) // MY DYNAMIC BRANCH

А потом в моем сервисном работнике использовать этот параметр и использовать его для получения моих ресурсов? Примерно так:

(function () {
    "use strict";
    self.importScripts(param['scope'] + "lib/idb-keyval/idb-keyval-iife.min.js");
}());

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете получить параметры запроса пути рабочего сервиса.

const scope = (new URLSearchParams(location.search)).get('scope');
...