К сожалению, регистрация работника службы в области, которая находится в верхнем пути, чем сам файл работника службы, не работает (как указано в MDN):
- Сервисный работник будет перехватывать запросы только от клиентов в рамках сервисного работника.
- Максимальная область действия для работника службы - это местоположение работника.
(Источник: https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers)
Решение
Вот предложение о рабочем подходе для обслуживания "/sw.js" в Demandware (Sales Force):
- Создать новый контроллер (или конвейер), например "ServiceWorker-GetFile"; ответ должен быть содержимым файла, который можно прочитать из любого источника:
- Актив содержимого (dw.content.ContentMgr.getContent ());
- Файл библиотеки (dw.content.ContentMgr.getContent () или прямое чтение файла с помощью dw.io.File / dw.io.FileReader);
- даже предпочтения сайта (хотя я бы не рекомендовал его);
- Создайте запись в Business Manager / Merchant Tools / SEO / Aliases для маршрутизации "/sw.js" в "ServiceWorker-GetFile", т. Е. Используйте что-то вместе:
{
...
"your-host" : [
...,
{
"if-site-path": "/sw.js",
"pipeline": "ServiceWorker-GetFile"
}
]
}
Это может показаться ненужными накладными расходами, но это был единственный способ найти файлы для обслуживания с корневым путем в URI.
Обслуживание других корневых файлов
Расширяя контроллер (переименовывая его, скажем, в «Content-GetFile» и добавляя параметры GET / POST, такие как «name» и / или «source»), это удобно использовать и для других файлов («/ manifest» .json "," /.well-known/assetlinks.json "и т. д.). В следующем примере Business Manager / ... / Aliases, пусть Content-GetFile принимает два параметра: «имя» (которое будет именем файла в библиотеке контента или идентификатором ресурса контента) и «источник» (который будет "файл" или "актив"):
...
{
"if-site-path": "/sw.js",
"pipeline": "Content-GetFile",
"params": {
"name": "/ServiceWorker/sw.js",
"source": "file"
}
},
{
"if-site-path": "/manifest.json",
"pipeline": "Content-GetFile",
"params": {
"name": "MANIFEST_JSON",
"source": "asset"
}
}
Обратите внимание, что ваш код должен надлежащим образом обрабатывать базовые пути ресурсов (например, "/ServiceWorker/sw.js" из приведенного выше примера мало говорит; вы должны знать, является ли это путь в библиотеке содержимого или путь относительно "картриджей" // static / default / js /").
Динамический контент
Поскольку в предлагаемом подходе используется контроллер, вы можете динамически обрабатывать контент перед его передачей пользователю (например, если вам нужно добавить / удалить часть "/ v12435145145 /" из ссылок DMW). Небо это ваши пределы. :)