web 2 pwa

2023-08-18 by 暮云

这是在今天考试后,总结自己让春树暮云适配PWA的一段经历和教程。枯燥无味

什么是PWA

PWA(Progressive Web App)是一种用于开发Web应用程序的技术和方法。PWA结合了传统的Web应用程序和原生移动应用程序的最佳特性,旨在提供更好的用户体验。

PWA可以通过浏览器访问,不需要安装在设备上,但它们具有类似原生应用程序的功能和特性。PWA利用Web浏览器提供的API,如 Service WorkersWeb App Manifest 等,使应用程序可以脱机工作、推送通知,并添加到主屏幕。这些特性使得PWA可以在不同平台和设备上以一致的方式运行,并且无需从应用商店下载和安装。

深入了解 PWA

检查浏览器是否支持PWA

我建议在 caniuse.com 上查询某浏览器是否支持 PWA
网页链接

打开网站后页面大概长这样▽
caniuse.com 上的截图

网站适配PWA

简单来说,网站适配PWA大概分以下几个步骤。

  1. 全站https化
  2. 编写 manifest.json 和 sw.js
  3. 准备 192×192px 的应用图标和 512×512px 的应用图标
  4. 在网站相关页面引入 manifest.json 文件和 sw.js 文件

接下来是自己的实操。

manifest.json

{
  "name": "春树暮云", // 用于安装横幅和启动画面显示的名称
  "short_name": "春树暮云", // 不为空时,为桌面PWA应用程序的名称
  "theme_color": "#f6ffff", // 主题色
  "background_color": "#f6ffff", // 背景色
  "display": "fullscreen", // 启动过渡动画, standalone或fullscreen
  "scope": "/",
  "start_url": "/", //启动页面
  "icons": [
        {
            "src": "192.png", //根据自己图标的路径改写,下同
            "sizes": "192x192",
            "type": "image/png",
        },
        {
            "src": "512.png",
            "sizes": "512x512",
            "type": "image/png"
        }
  ],

上面的代码可以根据实际情况,进行对应更改。


sw.js

'use strict' //声明整个脚本处于严格模式
const cacheName = 'PWA-cache'; // 缓存名字
const startPage = 'https://me.lengyandong.eu.org'; // 首页地址
const offlinePage = 'https://me.lengyandong.eu.org';// 离线首页地址
const filesToCache = [startPage, offlinePage];

const neverCacheUrls = [/admin/];//从不缓存的目录,如typecho中的"admin"文件夹

self.addEventListener('install', function(e) {
  console.log('Cache event!')
  e.waitUntil(
    // 安装时,对需要缓存的文件进行缓存
    caches.open(cacheStorageKey).then(function(cache) {
      console.log('Adding to Cache:', cacheList)
      return cache.addAll(cacheList)
    }).then(function() {
      console.log('Skip waiting!')
      return self.skipWaiting()
    })
  )
})

self.addEventListener('activate', function(e) {
  // 判断地址是不是需要实时去请求,是就继续发送请求
  console.log('Activate event')
  e.waitUntil(
    Promise.all(
      caches.keys().then(cacheNames => {
        return cacheNames.map(name => {
          if (name !== cacheStorageKey) {
            return caches.delete(name)
          }
        })
      })
    ).then(() => {
      console.log('Clients claims.')
      return self.clients.claim()
    })
  )
})

self.addEventListener('fetch', function(e) {
  // 匹配到缓存资源,就从缓存中返回数据
  e.respondWith(
    caches.match(e.request).then(function(response) {
      if (response != null) {
        console.log('Using cache for:', e.request.url)
        return response
      }
      console.log('Fallback to fetch:', e.request.url)
      return fetch(e.request.url)
    })
  )
})

引入文件

<head>标签中引入 manifest.json

<link rel="manifest" href="manifest.json" crossorigin="anonymous" />

然后,在<body>标签中判断是否注册了serviceWorker

<script type="text/javascript">
    if (navigator.serviceWorker != null) {
        navigator.serviceWorker.register('sw.js')
            .then(function(registration) {
                console.log('Registered events at scope: ', registration.scope);
            }).catch(function(err) {
                console.log('Registered events at fail: ', err);
            });
    }
</script>

此时,PWA已经适配完成了。

但是,在 typecho 或 wordpress 等博客系统中,容易产生因各类原因造成的适配不成功的情况。此时,可以选择引导用户手动配置PWA,例如,通过点击按钮配置PWA。

代码如下:

<script>
      var deferredPrompt = null;
  
        // 判断用户是否安装此应用:beforeinstallprompt,如果用户已经安装过了,那么该事件不会再次触发
      // 需要卸载,然后重新打开浏览器才能再次触发
    window.addEventListener("beforeinstallprompt", e => {
      e.preventDefault();
      deferredPrompt = e;
    });
    
      // 安装完成后触发,即点击安装弹窗中的“安装”后被触发
    window.addEventListener("appinstalled", () => {
      deferredPrompt = null;
    });
  
  
    function addToDesktop() {
      // 调用prompt()方法触发安装弹窗
      deferredPrompt.prompt();
      deferredPrompt = null;
    }
</script>
 
<button onclick="addToDesktop()">点击安装PWA</button>

演示如下:
https://me.lengyandong.eu.org/pwa.php


最后,为避免兼容问题,建议在部署PWA时,将 manifest.json和 sw.js 文件置于网站根目录下。

仅有 1 条评论
  1. 由于服务器故障,本文的图片和链接均已失效,恢复时间待定。向各位读者表示歉意。

添加新评论