关于PWA的各种问题

article/2025/9/21 7:36:53

目录

前言

PWA的简单了解和需求

项目manifest.json和sw的无脑生成神器

安装

注册

动态配置manifest.json

IOS无法获取webpack-pwa-manifest中配置的icon

 来自因为需求而产生的静态manifest.json的坑


前言

= — = 以下结论和方法均为个人摸索,涵盖从度娘那儿找到的方法,欢迎大佬们指点。

PWA的简单了解和需求

PWA(Progressive web apps,渐进式 Web 应用)运用现代的 Web API 以及传统的渐进式增强策略来创建跨平台 Web 应用程序。通俗来说,PWA应用是指那些使用指定技术和标准模式来开发的web应用,这将同时赋予它们web应用和原生应用的特性。

需求是根据参数的不同,将所代表的不同项目的icon和名称,以应用的方式自动保存在手机主屏幕上。

这里就需要

  1. manifest.json 网页清单,通过json形式列举了网站的所有信息
  2. service workers 浏览器和网络之间的虚拟代理,它的功能很强大,我这里目前是需要它能提供离线功能(再深层次的功能也暂时没有时间去了解了)

具体可以参考:渐进式 Web 应用(PWA) 

项目manifest.json和sw的无脑生成神器

 首先,先说结论,省略了中间的探索步骤会在后面补上。

最方便的,没有什么问题的方法,就是使用webpack的插件。pwa是谷歌近几年一直在推进的 web 应用新模型。相应的,谷歌当然也会发布关于这个的web插件——Workbox webpack Plugins。

workbox 是由谷歌浏览器团队发布,用来协助创建 PWA 应用的 JavaScript 库。当然直接用 workbox 还是太复杂了,这个插件就很贴心的发布了一个 webpack 插件,能够自动生成 Service Worker 和 静态资源列表。

安装

const worboxWebpackPlugin = require("workbox-webpack-plugin");
new worboxWebpackPlugin.GenerateSW({clientsClaim: true, // 强制等待中的 Service Worker 被激活skipWaiting: true, // Service Worker 被激活后使其立即获得页面控制权
}),

注册

if ("serviceWorker" in navigator) {window.addEventListener("load", () => {navigator.serviceWorker.register("/service-worker.js").then((registration) => {console.log("SW registered: ", registration);}).catch((registrationError) => {console.log("SW registration failed: ", registrationError);});});
}

打包时就能生成service-worker.js和workbox.js两个文件(不包括.js.map)

 另一个插件是webpack-pwa-manifest,用于生成manifest.json文件

// 以下代码来自https://www.npmjs.com/package/webpack-pwa-manifest// 安装
npm install --save-dev webpack-pwa-manifest// 使用
// ES6+
import WebpackPwaManifest from 'webpack-pwa-manifest'// ES5
var WebpackPwaManifest = require('webpack-pwa-manifest')...plugins: [new WebpackPwaManifest({name: 'My Progressive Web App',short_name: 'MyPWA',description: 'My awesome Progressive Web App!',background_color: '#ffffff',crossorigin: 'use-credentials', //can be null, use-credentials or anonymousicons: [{src: path.resolve('src/assets/icon.png'),sizes: [96, 128, 192, 256, 384, 512] // multiple sizes},{src: path.resolve('src/assets/large-icon.png'),size: '1024x1024' // you can also use the specifications pattern},{src: path.resolve('src/assets/maskable-icon.png'),size: '1024x1024',purpose: 'maskable'}]})
]// 输出 manifest.<fingerprint>.json
{"name": "My Progressive Web App","orientation": "portrait","display": "standalone","start_url": ".","short_name": "MyPWA","description": "My awesome Progressive Web App!","background_color": "#ffffff","icons": [{"src": "icon_1024x1024.<fingerprint>.png","sizes": "1024x1024","type": "image/png","purpose": "maskable"},{"src": "icon_1024x1024.<fingerprint>.png","sizes": "1024x1024","type": "image/png"},{"src": "icon_512x512.<fingerprint>.png","sizes": "512x512","type": "image/png"},{"src": "icon_384x384.<fingerprint>.png","sizes": "384x384","type": "image/png"},{"src": "icon_256x256.<fingerprint>.png","sizes": "256x256","type": "image/png"},{"src": "icon_192x192.<fingerprint>.png","sizes": "192x192","type": "image/png"},{"src": "icon_128x128.<fingerprint>.png","sizes": "128x128","type": "image/png"},{"src": "icon_96x96.<fingerprint>.png","sizes": "96x96","type": "image/png"}]
}

大部分字段无需解释,但是让我们分解一下文档并且详细解释这些字段:

  • name: 网站应用的全名。
  • short_name: 显示在主屏上的短名。
  • description: 一两句话解释你的应用的用途。
  • icons: 一串图标信息 — 源URL,大小和类型。确保包含一些图标,这样有一个最合适用户设备的图标可以被选中。
  • start_url: 启动应用的index文档。
  • display: 应用的显示方式;可以是全屏,独立,最小UI或者浏览器。
  • theme_color: UI的主颜色,这是操作系统使用的。
  • background_color: 背景色,用于安装程序时和显示启动画面时。

一份网页清单最少需要name和一个图标 (带有 src, size 和 type)。description, short_name, 和start_url最好要提供。还有在上述列表之外的字段你可以使用 — 请查看网页应用清单参考获得详细情况。

当然,不用插件生成也是可以的,简单的项目可以直接手动创建。

{"name": "js13kGames Progressive Web App","short_name": "js13kPWA","icons": [{"src": "/img/icons/icon-192x192.png","sizes": "192x192","type": "image/png"},{"src": "/img/icons/icon-512x512.png","sizes": "512x512","type": "image/png"}],"start_url": "/index.html","display": "standalone","background_color": "#B12A34","theme_color": "#B12A34"
}

再将文件引入在入口文件html内

<link rel=manifest href=/manifest.json>

用插件就不用加这句,另外用插件的的好处就是会自动帮你把一张图片切成各种格式尺寸。(下图Icons处可看出)

可以从开发者工具上看我们的配置: (图片为参考网站的示例)

如果配置文件不生效,这里就只会显示No manifest detected,同样的,sw也能在浏览器看出来

如果sw没有生效,status的那个绿色小点大概是红色的(我忘了哈哈。。)也可以点击后面的stop停止服务。

在谷歌浏览器的右上角,符合PWA可保存在桌面的网站,会出现黄色框框住的图标

 

当谷歌浏览器上出现这个添加图标时,在兼容pwa的浏览器中,可以自动弹出安装在左面的弹窗。 

手机浏览器目前是发现华为手机(非荣耀)、小米手机的默认浏览器可以自动弹出,其他的就是我在前言说的兼容性问题,均无法自动弹出。 (解决的方案:弹出提示图指引用户手动保存在桌面)

 

还有很多奇奇怪怪的因素会导致连华为(非荣耀)和小米手机都无法默认弹出的问题,后面看情况补上~

动态配置manifest.json

根据需求,需要根据项目参数的不同动态更改manifest配置清单,这就是坑的开始~~

无论是使用webpack-pwa-manifest创建的还是手动创建的,都是在项目打包上线前就需要写好的配置,上线后就固定了。要根据参数的不同就得在项目运行的时候获取到后端数据来更改覆盖manifest.json。

在网上就找到了一种方法,是讲新的manifest文件写成二进制流,替换原来的文件。

参考:pwa应用动态添加到主屏幕

能正常使用,但是出现了两个问题

  1. 华为(非荣耀)和小米手机都无法自动弹窗了 = = (后来采取了全部都使用弹出引导用户手动操作的方式)
  2. 安卓机型无法读取manifest.json :保存时可以获取到名字是因为在更改的时候也改了document.title,icon除了小米默认获取favicon.ico,其他都是奇奇怪怪的icon (到后面也没解决,哈哈哈哈。。)

动态的网页清单,icon下面会解决,解决后反而不见了哈哈哈 尴尬

IOS无法获取webpack-pwa-manifest中配置的icon

一开始以为是ios也无法读取,毕竟官方网站上没写Safari支持。以为和安卓一样是默认读取的docum.title,无关配置文件问题

解决方法: webpack-pwa-manifest自动生成的icon后面都带了hash值,模板文件添加icon路径:

<link rel="apple-touch-icon" href="icon.png" />
// 我这里图方便就不加哈希值了

在根目录下放个icon.png ios就能获取到icon了。

但是每次更改后打包都要加这个就很容易忘,所以我又去翻webpack-pwa-manifest官方文档(manifest.json的官方配置是没有的),发现有个ios的配置参数。

加上后果然是在ios也能获取到icon了,后面还有ios其他的使用方法,但是可以用我就没继续看下去了(实在是脑阔痛。。)

动态的网页清单无法被读取

 来自因为需求而产生的静态manifest.json的坑

前面写的使用webpack-pwa-manifest创建和还是手动创建的网页清单我都叫静态的。通看下来,只要是单一网站,即固定的icon和名称,静态的就似乎没有什么问题。于是需求由 根据参数不同来判断 改成 根据路径不同来判断,这样可以设置不同的manifest来引入对应的入口文件。

但是这个项目还是需要携带参数的,start_url默认是写的当前页面地址(不带参数),或者是写固定的参数。但这都不符合要求,于是最后的最后还是因为这个问题改回了动态manifest的方法。(= = 中间略过了同套代码打包成不同目录的各种问题)

各种参数参考文章:https://www.jianshu.com/p/ddd59c6b29e8


http://chatgpt.dhexx.cn/article/J8tjaV8j.shtml

相关文章

PWA 概念及核心功能的基本介绍

目录 一. PWA 概念介绍 1.1 什么是 PWA&#xff1f; 1.2 为什么会出现 PWA&#xff1f; 1.3 如何判断一个 web 应用是 PWA&#xff1f; 二. PWA 核心功能 2.1 何谓 Service Worker 2.2 注册 Service Worker 2.3 Service Worker 常用事件 2.3.1 install 2.3.2 fetch 2.4 Manife…

PWA系列:第一章 PWA使用场景分析

前言 2018年4月份起微软的应用商店上线第一批PWA应用以来&#xff0c;近一年随着safari开始支持ServiceWorkers&#xff0c;国内浏览器厂商也逐步开始大力加持&#xff0c;到本课程发稿起95%以上的浏览器都支持了PWA的横幅安装。PWA轻应用也逐渐被广大站点使用和推广。 PWA轻应…

PWA(Progressive Web App)入门系列:(一)PWA简介

前言 PWA做为一门Google推出的WEB端的新技术&#xff0c;好处不言而喻&#xff0c;但目前对于相关方面的知识不是很丰富&#xff0c;这里我推出一下这方面的入门教程系列&#xff0c;提供PWA方面学习。 什么是PWA PWA全称Progressive Web App&#xff0c;直译是渐进式WEB应用…

一文读懂什么是 PWA?

什么是 PWA&#xff1f; 1. 概念2. 特性3. 功能4. 优势与劣势5. 发展 1. 概念 PWA 是 Google 于 2016 年提出的概念&#xff0c;于 2017 年正式落地&#xff0c;于 2018 年迎来重大突破&#xff0c;全球顶级的浏览器厂商&#xff0c;Google、Microsoft、Apple 已经全数宣布支持…

PWA(Progressive Web App)入门系列:(三)PWA关键技术Manifest

前言 前面说过&#xff0c;让Web App能够达到Native App外观体验的主要实现技术就是PWA中的manifest技术&#xff0c;本章会详细说明manifest的实现&#xff0c;及各个参数的具体含义&#xff0c;还将了解如何定义Web App的启动图标、启动样式等。 简介 manifest是一种简单的…

一文了解PWA——Progressive Web App

近年来&#xff0c;出现了一种新的应用开发模式——PWA&#xff08;Progressive Web App&#xff0c;即渐进式Web应用&#xff09;。今天就来为大家分享什么是PWA&#xff0c;以及它与小程序的区别、技术原理。 PWA的基本概念和技术原理 PWA是一种基于Web技术的应用开发模式&a…

PWA相关知识

http://www.leiphone.com/news/201606/UEiart497WUzS62u.html 我们真的需要网页版App吗&#xff1f;Google PWA的困局 其实回来的两周里&#xff0c;我对Progressive Web App&#xff08;以下简称 PWA&#xff09;的理解也在不断更新&#xff0c;现在是思考更为全面的时候。 一…

PWA介绍及快速上手搭建一个PWA应用

PWA初次体验 ​ 前言&#xff1a;本示例不用安装任何东西 部分资源来自网络资源及PWA官网&#xff0c;不要把PWA想象的太复杂&#xff0c;跟着示例走一下&#xff0c;你行的。 PWA介绍 一个新的前端技术&#xff0c;PWA&#xff08; 全称&#xff1a;Progressive Web App &…

PWA详解

PWA&#xff08;Progressive Web App&#xff0c;渐进式网页应用&#xff0c;逐渐接近原生app的web app&#xff09;是一种理念&#xff0c;使用多种技术来增强web app的功能&#xff0c;可以让网站的体验变得更好&#xff0c;能够模拟一些原生功能&#xff0c;比如通知推送。在…

PWA应用

一、什么是PWA应用 一个新的前端技术&#xff0c;PWA&#xff08; 全称&#xff1a;Progressive Web App &#xff09;也就是说这是个渐进式的网页应用程序。 官网&#xff1a;https://developers.google.com/web/progressive-web-apps/ 是 Google 在 2015 年提出&#xff0c;…

汽车金融风控企业如何开展风控体系建设

汽车融资租赁主要有直租和回租两种模式&#xff0c;相对回租业务而言&#xff0c;直租因更具盈利优势和用户体验优势而备受瞩目。2017年大搜车、易鑫、优信和瓜子等巨头纷纷涉足直租领域&#xff0c;厂家金融和经销商集团金融机构随后跟上&#xff0c;直租模式在国内开始呈现井…

重磅分享:一份关于车贷的政策性文件分享

关注公众号“番茄风控大数据”&#xff0c;获取更多数据分析与风控大数据的实用干货。 不同领域不同产品的策略跟政策要点肯定是不同的&#xff0c;对车贷而言因为有车这个标的物&#xff0c;车会移动会跑&#xff0c;为了应对这个相关的风险点&#xff0c;我们就会对标的物做跟…

线下产品风控门道真不少

关注 “番茄风控大数据”&#xff0c;获取更多数据分析与风控大数据的实用干货。 “你好&#xff0c;请问这里是肯蝶科技有限公司吗&#xff1f;请问这里&#xff0c;有没有一个叫小明的人在这里上班&#xff1f;” “您好&#xff01;对&#xff0c;这里是肯蝶科技有限公司。…

贷后风控中逾期案件差异化的分配逻辑

在风控精细化运营的当下&#xff0c;贷后工作的开展&#xff0c;越来越需要精细化管理。 今天我们总结梳理了番茄风控之前的内容并结合近期开展的内容&#xff0c;为大家带来一个催收模型优化和逾期案件催收差异化策略的内容&#xff0c;详细请看本文介绍。 一.催收模型 在催收…

GPS北斗定位模块应用实现汽车风控管理

车辆安装GPS北斗定位模块越发常见&#xff0c;无论是车主导航&#xff0c;还是车贷企业的追踪、交警交通的管理等&#xff0c;都是硬性需求和必备工具&#xff0c;在金融风控行业的作用也越来越明显了。 车辆作为资产的一种类型&#xff0c;对资产安全性、实时管控等的需求&am…

金融风控——Python建模

金融风控基础篇 风控的基本概念0 基于AI的风控应用1 什么是信用风险&#xff1f;2 信用模型和欺诈模型的区别3 小额现金贷 vs 大额信贷4 信用评分建模的基本流程5 和风控建模相关的问题有&#xff1a; 数据清洗的全过程什么是 ETL交叉验证的优势及实现方法 建立模型模型的评估方…

风控策略中如何制定差异化利率定价方案

风控策略中如何制定差异化利率定价方案 前言一、框架设计二、流程设计三、方案测算四、策略上线总结 前言 一个产品上线后&#xff0c;随着规模的扩大&#xff0c;基于风险收益的匹配原则&#xff0c;以及差异化营销的管理要求&#xff0c;除了授信额度策略之外&#xff0c;我…

风控策略调优——二手车车龄政策调整

本文的研究背景&#xff1a;为了增加进件和放款&#xff0c;拓展业务规模&#xff0c;如何根据现有的数据表现&#xff0c;调整既有的风控策略。所以&#xff0c;此时博弈的双方再次出现&#xff0c;即:增大业务量的同时&#xff0c;使风险控制在可接受的范围之内。本文以A汽车…

滴滴大数据在汽车金融风控场景中的应用

导读&#xff1a;滴滴独有的出行场景大数据在金融领域有着非常广泛的应用前景&#xff0c;未来可与银行&#xff0c;保险&#xff0c;支付和理财等机构深入合作&#xff0c;帮助传统金融机构提升资源配置效率&#xff0c;降低获客和风险管理成本。出行场景大数据在交易欺诈识别…

汽车金融风控流程设计和机器学习实践

本次分享内容大纲&#xff1a; 01. 汽车金融风控流程设计 汽车金融风控流程设计中需要关注的五个节点&#xff1a;获客、反欺诈、信用评估、额度、利率&#xff0c;整个风控流程的设计一直是围绕这几个点来设计的。 除了上述几点&#xff0c;还需考虑俩个重要因素&#xff1a; …