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

news2024/9/22 23:34:52

总结起来,网站配置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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C++][算法基础]求最小生成树(Kruskal)

给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出 impossible。 给定一张边带权的无向图 G(V,E)&#xff0c;其中 V 表示图中点的集合&#xff0c;E 表示图…

JavaScript代码获取浏览器的可视高、文档滚动高和滚动距离

获取浏览器可视高度 var clientHeight 0; if (document.body.clientHeight && document.documentElement.clientHeight) {// 如果同时存在 document.body.clientHeight 和 document.documentElement.clientHeightclientHeight Math.min(document.body.clientHeight,…

【wu-framework-parent】官网介绍

官网地址 介绍 springboot 版本3.2.1 wu-framework-parent 是一款由Java语言开发的框架&#xff0c;目标不写代码但是却能完成功能。 框架涵盖无赖ORM( wu-framework-lazy-orm-spring-starter)、仿生组件 、easy框架系列【Easy-Excel、easy-listener、easy-upsert】 授权框架…

Postgresql源码(125)游标恢复执行的原理分析

问题 为什么每次fetch游标能从上一次的位置继续&#xff1f;后面用一个简单用例分析原理。 【速查】 恢复扫描需要知道当前页面、上一次扫描到的偏移位置、当前页面一共有几条&#xff1a; 当前页面&#xff1a;HeapScanDesc结构中记录了扫到的页面&#xff08;scan->rs_cb…

如何安装Windows版VRTE2.1.0开发环境并进行开发

前言&#xff08;Abstract&#xff09; 本文档记录了如何安装Windows版VRTE2.1.0开发环境并进行开发&#xff0c;并且总结了当部署在安装了比较陈旧版本Linux内核&#xff08;如<4.5&#xff09;和库的板子上所遭遇的困难&#xff0c;如S32V234EVB。 Definitions and Abbre…

自动化测试selenium(2)

目录 WebDriver介绍 WebDriver使用 使用WebDriver驱动操作浏览器(打开一个百度) WebDriver 相关API 定位元素 操作元素 上一篇主要介绍了自动化测试的概念以及selenium的基本原理, 这里我们来讲一下如何利用selenium来写测试用的脚本. WebDriver介绍 Selenium是一个用于…

Zookeeper(从入门到掌握)看完这一篇就够了

文章目录 一、初识 Zookeeper1.Zookeeper 概念2.Zookeeper 数据模型3.Zookeeper 服务端常用命令4.Zookeeper 客户端常用命令 二、ZooKeeper JavaAPI 操作1.Curator 介绍1.Curator API 常用操作&#xff08;1&#xff09;建立连接&#xff08;2&#xff09;添加节点&#xff08;…

对链表的进一步认识

********以下内容均是个人理解&#xff0c;个人语言&#xff0c;仅代表个人观点&#xff0c;希望能对你有所帮助*************** 1.对链表的进一步深入理解分析 &#xff08;1&#xff09;逻辑结构&#xff1a;想象出来的&#xff0c;并不是真实存在的&#xff0c;例如里面的…

idm线程越多越好吗 idm线程数多少合适

IDM&#xff08;Internet Download Manager&#xff09;是一款流行的下载管理软件&#xff0c;它支持多线程下载&#xff0c;这意味着它可以同时建立多个连接来下载文件的不同部分&#xff0c;从而提高下载速度。我们在使用IDM的时候总是有很多疑问&#xff0c;今天我们学习IDM…

HIT The Wiorld,HIT世界官网地址+配置要求+测试时间+加速器分享

HIT The Wiorld&#xff0c;HIT世界官网地址配置要求测试时间加速器分享 NEXON新游《HIT&#xff1a;世界&#xff08;HIT&#xff1a;The World&#xff09;》将在4月17日上线&#xff0c;目前已在官网开启事前预约预创建角色。Hit :the world&#xff08;HIT:世界&#xff…

鸿蒙 Failed :entry:default@CompileResource...

Failed :entry:defaultCompileResource... media 文件夹下有文件夹或者图片名称包含中文字符 rawfile 文件夹下文件名称、图片名称不能包含中文字符

说说你对链表的理解?常见的操作有哪些?

一、是什么 链表&#xff08;Linked List&#xff09;是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的&#xff0c;由一系列结点&#xff08;链表中每一个元素称为结点&#xff09;组成 每个结点包括两个部分&…

Hdevelop编辑器常用功能

1、灰度直方图 【阈值分割】——对应算子threshold 通过菜单【可视化】-【工具】-【灰度直方图】打开&#xff0c;打开后选中【变量窗口】的某张图片即可进行灰度直方图分析。 刚打开并选中某张图片&#xff1a; 调节【最小化】和【最大化】的两个竖线&#xff0c;此时图中绿…

Spectre漏洞 v2 版本再现,影响英特尔 CPU + Linux 组合设备

近日&#xff0c;网络安全研究人员披露了针对英特尔系统上 Linux 内核的首个原生 Spectre v2 漏洞&#xff0c;该漏洞是2018 年曝出的严重处理器“幽灵”&#xff08;Spectre&#xff09;漏洞 v2 衍生版本&#xff0c;利用该漏洞可以从内存中读取敏感数据&#xff0c;主要影响英…

笔记84:关于递归法的一些感悟

题目1&#xff1a;二叉树的前序遍历 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(…

C# 关于进程回收管理的一款工具设计与分享

目录 设计初衷 开发运行环境 Craneoffice ProcessGC 运行主界面 管理任务与策略 其它设置 移动存储设备管理 核心代码-计时器监控 小结 设计初衷 在使用 COM 模式操作 OFFICE 组件的开发过程中&#xff0c;当操作完相关文档后&#xff0c;在某些情况下仍然无法释放掉…

2024.4.19 Python爬虫复习day07 可视化3

综合案例 需求: 已知2020年疫情数据,都是json数据,需要从文件中读出,进行处理和分析,最终实现数据可视化折线图 相关知识点: json json简介: 本质是一个特定格式的字符串 举例: [{},{},{}] 或者 {}python中json包: import jsonpython数据转为json数据: 变量接收json…

Unity类银河恶魔城学习记录12-17 p139 In game UI源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI.cs using UnityEngine;public class UI : MonoBehaviour {[SerializeFie…

kworker(kworker/u2:1,kworker/0:13,kworker/0:1H) 工作队列的命名

1、概述 工作队列是除软中断和tasklet以外最常用的下半部机制之一。工作队列的基本原理是把work(需要推迟执行的函数)交由一个内核线程来异步执行。关于工作队列的具体使用请读者参考其他资料&#xff0c;本文不再概述。 在创建工作队列时,可以通过flag参数指定创建的工作队列…

(四)C++自制植物大战僵尸游戏启动流程

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/ErelL 一、启动方式 鼠标左键单机VS2022上方工具栏中绿色三角按钮&#xff08;本地Windows调试器&#xff09;进行项目启动。第一次启动项目需要编译项目中所有代码文件&#xff0c;编译生成需要一定的时间。不同性能的电…