Разумно ли использовать TransferState с PWA? - PullRequest
0 голосов
/ 09 мая 2018

Когда я создавал свое приложение в Angular 5 с помощью Universal для достижения рендеринга на стороне сервера, я использовал TransferState, чтобы не дублировать мои запросы к конечной точке API.

Я обновил свое приложение для работы в качестве Progressive Web APP, но теперь браузер запрашивает все ресурсы. Как я понимаю, index.html, отправленный сервером node.js, не может отправлять html с данными в состоянии.

Так разумно ли использовать TransferState, когда приложение работает как PWA?

1 Ответ

0 голосов
/ 15 августа 2018

Да, разумно использовать Transferstate с PWA в Angular, но есть предостережение.

Transferstate вступит в силу при первом посещении веб-приложения. Angular universal полностью отобразит html для представления, соответствующего вашему URL, и отправит все данные, полученные через Transferstate, как вы ожидаете, чтобы предотвратить «флэш», который происходит, когда клиентское приложение загружается и снова выполняет все те же вызовы API ,

В фоновом режиме сервисный работник либо кеширует, либо проактивно загружает дополнительные элементы PWA вашего приложения, такие как файл index.html. После этого последующие посещения веб-приложения будут полностью обрабатываться PWA, который теперь кешируется в браузере, инициируя любые вызовы API из браузера, полностью обходя рендеринг на стороне сервера и необходимость в TransferState. Это происходит даже в том случае, если вы случайно запрыгнули в веб-приложение по маршруту, который ранее не посещали.

В этом сценарии трансфертное государство имеет своей целью предотвратить «флэш», возникающий при первом посещении веб-приложения в браузерах, поддерживающих PWA, а также для последующих посещений веб-приложения для браузеров, которые не поддерживают PWA, поскольку эти запросы будут всегда заходите на сервер Angular Universal.

Предостережение заключается в том, что трансфертное государство не должно рассматриваться как единственный возможный источник данных. Всегда должен быть какой-то API-интерфейс, к которому можно обратиться в случае, если искомые данные отсутствуют в TransferState.

Пример из моего личного опыта: я использовал Transfertate для отправки значений конфигурации, считанных из переменных среды сервера, в браузер. Когда PWA взял на себя конфигурации, не было, где можно найти, потому что не было TransferState в index.html PWA. Решение состояло в том, чтобы настроить конечную точку API для обслуживания конфигураций, а не полагаться на TransferState для этого.

Предыдущий ответ (игнорируйте предложения здесь):

Кажется, что есть ограничение при использовании Transferstate с PWA. Я обнаружил, что тег сценария, в котором хранится jF-файл Transferstate, отсутствует в DOM во время срабатывания триггера DOMContentloaded.

Когда Chrome Devtools открыт на вкладке «Приложение», в разделе «Сервисные работники» снимите флажки «Обновлять при перезагрузке» и «Обойти для сети». Затем перезагрузите приложение и обратите внимание, что любые запросы XHR, которые вы, возможно, кэшировали в Transferstate, фактически выполняются в браузере, хотя они должны были уже быть выполнены во время рендеринга на стороне сервера.

Это не идеально, но один из вариантов - удалить запись /index.html из любого массива assetGroups.resources.files в файле ngsw-config.json. Это препятствует тому, чтобы ваше приложение было полноценным PWA с автономными возможностями, но оно по-прежнему имеет преимущество загрузки других ресурсов из сервисного работника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...