网站添加PWA支持,仅需三步,无视框架的类型

总结起来,网站配置PWA简单步骤为:

  1. 编写 manifest.json;
  2. 编写 serviceWorker.js;
  3. 在 index.html 引入上述两个文件;
  4. 把上述三个文件放在网站根目录(或者同一目录下);
  5. 网站需要部署在https环境才能触发;

这个是我按照本文做的Demo,可以参考一下:https://lx164.netlify.app/ ,如果你的是Vue项目原理也是一样的。

开始之前建议先检查一下你的环境是否支持,支持PWA的浏览器请看这里:https://caniuse.com/?search=pwa

最新内容请以原文为准: https://www.cnblogs.com/LiangSenCheng/p/16702710.html

1、编写 manifest.json

manifest.js 是用来定义名称、icon等信息的;

{
  "name": "完整名称", // 用于安装横幅、启动画面显示
  "short_name": "名称缩写", // 不为空时,桌面icon的名称优先为short_name
  "theme_color": "#f85758", // 主题色
  "background_color": "#f85758", // 背景色
  "display": "fullscreen", // 启动过渡动画, standalone或fullscreen
  "scope": "/",
  "start_url": "/", //启动页面,如果首页是https://www.abc.com/,则直接用“/”即可。
  "icons": [
    {
      "src": "logo72x72.png",
      "type": "image/png",
      "sizes": "72x72"
    },
    {
      "src": "logo96x96.png",
      "type": "image/png",
      "sizes": "96x96"
    },
    {
      "src": "logo144x144.png",
      "type": "image/png",
      "sizes": "144x144"
    }
  ]
}

1.1 字段描述

  • name

完整名称,用于安装横幅、启动画面显示

  • short_name

名称缩写,用于显示桌面Icon名称;不为空时,桌面icon的名称优先为short_name

  • theme_color

主题色,指定 PWA 的主题颜色;通过该属性来控制浏览器 UI 的颜色。比如 PWA 启动画面上状态栏、内容页中状态栏、地址栏的颜色,会被 theme_color 所影响。

注:在指定了 theme_color 的值之后,地址栏依然呈白色。针对这种情况,可以在页面 HTML 里设置 name 为 theme-color 的 meta 标签,例如:,这个标签的色值会覆盖 manifest.json 里设置的 theme_color;

  • background_color

背景色,用来指定启动画面的背景颜色。

  • scope

作用域,通过 scope 属性去限定作用域,超出范围的部分会以浏览器的方式显示。

  • 如果没有在 manifest 中设置 scope,则默认的作用域为 manifest.json 所在文件夹;

  • scope 可以设置为 …/ 或者更高层级的路径来扩大PWA的作用域;

  • start_url 必须在作用域范围内;

  • 如果 start_url 为相对地址,其根路径受 scope 所影响;

  • 如果 start_url 为绝对地址(以 / 开头),则该地址将永远以 / 作为根地址;
    在这里插入图片描述

  • start_url

启动页面,如果首页是https://www.abc.com/,则直接用“/”即可。

  • icons

不同尺寸的icon,一般这个三个尺寸的都要,否则浏览器会出现警告: 72x72、96x96、144x144。

注意:三种尺寸的图片最好是保证图片的真实尺寸是72x72、96x96、144x144, 否则浏览器出现的警告可能会导致无法正常触发地址栏的install按钮。

  • display

可选值有:

  1. fullscreen: 应用的显示界面将占满整个屏幕
  2. standalone: 浏览器相关UI(如导航栏、工具栏等)将会被隐藏
  3. minimal-ui:显示形式与standalone类似,浏览器相关UI会最小化为一个按钮,不同浏览器在实现上略有不同

移动端效果如下:

注:1. 在移动端如果要自动显示 “添加到桌面” 的弹窗,则display的值必须为:fullscreenstandalone;2. 在windows桌面fullscreen和standalone的样式差不多,在移动端就有区别了;

在这里插入图片描述

1.2 浏览器识别效果

浏览器识别后的内容类似下图,直接拿语雀的来举例:

在这里插入图片描述

2、编写 serviceWorker.js

// cache名, 在控制台Application的CaChe下可以看到
const cacheName = "penueling";
// cache文件
const cacheFiles = ["/", "/index.html", "/manifest.json"];

/**
 * 安装 Service Worker
 * install事件是 Service Worker 执行的第一个事件,同一个 Service Worker 只会调用一次
 * 即使 Service Worker 脚本文件只有一个字节不同,浏览器也将视为一个新的 Service Worker
 */
self.addEventListener("install", e => {
  e.waitUntil(
    caches.open(cacheName).then(cache => {
      return cache.addAll(cacheFiles);
    }),
  );
});

/**
 * 激活 Service Worker
 * Service Worker 安装成功之后,会触发activate事件
 * 在这个阶段我们一般做一些清理旧缓存相关的工作
 */
self.addEventListener("activate", (e) => {
  // e.waitUntil(caches.delete(cacheName));
  e.waitUntil(
    caches
      .keys()
      .then((keys) => {
        return Promise.all(
          keys.map((key) => {
            // 清理缓存
            if (cacheName !== key) {
              return caches.delete(key);
            }
          })
        );
      })
      .then(() => {
        console.log("cache deleted");
      })
  );
});

self.addEventListener("fetch", event => {
  event.respondWith(
    caches
      .open(cacheName)
      .then(cache => cache.match(event.request, { ignoreSearch: true }))
      .then(response => {
        return response || fetch(event.request);
      }),
  );
});

注:

  • self: 这是 Service Worker 中特有的全局对象,类似与主线程中的window对象。

  • event.waitUntil: 该函数接受一个Promise对象,它告诉 Service Worker,内部的Promise对象没有resolve之前,缓存工作就还没有完成,安装阶段也就没有完成,并且不应该转移到下一个阶段。

  • caches: CacheStroge对象,它用来控制缓存相关的工作,caches对象的很多方法都是异步的,会返回一个Promise对象,更多详细的API可以参考这里(参考资料 6)。

  • 缓存会保存在cacheName选项下:

在这里插入图片描述

3、编写 index.html

最后一步是在index.html引入即可。

<head>
		// 引入manifest.json
    <link rel="manifest" href="/manifest.json" />
    <script>
    // serviceWorker
    // 检查serviceWorker属性是否可用
    if ("serviceWorker" in navigator) {
      window.addEventListener("load", function () {
        navigator.serviceWorker
          .register("./serviceWorker.js")
          .then(res => console.log("service worker registered"))
          .catch(err => console.log("service worker not registered", err));
      })
    }
  </script>
</head>

注意:

如果serviceWorker.js是注册在域名的根目录下即 /,这意味着我们可以在serviceWorker.js的fetch事件里,捕获到域名下所有的网络请求。换句话说,如果serviceWorker.js文件路径是/module/serviceWorker.js,那么就只能在脚本里处理以/module为开头的网络请求,比如 /module/app.js

4、主动触发安装弹窗(可选)

按照上述的步骤配置好,在浏览器运行后,即可点击浏览器地址栏的安装按钮来触发安装弹窗。也可以通过点击Button来主动触发安装弹窗。

<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()">点击安装</button>

5、本地调试:使用localhost

本地调试是,使用 localhost访问可以看到效果,如 vue 项目的本地调试地址为:localhost:8080,那么直接访问localhost:8080即可;

注意使用 127.0.0.1 访问是没有效果的,或者是 host 127.0.0.1 www.abc.com 访问也是没有效果的。换句话来说就是,用域名或者IP访问,需要是HTTPS才行;

6、线上调试:部署到服务器

通过HTTPS访问,等待浏览器加载完页面,可以看到两个地方的入口;

在这里插入图片描述

5、参考链接

  • 如何在 Vue3 中使用 pwa (Chrome)
  • Vue 项目新增 PWA 支持初次尝试

6、踩坑记录

  1. 建议 manifest.jsonserviceWorker.js 文件放在网站的根目录,否则会出现作用域的问题;
  2. 在Application的manifest.json 出现报错 page does not work offline,可能是因为 serviceWorker.js 中没对fetch进行监听,加上 self.addEventListener('fetch', (e) => {}) 即可;

7、原文 https://www.cnblogs.com/LiangSenCheng/p/16702710.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/547586.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

偏微分方程算法之二维初边值问题(交替方向隐(ADI)格式)

一、研究对象 以二维抛物型方程初边值问题为研究对象&#xff1a; 为了确保连续性&#xff0c;公式&#xff08;1&#xff09;中的相关函数满足&#xff1a; 二、理论推导 2.1 向前欧拉格式 首先进行网格剖分。将三维长方体空间&#xff08;二维位置平面一维时间轴&#xff09…

微服务之CircuitBreaker断路器

一、概述 1.1背景 在一个分布式系统中&#xff0c;每个服务都可能会调用其它的服务器&#xff0c;服务之间是相互调用相互依赖。假如微服务A调用微服务B和微服务C&#xff0c;微服务B和微服务C又调用其他的微服务。这就是构成所谓“扇出”。 如果扇出的链路上某个微服务的调…

图数据库Neo4J入门——Neo4J下载安装+Cypher基本操作+《西游记》人物关系图实例

这里写目录标题 一、效果图二、环境准备三、数据库设计3.1 人物节点设计3.2 关系设计 四、操作步骤4.1 下载、安装、启动Neo4J服务4.1.1 配置Neo4J环境变量4.1.2 启动Neo4J服务器4.1.3 启动Ne04J客户端 4.2 创建节点4.3 创建关系&#xff08;从已有节点创建关系&#xff09;4.4…

数据结构和算法(哈希表和图(A*算法精讲))

一 、哈希表 1.1 哈希表原理精讲 哈希表-散列表&#xff0c;它是基于快速存取的角度设计的&#xff0c;也是一种典型的“空间换时间”的做法 键(key)&#xff1a; 组员的编号如&#xff0c;1、5、19。。。 值(value)&#xff1a; 组员的其它信息&#xff08;包含性别、年龄和…

并查集练习

前言&#xff1a; 关于并查集的一些训练题。 正文&#xff1a; 1.亲戚&#xff1a; #include<bits/stdc.h> using namespace std; const int N5005; int fa[N]; int find(int x){if(xfa[x])return x;return fa[x]find(fa[x]); } void merge(int x,int y){fa[find(x)]fi…

MajorDoMo thumb.php 未授权RCE漏洞复现(CNVD-2024-02175)

0x01 产品简介 MajorDoMo是MajorDoMo社区的一个开源DIY智能家居自动化平台。 0x02 漏洞概述 MajorDoMo /modules/thumb/thumb.php接口处存在远程命令执行漏洞&#xff0c;未经身份验证的攻击者可利用此漏洞执行任意指令&#xff0c;获取服务器权限。 0x03 影响范围 MajorD…

消息队列和分布式消息队列

文章目录 分析系统现状不足中间件消息队列什么是消息队列&#xff1f;应用场景消息队列的模型为什么不直接传输&#xff0c;而要用消息队列&#xff1f;为什么要用消息队列&#xff1f;消息队列的缺点&#xff1f; 分布式消息队列分布式消息队列的优势&#xff1f;消息队列应用…

数字晶体管数字三极管

数字晶体管 指内部集成了电阻的三极管&#xff0c;有PNP和NPN型&#xff0c;也有双管&#xff0c;双管有3种形式&#xff0c;其中一种是PNPNPN。下面以双NPN示例&#xff0c;好处是外面没有电阻&#xff0c;批量应用时&#xff0c;焊点费用就可省下不少。双NPN的用在串口自动下…

SSH客户端工具输入目标地址端口远程失败故障原因和解决方案

问题表现&#xff1a;SSH客户端工具输入目标地址端口远程失败时&#xff0c;出现ssh client 报 algorithm negotiation failed的异常信息。 使用SSH Secure Shell Client连接Linux服务器的SSH的时候有时会出现错误提示信息&#xff1a;ssh algorithm negotiation failed。这是…

HarmonyOS NEXT星河版之实战知乎App评论功能

文章目录 一、目标完成页面二、实战2.1 定义数据2.2 mock数据2.3 封装顶部标题栏2.4 封装评论Item2.5 定义回复组件2.6 主页面 三、小结 一、目标完成页面 二、实战 2.1 定义数据 export interface ReplyItem {avatar: ResourceStr // 头像author: string // 作者id: number …

【数据结构|C语言版】顺序表应用

前言1. 基于动态顺序表实现通讯录1.1 通讯录功能1.2 代码实现1.2.1 SeqList.h1.2.2 SeqList.c1.2.3 Contact.h1.2.4 Contact.c1.2.5 test.c 1.3 控制台测试1.3.1 添加联系人1.3.2 删除联系人1.3.3 修改联系人1.3.4 查找联系人1.3.5 清空通讯录1.3.6 通讯录读档和存档 2. 好题测…

Day 41:动态规划 LeedCode 343. 整数拆分 96.不同的二叉搜索树

343. 整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 思路: 1.确定dp数组&#xff0…

支付系统核心逻辑 — — 状态机(JavaGolang版本)

支付系统核心逻辑 — — 状态机 代码地址&#xff1a;https://github.com/ziyifast/ziyifast-code_instruction/tree/main/state_machine_demo 1 概念&#xff1a;FSM&#xff08;有限状态机&#xff09;&#xff0c;模式之间转换 状态机&#xff0c;也叫有限状态机&#xff08…

OpenWrt 多拨负载均衡不起作用

检查 负载均衡->规则->Https->粘滞模式 是否启动&#xff0c;设置为 否 如果设置为是&#xff0c;那么根据官方描述&#xff1a; 来自相同源 IP 的流量&#xff0c;如果已经匹配过此规则并且在粘滞超时时间内&#xff0c;将会使用相同的 WAN 接口 意思就是如果你同一个…

R语言 并行计算makeCluster报错

问题&#xff1a;使用parallel包进行并行计算&#xff0c; cl <- makeCluster(detectCores()) 出现以下问题&#xff1a; 解决方式&#xff1a;用makeClusterPSOCK命令代替即可 library("future") cl <- makeClusterPSOCK(124, revtunnel TRUE, outfile &…

【QT入门】Qt自定义控件与样式设计之自定义QTabWidget实现tab在左,文本水平的效果

往期回顾 【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件-CSDN博客 【QT入门】Qt自定义控件与样式设计之鼠标相对、绝对位置、窗口位置、控件位置-CSDN博客【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框-CSDN博客 【QT入门】Qt自定义控件与样式…

(一)基于IDEA的JAVA基础16(end)

二维数组 二维数组就是数组里面再放一个数组 语法: <数据类型> [] [] 数组名&#xff1b; 或: <数据类型> 数组名 [] []&#xff1b; 比如这里有5个单位&#xff0c;每个单位员工有20个&#xff0c;他们都在忙几个相同的项目&#xff0c;现在要对某项项目进行操…

html、css、QQ音乐移动端静态页面,资源免费分享,可作为参考,提供InsCode在线运行演示

CSDN将我上传的免费资源私自变成VIP专享资源&#xff0c;且作为作者的我不可修改为免费资源&#xff0c;不可删除&#xff0c;寻找客服无果&#xff0c;很愤怒&#xff0c;&#xff08;我发布免费资源就是希望大家能免费一起用、一起学习&#xff09;&#xff0c;接下来继续寻找…

Linux进阶篇:centos7搭建jdk环境

Linux服务搭建篇&#xff1a;centos7搭建jdk环境 本文主要介绍的是如何是Linux环境下安装JDK的&#xff0c;关于jdk的概念就不做赘述了&#xff0c;相信大家都有所耳闻了&#xff0c;Linux环境下&#xff0c;很多时候也离不开Java的&#xff0c;下面笔者就和大家一起分享如何jd…

【数据结构|C语言版】单链表应用

前言1. 基于单链表实现通讯录1.1 知识要求1.2 功能要求 2. 代码总结2.1 SeqList.h2.2 SeqList.c2.3 Contact.h2.4 Contact.c2.5 test.c 后言 上期回顾&#xff1a;【数据结构|C语言版】单链表 前言 各位小伙伴大家好&#xff01;上期小编讲解了单链表相关知识&#xff0c;在此…