发布于 2025-12-08 7 阅读
0

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

构建并部署渐进式 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