PWA之前端项目,实现可安装、离线缓存、消息推送

概念

Progressive Web Apps 是渐进式Web应用程序,运行在现代浏览器并展现出超级能力。支持可发现,可安装,离线运行,消息推送等APP特有的能力,本项目以最简单的方式封装了以上功能。

SIMPLE-PWA

SIMPLE-PWA 是pwa搭载在vue的示例项目,pwa是一个渐进式web应用概念,不依赖任何框架,vue只是一个实现载体。

查看 PWA推送消息服务器实现

demo

pwa example

请使用android高版本(>5.0)最新版chrome浏览器访问。

目录

运行过程

pwa工作依赖于Service Worker(简称sw)。

任务清单 -> sw注册 -> sw监听/代理

  1. 首先在index.html引入manifest.json和用于注册sw的register.js;
  2. 接着register.js会检测navigator.serviceWorker并将sw.js注册;
  3. 最后sw.js持续监听和代理sw事件。

注意:本项目使用copy-webpack-plugin和sw-precache-webpack-plugin将/src/sw下的文件编译并生成到项目根目录下,因此使用<%= htmlWebpackPlugin.files.publicPath %>变量获取

index.html:

<!DOCTYPE html>
<html>
  <head>
    ...
    <!-- Manifest -->
    <link rel="manifest" href="<%= htmlWebpackPlugin.files.publicPath %>manifest.json">
  </head>
  <body>
    ...
    <!-- Service Worker register -->
    <!-- without webpush -->
    <script src="<%= htmlWebpackPlugin.files.publicPath %>register.simple.js"></script>
    <!-- with webpush -->
    <!-- <script src="<%= htmlWebpackPlugin.files.publicPath %>register.js"></script> -->
  </body>
</html>

register.js:

if (navigator.serviceWorker) {
  navigator.serviceWorker.register('/sw.js')
    .then(function (registration) {
      console.log('Registered events at scope: ', registration)
    })
    .catch(function (err) {
      console.log('ServiceWorker registration failed: ', err)
    })
}

sw.js:

self.addEventListener('some event', e => {
  // do something
})

工作规则

添加到主屏幕

添加到主屏幕既可安装,需要满足以下条件:

  1. 需要 manifest.json 文件
  2. 清单文件需要启动 URL(start_url)
  3. 清单文件至少需要 144x144 的 PNG 图标
  4. 网站正在使用通过 HTTPS(或localhost) 运行的 Service Worker,既sw处于activated状态
  5. 用户需要至少浏览网站两次,并且两次访问间隔在五分钟之上

添加到主屏幕

{
  "name": "PWA Lite",
  "short_name": "PWA",
  "display": "standalone",
  "start_url": "/",
  "theme_color": "#ffffff",
  "background_color": "#ffffff",
  "icons": [
    {
      "src": "./static/appicon_144.png",
      "sizes": "144x144",
      "type": "image/png"
    },
    {
      "src": "./static/appicon_96.png",
      "sizes": "96x96",
      "type": "image/png"
    },

    {
      "src": "./static/appicon_48.png",
      "sizes": "48x48",
      "type": "image/png"
    }
  ]
}

在chrome开发者工具中:

  1. Application/Manifest 检查manifest.json有效性
  2. Application/Service Workers 查看当前sw状态
  3. Application/Service Workers 调试时可勾选"Update on reload"

添加到主屏幕只会显示一次,这在调试过程非常不便。不过,如果你使用chrome调试,可以访问 chrome://flags/#bypass-app-banner-engagement-checks 勾选忽略,这样每次访问都会显示。

离线浏览

sw提供很多种 缓存模式

sw处于activated状态时,可以在sw.js监听fetch事件并拦截和处理任何请求:

// 请求命中缓存时直接返回缓存结果,否则发起请求
self.addEventListener('fetch', e => {
  e.respondWith(
    caches.match(e.request).then(response => {
      if (response != null) {
        return response
      }
      return fetch(e.request.url)
    })
  )
})

离线浏览

在chrome开发者工具中:

  1. Application/Cache/Cache Storage 查看缓存列表
  2. 如果sw拦截成功,在Network中size列可以看到(from ServiceWorker)字样
  3. 在Network中勾选offline然后刷新页面,可以看到已访问过的页面仍然可以访问,并不会出现“未连接到互联网”,这就是离线浏览的威力

关于浏览器缓存模式

  1. from memory cache 内存,只存在浏览器运行时,如base64图片数据和静态资源,不可控
  2. from disk cache 硬盘,长期缓存在硬盘中,如静态资源,不可控
  3. from ServiceWorker sw代理,完全可控

浏览器缓存模式

消息推送

notification
notification

消息推送需要满足以下条件:

  1. sw处于activated状态
  2. 用户允许通知
  3. 询问用户是否允许的对话框只会显示一次,可以在chrome地址栏点击i图标,将“通知”项改为“使用全局默认设置(询问)”即可发起询问对话框
  4. 用户允许后会得到订阅对象,其中endpoint指向谷歌的推送服务器,因此接收时需要全局翻墙

消息推送

// 服务器推送事件
self.addEventListener('push', e => {
  // do something
}

// 推送消息对话框点击事件
self.addEventListener('notificationclick', e => {
  // do something
}

开始

github

# install dependencies
npm install

# serve with hot reload at localhost:8080
npm run dev

# build for production with minification
npm run build

更多专业前端知识,请上 【猿2048】www.mk2048.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
创建一个React Progressive Web App (PWA) 项目通常涉及以下几个步骤: 1. **安装必要的工具**: 首先,确保已经全局安装了Node.js和npm,然后通过`create-react-app`命令初始化一个新的React应用: ``` npx create-react-app my-pwa ``` 或者如果你想要更现代的功能,可以考虑使用如`react-scripts-pwa`等PWA增强的脚手架。 2. **设置基本结构**: 进入项目目录并安装所需的PWA相关库,例如`workbox-build`用于服务工人,`react-responsive`处理响应式设计等: ``` cd my-pwa npm install workbox-build react-responsive --save ``` 3. **配置Service Worker**: 在`src`目录下创建一个`serviceWorker.js`文件,编写服务工人的注册和更新逻辑。这将允许离线访问和推送通知功能。 4. **添加 manifest.json**: 创建一个`manifest.json`文件,描述应用程序的基本信息,如名称、图标、主题色以及重要元数据。 5. **启用路由模式**: 使用像`react-router-dom`这样的库来管理客户端路由,并确保在浏览器标签页上显示PWA图标。 6. **SEO优化**: 确保应用对搜索引擎友好,使用`next-seo`或类似库提供正确的头部元标签。 7. **安装其他PWA特性**: 可能还需要安装其他库,如`sw-precache-webpack-plugin`来生成静态资源的预缓存,或者`offline-plugin`提供更好的离线体验。 8. **测试**: 使用`lighthouse`等工具检查PWA的质量指标,确保所有最佳实践都已满足。 9. **部署**: 将应用程序部署到支持PWA的服务器,如HTTPS,以便Google等搜索引擎可以发现它是PWA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值