23

如何使用 PWA(渐进式 Web 应用程序)进行 SSR(服务器端渲染)?

据我了解,

固态继电器

SSR 运行时将加载页面并运行必要的脚本以将数据加载到页面上。然后返回渲染的 html。这对于不会运行 javascript 和无脚本浏览器的网络爬虫很重要。至少第一印象是可用的。

PWA

其中,PWA 需要一个 shell,它会被缓存并且数据会在它之后出现。这意味着,即使用户离线,shell 也会被加载。

?

那么,如果我们要预渲染数据,如何将 shell 与数据分开缓存呢?

4

3 回答 3

10

如果您只想从带有初始数据的预渲染 SSR 视图中缓存 shell,您必须提供两个视图:

  1. /view-url来自 SSR 的数据
  2. /view-url?shell只有 shell 版本,没有数据(您可以将逻辑从 url-query 更改为例如请求标头)。

当用户第一次进入时/view-url,您在 Service Worker 中发送 1. 版本和缓存/view-url?shell。当用户回到你身边时,通过执行以下操作从 Service Worker 缓存中/view-url发送他:/view-url?shell

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 中!

如果你想了解更多关于这项技术的信息,我写了一篇关于这个问题的文章How to combine PWA and isomorphic rendering (SSR)?

于 2018-07-09T12:30:56.277 回答
0

该策略是使用 SSR 提供​​第一个页面加载,并使用缓存的应用程序外壳提供所有后续页面导航。SSR 为不同的页面返回不同的 html,因此我们可以指定一个特殊的路径,例如/app-shell获取骨架 html 用于客户端渲染。

如果想了解更多,可以参考我的文章How To Turn a Server-Side-Rendered React SPA Into a PWA

于 2018-09-22T09:41:51.947 回答
0

您应该使用google 的workbox 库- 查看这些文档,了解如何使用 workbox-routing 模块缓存路由。

这里还有一些常见的方法或方法来处理任何类型的 Web 应用程序中的缓存。

于 2022-02-09T22:21:40.377 回答