Angular 7 - Service Worker PWA + SSR не работает на сервере - PullRequest
0 голосов
/ 11 февраля 2019

Я изо всех сил стараюсь, чтобы мой серверный рендеринг и сервисный работник взаимодействовали на серверной стороне.

Информация о локальном хосте -> Работающий

Это работает, как и ожидалось.Работник службы работает и обновляет мое приложение при каждом обновлении.Более того;a curl localhost:8082 отправьте мне мою информацию.

Я запускаю свое приложение с помощью следующей команды: npm run ssr

 "ssr": "npm run build:ssr && npm run serve:ssr",
 "build:ssr": "npm run build:client-and-server-bundles",
 "serve:ssr": "node dist/server.js",
 "build:client-and-server-bundles": "ng build --prod && npm run webpack:server",
 "webpack:server": "webpack --config webpack.server.config.js --progress --colors"

Информация о производстве: -> НеРаботающий

Сайт работает по протоколу HTTPS: https://airdropers.io Процесс веб-сайта выполняется на закрытом порту, и HAPROXY перенаправляет трафик с 443 на порт веб-сервера

Проблема виднав журналах веб-сервера: не удалось подписаться на уведомления Ошибка: работники службы отключены или не поддерживаются этим браузером

Дополнительная информация:

Узел js на localhost ипроизводственные процессы одинаковы: v9.0.0. Я строю производственный процесс следующим образом:

  1. git pull
  2. npm run build: ssr
  3. pm2 start dist / server.js

ОБНОВЛЕНИЕ 23/02/2019

Теперь у меня есть более глубокое понимание.Моя проблема заключается в том, что я запускаю свой сервер SSR / PWA с помощью команды узла, такой как "node dist / server.js".

Из моего понимания "узел dist / server.js" не работает для Service Worker (PWA) Цитирую (https://angular.io/guide/service-worker-getting-started)

Поскольку ng serve не работает с работниками сферы обслуживания, вы должны использовать отдельный HTTP-сервер для локального тестирования вашего проекта. Вы можете использовать любой HTTP-сервер.В приведенном ниже примере используется пакет http-сервера от npm. Чтобы уменьшить вероятность конфликтов и избежать обслуживания устаревшего контента, протестируйте выделенный порт и отключите кэширование.

Я не могу запустить с помощью http-server dist/browser потому что я потеряю возможность SSR.

Как мне запустить мой сервер PWA / SSR? Какую команду я буду использовать?
Какую сборку мне делать?

ОБНОВЛЕНИЕ24/02/2019

Как упомянул @ Gökhan Kurt, работник службы не работает должным образом с моим сервером SSR. Мне нужен SSR для SEO и мне нужен работник службы для Push-уведомления браузера. Какое решениеу меня естье обрабатывать Push-уведомления пользователей браузера?Сторонняя библиотека, такая как One Signals?


Любые идеи идей приветствуются, чтобы помочь мне сделать эту работу.Спасибо за поддержку, Алекс

1 Ответ

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

На самом деле он вообще не связан с вашим сервером.Проблема в том, что сервисный работник пытается зарегистрироваться на стороне сервера, что не поддерживается.То, что вы можете сделать, это сделать так, чтобы сервисный работник зарегистрировался на стороне клиента

Я не пробовал, но это может сработать для вас.Вам нужно поставить отдельный скрипт в конце 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'));
  }
});

После реализации этого вы можете отладить ваше приложение, чтобы увидеть, работает ли оно правильно, изменив свой пользовательский агент на тот, который написан здесь (т.е. используйте Почтальон).

...