构建并部署渐进式 Web 应用程序 PWA 简介 结果

2025-05-25

构建并部署渐进式 Web 应用

PWA 简介

结果

在我之前的文章中(感谢你们,它成为了本周的热门文章),我讨论了如何使用 ReactJS 构建一个天气应用。在本文中,你将了解什么是渐进式 Web 应用以及如何将天气应用部署到 PWA 商店。

PWA 简介

渐进式 Web 应用是指将 Web 功能融入类似 App 体验的网站。它的基本含义是,您无需为公司或业务需求构建单独的移动应用,只需构建一个渐进式 Web 应用,即可同时利用 Web 和原生功能。更简单地说,PWA 是 Web 和移动应用的最佳结合。

PWA 的优势

  • 渐进式 Web 应用程序的速度非常快。
  • 访问网站比安装应用程序更容易。
  • 原生应用程序与操作系统完美集成和配置,从而提供更好的性能。
  • 离线访问。
  • 减少数据使用量。

入门

在构建天气应用时,我们将所有注意力都集中在src文件夹上。而构建 PWA 应用时,我们可以专注于public文件夹。让我们先清理这个文件夹中的杂乱内容,直到只剩下index.html文件。

首先在 index.html 中创建一个 Service Worker。Service Worker 是一个在网站后台运行的脚本。这非常有用,因为它即使在应用程序终止后也能运行,因此能够发送通知并支持离线工作。您可以使用以下代码在 index.html文件中root ID的 div 下方创建一个新的 Service Worker

<script>
      if('serviceWorker' in navigator) {
        window.addEventListener('load', () => {
          navigator.serviceWorker.register('./serviceworker.js')
          .then(reg => console.log(reg.scope))
          .catch(err => console.log(err))
        })
      }
</script>
Enter fullscreen mode Exit fullscreen mode

在 public 文件夹中创建一个serviceworker.js文件。在此文件夹中粘贴以下代码:

const CACHE = "dev";
const URL = ["index.html", "offline.html"];
const self = this;
Enter fullscreen mode Exit fullscreen mode

正如我之前提到的,PWA 速度非常快。这是因为它们维护了缓存。因此,我们创建一个变量CACHE并为其命名。然后在变量URL中,我们传入需要缓存的 URL。

现在,此文件中需要执行三个事件:

  • 安装 Service Worker

将 URL 添加到缓存存储中。

self.addEventListener("install", (e) => {
  e.waitUntil(
    caches.open(CACHE).then((cache) => {
      return cache.addAll(URL);
    })
  );
Enter fullscreen mode Exit fullscreen mode
  • 监听请求

匹配页面收到的请求,如果获取成功则返回请求,否则呈现离线页面。

self.addEventListener("fetch", (e) => {
  e.respondWith(
    caches.match(e.request).then(() => {
      return fetch(e.request).catch(() => caches.match("offline.html"));
    })
  );
});
Enter fullscreen mode Exit fullscreen mode
  • 激活服务工作者

删除旧缓存并存储新缓存。

self.addEventListener("activate", (e) => {
  const newCache = [];
  newCache.push(CACHE);
  e.waitUntil(
    caches.keys().then((cacheNames) =>
      Promise.all(
        cacheNames.map((cacheName) => {
          if (!newCache.includes(cacheName)) {
            return caches.delete(cacheName);
          }
        })
      )
    )
  );
});
Enter fullscreen mode Exit fullscreen mode

如果您想了解有关缓存的更多信息,请参阅此链接

为了确保我们npm start在您的终端上测试此命中,请转到您的 chrome 开发者控制台并选择“应用程序”选项卡,然后在“服务工作者面板”上确保选中“重新加载时更新”,然后在“清除存储”面板上点击“清除站点数据”

替代文本
替代文本

现在该构建我们的offline.html页面了。我将使用极简的样式来设计这个页面,但您可以随意地让这个离线页面看起来更加出色。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Weather App</title>
        <link href="https://fonts.googleapis.com/css2?family=Balsamiq+Sans:wght@700&display=swap" rel="stylesheet">
        <style type="text/css">
            html {
                height: 100%;
            }
            body {
                height: 100%;
                background-image: linear-gradient( to right, rgba(255, 100, 0, 0.52), rgba(0, 195, 255, 0.73) );
                display: flex;
                font-size: 30px;
                color: white;
                font-family: 'Balsamiq Sans', cursive;
                align-items: center;
                text-align: center;
                justify-content: center;
            }
            .lds-ripple {
                display: inline-block;
                position: relative;
                width: 80px;
                height: 80px;
            }
            .lds-ripple div {
                position: absolute;
                border: 4px solid #fff;
                opacity: 1;
                margin: -120px 170px;
                border-radius: 50%;
                animation: lds-ripple 1s cubic-bezier(0, 0.2, 0.8, 1) infinite;
            }
            .lds-ripple div:nth-child(2) {
                animation-delay: -0.5s;
            }
                @keyframes lds-ripple {
                0% {
                    top: 36px;
                    left: 36px;
                    width: 0;
                    height: 0;
                    opacity: 1;
                }
                100% {
                    top: 0px;
                    left: 0px;
                    width: 72px;
                    height: 72px;
                    opacity: 0;
                }
            }
        </style>
    </head>
    <body>
        <div class="lds-ripple"><div></div><div></div></div>
        <span>You are currently offline. Please go online to check the weather.</span>
    </body>
</html>
Enter fullscreen mode Exit fullscreen mode

现在,重新加载页面并查看缓存空间。如果看起来像下图所示,恭喜!您已经缓存了网页,以便更快地进行离线访问。

替代文本

如需进一步测试,请转到“网络”选项卡并选择“离线”

替代文本

现在重新加载您的页面以查看缓存的offline.html页面。

替代文本

显现

清单文件是一个简单的 JSON 文件,用于提供有关应用程序的信息。因此,请创建一个manifest.json文件,并将这段代码粘贴到其中。

{
  "name": "Weather App PWA",
  "short_name": "Weather App",
  "icons": [
    {
      "src": "./logo.png",
      "type": "image/png",
      "sizes": "1024x1024"
    }
  ],
  "start_url": ".",
  "display": "standalone",
  "theme_color": "#000000",
  "background_color": "#ffffff"
}

Enter fullscreen mode Exit fullscreen mode

要了解有关清单文件的更多信息,请查看此链接

灯塔

Lighthouse是一款用于评估 Web 应用程序质量的工具。安装它,然后在 Chrome 开发者控制台上点击“生成报告”。现在让我们检查一下我们的应用的运行情况:

替代文本

嗯,根据Lighthouse 的评分,我们的分数还不错。不过你可以看到,还有一项测试没有通过,这导致我们的性能得分一直很低。

替代文本

部署应用程序

为了解决无法将 HTTP 流量重定向到 HTTPS 的错误,我们必须部署我们的应用程序。
打开终端并输入,npm run build在项目目录中创建 build 文件夹。在Netlify和仪表盘上创建一个如下所示的
帐户:

替代文本

只需将您的构建文件夹拖放到此屏幕上,即可在 netlify 上在线部署您的应用程序。

单击生成的URL即可在互联网上真实查看您的应用程序,请尝试断开互联网连接以查看离线页面。

结果

现在,让我们对已部署的应用程序运行 Lighthouse 测试:

替代文本

太棒了!对于我们的 PWA 应用来说,这分数太棒了。
现在,如果你一切顺利,你应该会在 Chrome 浏览器的 URL 搜索栏中看到书签图标旁边有一个+图标。

替代文本

现在,这个按钮将允许您在设备上安装此应用程序。单击+图标并安装该应用程序。

替代文本

断开网络连接即可查看离线页面。

替代文本

太棒了!这个应用现在已内置到你的系统,你也可以在手机上使用了。

现在到了最精彩的部分——在 PWA 商店发布应用。前往PWA 商店并注册。登录后,进入你的个人资料页面,点击最右侧的汉堡图标,然后点击小+符号。输入应用的所有详细信息,包括名称、描述、屏幕截图等。最后,运行 Lighthouse PWA 检查。获得全部三个勾选后,你就可以提交审核了。

瞧!就是这样。审核通过后,您的应用将在 PWA 商店中发布,过一段时间您就可以在“发现”部分找到它。

这篇文章很长,但内容丰富。希望您能够全面了解渐进式 Web 应用 (PWA) 的含义、如何构建 PWA、如何使用 Lighthouse 工具进行测试以及如何部署 PWA 应用。

如有任何疑问,请随时通过我的LinkedIn联系我。代码可以在我的Github上找到。

谢谢你!

文章来源:https://dev.to/kgprajwal/building-a-progressive-web-app-and-deploying-it-10p7
PREV
通过构建天气应用程序来学习 React React 天气应用程序
NEXT
9 个免费/酷炫的 Web API,可用于您的下一个项目