Как SSR идет с PWA - PullRequest
       33

Как SSR идет с PWA

0 голосов
/ 30 мая 2018

Как можно сделать SSR (рендеринг на стороне сервера) с PWA (прогрессивным веб-приложением)?

Из того, что я понимаю,

SSR

Будет загружена среда выполнения SSRстраницу и запустите необходимые сценарии для загрузки данных на страницу.Затем возвращает визуализированный HTML.Это важно для сканеров, которые не запускают JavaScript и браузеры без сценариев.По крайней мере, первое впечатление будет полезным.

PWA

Среди прочего, PWA требует наличия оболочки, которая будет кэшироваться, и данные будут поступать после нее.Это означает, что даже если пользователь находится в автономном режиме, оболочка будет загружена.

?

Итак, если мы предварительно отрисовываем данные, как можно кэшировать оболочку отдельно от данных?

Ответы [ 3 ]

0 голосов
/ 09 июля 2018

Если вы хотите кэшировать оболочку только из предварительно обработанного представления SSR с исходными данными, вы должны предоставить два представления:

  1. /view-url с данными из SSR
  2. /view-url?shell только сверсия оболочки, без данных (вы можете изменить логику с URL-запроса, например, на заголовок запроса).

Когда пользователь впервые вводит /view-url, вы отправляете 1. версию и кеш в Service Worker/view-url?shell.Когда пользователь возвращается к /view-url, вы отправляете ему /view-url?shell из кэша Service Worker, выполняя что-то вроде этого:

const CACHE_NAME = 'cache-token';
const staticUrlsToCache = ['/style.css', '/script.js', '/logo.png'];
const shellUrlsToCache = ['/view-url'];
const urlsToCache = [
    ...staticUrlsToCache,
    shellUrlsToCache.map(url => `${url}?shell`),
];

self.addEventListener('install', event => {
    event.waitUntil(
        caches.open(CACHE_NAME).then(cache => cache.addAll(urlsToCache))
    );
});

self.addEventListener('fetch', event => {
    let request = event.request;

    const shellUrl = shellUrlsToCache.find(url => request.url.endsWith(url));
    if (shellUrl) {
        // here is real magic!
        request = new Request(`${shellUrl}?shell`);
    }

    event.respondWith(
        caches.match(request).then(response => response || fetch(request))
    );
});

Ключевым моментом здесь является то, что вы меняете исходный запрос /view-url на /view-url?shellв Service Worker!

Если вы хотите узнать больше об этой технике, я написал статью об этой проблеме Как объединить PWA и изоморфный рендеринг (SSR)?

0 голосов
/ 22 сентября 2018

Стратегия заключается в том, чтобы обслуживать загрузку первой страницы с использованием SSR и всех последующих переходов по страницам с использованием оболочки кэшированного приложения.SSR возвращает разные html для разных страниц, поэтому мы можем указать специальный путь, например /app-shell, для извлечения скелетного html для рендеринга на стороне клиента.

Если вы хотите узнать больше об этом, вы можете обратиться к моей статье Как превратить обработанный серверный SPA React в PWA .

0 голосов
/ 30 мая 2018

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

...