На самом деле он вообще не связан с вашим сервером.Проблема в том, что сервисный работник пытается зарегистрироваться на стороне сервера, что не поддерживается.То, что вы можете сделать, это сделать так, чтобы сервисный работник зарегистрировался на стороне клиента
Я не пробовал, но это может сработать для вас.Вам нужно поставить отдельный скрипт в конце body
в index.html
для запуска в браузере:
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/ngsw-worker.js');
}
</script>
Имейте в виду, что это даст вам только основные функции кэширования работника сервиса и, вероятно,не работает для SwPush
или SwUpdate
.Вы можете проверить, как внутренний модуль сервисного работника работает здесь .
Еще одна вещь, которую вы должны знать: сервисные работники на самом деле не подходят для приложений SSR.Сгенерированный файл ngsw.json
не будет содержать все имеющиеся у вас страницы.Вам придется либо изменить этот файл вручную, либо использовать его не как статический файл, а создать его динамически.
И кэширование всех страниц - это не то, что вы хотите делать (если содержимое страницы не статично).Потому что на кэшированной странице всегда будет отображаться одно и то же, поскольку вы не выполняете XHR-запрос на стороне клиента.Например, если ваша домашняя страница кэшируется для клиента, этот клиент всегда будет видеть одну и ту же страницу независимо от предполагаемого динамического содержимого.
На этом этапе вам следует подумать, почему вы хотите использовать SSR и веб-приложение одновременно.Если вам нужен SSR для SEO, вам не нужен SW.Просто сделайте SSR, когда пользовательский агент имеет сканер, и подайте динамический угловой, когда клиент является обычным пользователем.
Как переключить запрос на основе User Agent
Это моя мысль, и я не знаю, делает ли это кто-нибудь.Но теоретически это должно работать.
Во-первых, вам нужно будет построить приложение в двух разных каталогах (в моем примере DIST_FOLDER/ssr
и DIST_FOLDER/csr
) с конфигурациями рендеринга на стороне сервера и на стороне клиента.Вы можете исключить SW из SSR.Вы можете использовать SW в CSR как обычно.
Я нашел этот пакет , который может обнаруживать пользовательские агенты для сканеров и ботов.Для Express и Angular вы должны использовать его следующим образом:
app.get('*', (req, res) => {
var CrawlerDetector = new Crawler(req)
// check the current visitor's useragent
if (CrawlerDetector.isCrawler())
{
// render the index html at server side
res.render(path.join(DIST_FOLDER, 'ssr', 'index.html'), { req });
}
else {
// serve static index.html file built without SSR and let the client render it
res.sendFile(path.join(DIST_FOLDER, 'csr', 'index.html'));
}
});
После реализации этого вы можете отладить ваше приложение, чтобы увидеть, работает ли оно правильно, изменив свой пользовательский агент на тот, который написан здесь (т.е. используйте Почтальон).