目录

前言

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

关于PWA的各种问题相关推荐

  1. iOS progressive Web App (PWA) 技术

    随着 iOS 11.3 的发布,iOS + PWA 的时代终于来了!本文对 iOS 中 PWA 的能力进行了分析,并将其与 iOS 上的 Native App.Android 上的 PWA 进行了深度 ...

  2. vue使用pwa_如何使用HTML,CSS和JavaScript从头开始构建PWA

    vue使用pwa Progressive web apps are a way to bring that native app feeling to a traditional web app. W ...

  3. pwa js_如何在互联网信息亭中实现PWA和Barba.js

    pwa js by Nino Mihovilić 由NinoMihovilić 如何在互联网信息亭中实现PWA和Barba.js (How to Implement a PWA and Barba.j ...

  4. 如何使用Create-React-App和自定义服务人员构建PWA

    Note: This is not a primer on create-react-app or what a service worker is. This post assumes prior ...

  5. pwa+webpack,初探与踩坑

    0.前言 我们都知道pwa是一个新技术.,依靠缓存,离线了还能正常跑,而且秒开.我把以前原生写的小游戏迁移到react,再迁移到webpack+react,最后再升级到pwa.具体介绍不多说,我们开始 ...

  6. PWA项目实战分享(听书APP)

    PWA项目实战分享 - BookPlayer 每天听本书App 因为自己有个需求,特别的痒,昼夜难免.第二天就开始起手做这个项目,利用业余时间,大概持续了10天时间(因为边学边做),从设计到数据(包括 ...

  7. PWA即将推向所有Chrome平台

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ 大多数人应该都听说了微软已经着手在Windows商店中增加PWA,这是一个重磅消息! \\ ...

  8. 经典文摘:饿了么的 PWA 升级实践(结合Vue.js)

    自 Vue.js 官方推特第一次公开到现在,我们就一直在进行着将饿了么移动端网站升级为 Progressive Web App 的工作.直到近日在 Google I/O 2017 上登台亮相,才终于算 ...

  9. 渐进式Web应用(PWA)入门教程(上)

    最近关于渐进式Web应用有好多讨论,有一些人还在质疑渐进式Web应用是否就是移动端未来. 但在这篇文章中我并不会将渐进式APP和原生的APP进行比较,但有一点是可以肯定的,这两种APP的目标都是使用户 ...

  10. Understanding PWA

    原文地址: https://blog.webkong.cn/2018/... What is pwa? Progressive Web App, 简称 PWA,是提升 Web App 的体验的一种新方 ...

最新文章

  1. 让页面只能在微信浏览器里访问
  2. linux 内存日志,性能优化:使用ramlog将日志文件转移到内存中
  3. [改善Java代码]break万万不可忘
  4. 我在美国与“狼”共舞的日子(7)
  5. JavaScript 几种排序算法实现(冒泡、选择、插入、归并、快速排序)
  6. /dev/null Read-only file system 系统无法启动
  7. MessagePack Java 0.6.X List, Map 对象的序列化和反序列化
  8. .NET高级调试 | 通过JIT拦截无侵入调试 C# Emit 生成的动态代码
  9. java trim 不好使_Java String trim无效
  10. nodeJS之二进制buffer对象
  11. 为什么你拼命学,却一无所成?
  12. 转:C语言中如何将二维数组作为函数的参数传递
  13. 1212_MISRA_C规范学习笔记_控制表达式规则要求
  14. PMSM FOC控制 Matlab/Simulink仿真之反Clark变换
  15. SQL -- 触发器(详细)
  16. oracle 生成拼音输入码,c# 生成拼音输入码
  17. 刘冲 擦干你的泪水 试听,刘冲 擦干你的泪水歌词
  18. Android攻城狮ViewFlipper
  19. Git步步进阶---Git tag操作全解析
  20. 看了中国与别国的科研差距后,究竟什么才是真正的科研精神?

热门文章

  1. python--关于requests库的使用(一)
  2. JavaScript 引用数据类型
  3. Idx推出AI系统检测糖尿病视网膜病变
  4. Spring Boot 和 Spring 有什么区别
  5. 基于CNN和序列标注的对联机器人 | 附数据集 开源代码
  6. win10安装redis及redis客户端使用方法
  7. ESP8266(基于arduino平台)每篇一个知识点—1.wifi STA模式连接指定wifi
  8. Galil DMC-3425
  9. LoadRunner 11压测时碰到错误Error: missing newline in E:\xx\RCV.dat
  10. 2021-09-07Zone Apex 和网络服务器重定向