SSR 如何与 PWA 结合

2024-03-07

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

据我了解,

SSR

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

PWA

其中,PWA 需要有一个 shell,该 shell 将被缓存,数据将随之而来。这意味着,即使用户离线,shell也会被加载。

?

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


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

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

当用户第一次进入时/view-url您在 Service Worker 中发送 1. 版本和缓存/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 to /view-url?shell在服务工作者中!

如果您想了解有关此技术的更多信息,我写了一篇有关此问题的文章如何结合 PWA 和同构渲染(SSR)? https://michaljanaszek.com/blog/combine-pwa-and-isomorphic-rendering

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSR 如何与 PWA 结合 的相关文章

  • 在用户离开选项卡或关闭屏幕后,如何检测浏览器何时限制计时器和 websocket 断开连接? (javascript)

    Context 一款作为渐进式网络应用程序发布的游戏 具有计时器 setTimeout setInterval 和 websocket 连接以获得实时通信 怎么了 只要用户留在应用程序中 一切都很好 但是 当用户转到另一个选项卡 另一个应用
  • Nuxt/pwa更新版本

    我正在使用 nuxt pwa 模块创建一个 pwa 我设法在工作箱的安装事件中检测到服务工作人员的更改 plugins pwa update js export default async context gt const workbox
  • Angular 通用元标记在页面源中不可见

    当我查看在我的角度通用项目的构造函数中设置标题和元标记的页面时 标题显示在选项卡中 当我单击 检查元素 并转到时 我可以在 html 中看到元标记和标题到 html 文档的头部 但是 如果您仅单击 查看页面源代码 则不会显示标签 也不会显示
  • IOS 上的 PWA 和离线存储

    我们希望开发一款 应用程序 能够为评估人员记录受损汽车的详细信息 这个想法是让少数评估员拥有公司的 iPad 然后 当汽车损坏并返回车场时 他们可以参观拍照 输入一些详细信息 然后将其上传到主系统中 有些车场可能位于没有互联网覆盖的区域 因
  • Angular SSR NgApexcharts SVG 未定义

    最初我在使用 Angular SSR 时遇到了这个包的问题 因为我在导入时遇到了这个错误Window is not defined 但是 你可以在server ts通过以下方式 const MockBrowser require mock
  • 通过 VPN 在 Android 上创建 WebAPK 失败

    我的公司 VPN 阻止来自 Android 设备的所有外部流量 我正在尝试测试内部托管的 PWA 防火墙内的所有资源 我观察到 尽管通过了 Lighthouse 审核 但我的 PWA 在设备上的 WebAPK 创建过程中失败了 具体来说 安
  • @Injectable(providedIn: 'root') 的语义?

    只是想确保我理解的语义 Injectable providedIn root 在 Angular 6 之前 如果我们从 NPM 导入包含服务的模块 我们会在应用程序模块中声明该模块 以便整个应用程序都可以访问该服务 像这样的事情 impor
  • 使用缓存存储 API 保存自定义响应

    我在用着缓存存储 https developer mozilla org en US docs Web API Cache构建渐进式 Web 应用程序 PWA 我需要一个自定义对象put https developer mozilla or
  • Cypress 与 NextJS SSR - 使用 Axios 拦截 RESTful API

    我正在尝试在我的 SSR next js 应用程序上使用 cypress 和固定装置编写一些测试 该应用程序使用 Axios 连接到 RESTful API 但我在拦截 RESTful API 时遇到了麻烦cy intercept 因为 c
  • 带offline.html 备份页面的Service Worker

    我无法显示offline html 页面 我不断得到The FetchEvent for https my domain com resulted in a network error response a redirected respo
  • 收到无效的 JSON 负载。未知名称 click_action

    所以我目前正在开发一个 PWA 我现在正在与推送通知我已经能够使用以下非常简单的 JSON 结构接收后台和前台通知 message token aValidToken notification title New Content body
  • 如何将基于Reactjs的PWA更新到新版本?

    我正在开发一个基于reactjs 的应用程序 我也做了service worker对其进行设置 后add to home screen 应用程序从不检查服务器是否有新更新 我也尝试过 window location reload true
  • 如何修复此警告“useLayoutEffect”相关警告?

    我将 NextJS 与 Material UI 和 Apollo 结合使用 虽然一切正常 但警告没有消失 在我看来 很多 Material UI 组件都在使用使用布局效果React 会发出警告 错误如下 警告 useLayoutEffect
  • Next JS - 源代码中缺少元标签

    我安装了多个元标记 例如标题 描述 关键字等 但是 它没有在查看源代码中显示这些标签 因此 Facebook 共享卡无法正常工作 我已经安装了og标签 但在 Facebook 上似乎找不到它们Scraper或我的查看来源 然而 它填充在客户
  • 如何使用 Laravel Mix 和 WorkBox?

    我正在尝试为我的应用程序构建一个 PWA 并花了近 48 小时试图弄清楚如何将 Workbox 与 Laravel Mix 结合使用 具有讽刺意味的是 谷歌说 Workbox 是为了让事情变得简单 Buh 好吧 到目前为止我已经弄清楚了 我
  • asp.net 核心、角度 2、PrimeNG

    I use aspnetcore spa 模板 https www npmjs com package generator aspnetcore spa作为创建管理面板的起点 接下来我添加PrimeNG http www primeface
  • Mobile Safari 中的 React PWA 图像上传会破坏应用程序吗?

    我们很惊讶在网上没有发现任何提及此问题的信息 因此我们在此发帖希望能找到解决方案 当我们在使用 iPhone 进行移动 Safari 浏览时遇到此问题 运行下面 2 个易于遵循的测试 一个有效 一个无效 链接在这里https pwa rea
  • 等待在 nextjs 页面中加载 paypal 脚本

    我有这段代码应该呈现 PayPal 按钮 我在 componentDidMount 方法中加载 PayPal 按钮 componentDidMount paypal Buttons createOrder data actions gt r
  • 使用 next.js 进行服务器端渲染与传统 SSR

    我非常习惯 SSR 意味着页面得到完全刷新并从服务器接收完整 HTML 的方法 其中根据后端堆栈使用 razor pub other 进行渲染 因此 每次用户单击导航链接时 它只会向服务器发送请求 整个页面将刷新 接收新的 HTML 这就是
  • 卸载后 Web 应用程序不显示“添加到主屏幕”

    这是我第一次创建网络应用程序 我设法解决了这个问题 所以我得到了实际的 chrome 提示 将其添加到主屏幕 然后我从手机上卸载了该网络应用程序 因为我想将其展示给我的同事 但是 屏幕上不再出现提示 问题 这是有意为之的行为还是我的应用程序

随机推荐

  • 制作应用程序时使用的易失性变量

    我是这个领域的新手 以前 我在进行微控制器编程时 使用易失性变量来避免编译器优化 但我从来没有在变量声明之前看到过这样的 volatile 声明 这是否意味着编译是在 Arago 构建中没有进行任何优化的情况下完成的 这里我有两个问题 如何
  • (图书馆问题)

    我正在使用 Sencha Architect 和 Extjs 4 并按照此处的基本示例进行操作 http geoext org tutorials quickstart html basic example http geoext org
  • 如何将时间跨度转换为小数?

    我的值正好是1 08 43 23在我的文本框中 它等于 1d 08 43 23 我想将该值转换为十进制 以便将其乘以另一个十进制值 但是当我使用Convert ToDecimal它返回错误 输入字符串的格式无效 Is Convert ToD
  • 为 Asp.net core web api 启用 HTTPS 安全连接

    我有使用 ASP NET Core 2 1 创建的 REST API 应用程序 REST API 由 WebHostBuilder 创建并由 Kestrel 托管 Startup Kernel kernel restApiServer ne
  • Ajax 自动完成(或自动建议)与 TAB 完成/自动填充类似于 shell 命令行完成?

    我正在实现 AJAX 自动完成 自动建议功能 我不仅想要执行与用户键入的内容类似的常规显示建议 而且还想让用户完成部分完成以节省键入 所以 想象我的字典中有这些值 青苹果 青梨 绿色水果 蓝天 蓝色水 蓝色唤醒 如果用户输入 g 建议应该是
  • GetElementById() 找不到标签?

    我有一个有效的 XML 文件正在由以下 NET C windows 服务读取 有问题的标签 u1 000 绝对在元素中
  • 使用 CUDA 占用计算器

    我正在使用占用率计算器 但我无法理解如何获取每个线程的寄存器 每个块的共享内存 我阅读了文档 我使用 Visual Studio 所以在 CUDA 构建规则下的项目属性中 gt 命令行 gt 附加选项 I添加 ptxas options v
  • Selenium WebDriver 如何解决陈旧元素引用异常?

    我在 Selenium 2 Web 驱动程序测试中有以下代码 该代码在调试时有效 但在构建中运行时大多数情况下都会失败 我知道这一定与页面未刷新的方式有关 但不知道如何解决它 因此任何有关我做错了什么的指示都会受到赞赏 我使用 JSF pr
  • ToArrayAsync() 抛出“源 IQueryable 未实现 IAsyncEnumerable”

    我在 ASP NET Core 上有一个 MVC 项目 我的问题与 IQueryable 和异步有关 我编写了以下搜索方法IQueryable
  • 如何在客户端获取Tomcat JSESSIONID?

    我想在客户端获取Tomcat的JSESSIONID 那可能吗 如果是 怎么办 Thanks 这取决于 JSESSIONID 的传输方式 如果它是会话 cookie 请参阅如何使用javascript获取cookie http www w3s
  • 如果从数据库加载两次,hibernate 是否会加载同一实例的两个单独副本?

    我知道关于延迟加载有很多不同的问题 但我的问题有点不同 假设我有一个实体 A 其中有实体 B 的集合 类似地 在实体 B 中 我有 A 的集合 在这两种情况下 都使用lazy true 选项 Entity A的实例 aA 有 gt Set
  • 如何安装GWT浏览器插件?

    我如何安装适用于 Chrome 的 GWT 浏览器插件 https chrome google com webstore detail gwt developer plugin jpjpnpmbddbjkfaccnmhnkdgjideiei
  • 如何清除应用程序中的远程通知?

    有没有办法从 iPhone 屏幕顶部向下滑动时清除通知横幅中的远程通知 我尝试将徽章编号设置为零 application applicationIconBadgeNumber 0 代表中didFinishLaunchingWithOptio
  • 在代码中访问编译器常量

    是否可以在如下代码中使用编译器定义的常量 If DEALER DEBUG ID12345 Then If Dealer ID DEALER DEBUG Then Do something End If End If 我正在运行批处理 但我的
  • 如何从 MediaCodec 解码器的输出中提取 PCM 样本

    我正在尝试从解码的 mp4 缓冲区获取 PCM 样本以进行进一步处理 我首先从使用手机相机应用程序录制的视频文件中提取音轨 并且确保当我获得 audio mp4 mime 键时已选择音轨 MediaExtractor extractor n
  • Python 中日期的正则表达式:英国:日-月-年

    我正在尝试使用 python 编写一个 REGEX 来根据 英国 日 月 年 识别日期 我写了一些随机字符串 如下所示 string these are just rubbish 01 13 00 00 44 44 11 2 2222 24
  • 使用 CodeIgniter 的动态表单生成器[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我计划为不同的表单布局构建一个动态表单 http bootsnipp com forms version 3 http bootsnipp
  • python字典中的5个最大值

    我有一本这样的字典 A a 10 b 843 c 39 我想获取这个字典的 5 个最大值并用它存储一个新的字典 为了获得最大值 我做了 max A iteritems key operator itemgetter 1 0 也许这是一件容易
  • 有没有办法强制 conda install 安装软件包及其依赖项而不是给出错误

    我有一个正在安装软件包的 miniconda 环境 我想安装一个软件包 并且我知道可能会存在一些冲突 但是要解决这些冲突 要么需要安装缺少的软件包 要么需要降级 升级另一个软件包 并且它已成为一个尝试降级 升级和安装软件包的漫长兔子洞 有没
  • SSR 如何与 PWA 结合

    如何使用 PWA 渐进式 Web 应用程序 进行 SSR 服务器端渲染 据我了解 SSR SSR 运行时将加载页面并运行必要的脚本以将数据加载到页面上 然后返回渲染后的html 这对于不会运行 javascript 的网络爬虫和无脚本的浏览