GVKun编程网logo

前端每周清单:jQuery 3.2发布,滴滴采用Vue 2.0重构Web App、饿了么 PWA 实践经验分享

1

以上就是给各位分享前端每周清单:jQuery3.2发布,滴滴采用Vue2.0重构WebApp、饿了么PWA实践经验分享,同时本文还将给你拓展2022年了,还不了解PWA?教你VuePress博客如何快

以上就是给各位分享前端每周清单:jQuery 3.2发布,滴滴采用Vue 2.0重构Web App、饿了么 PWA 实践经验分享,同时本文还将给你拓展2022 年了,还不了解 PWA ? 教你 VuePress 博客如何快速兼容 PWA、nuxt.js pwa 的启动画面添加到主屏幕 ios 和 Apk pwa、PWA “start_url 确实响应了,但不是通过 service worker” -- NextJS-PWA、PWA:防止 url 在 PWA 中打开等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

前端每周清单:jQuery 3.2发布,滴滴采用Vue 2.0重构Web App、饿了么 PWA 实践经验分享

前端每周清单:jQuery 3.2发布,滴滴采用Vue 2.0重构Web App、饿了么 PWA 实践经验分享

前端每周清单:jQuery 3.2发布,滴滴采用Vue 2.0重构Web App、饿了么 PWA 实践经验分享 为InfoQ中文站特供稿件,首发地址为这里;如需转载,请与InfoQ中文站联系。从属于笔者的Web 前端入门与工程实践。更多阅读清单请转向往期索引。

前端每周清单:前端每周清单:jQuery 3.2发布,滴滴采用Vue 2.0重构Web App、饿了么 PWA 实践经验分享

新闻热点

前端领域最新动态

  • 《Facebook 发布 Create React Native App》:类似于 Create-React-App,Create React Native App 能够为开发者快速创建零配置的 React Native 项目,并且与基于 Expo 构建了完整的可以屏蔽底层原生代码细节的 React Native 项目,使得开发者可以快速尝试上手 React Native 项目 。同时,开发者也可以使用 npm run eject命令将项目切换到全配置状态,以方便自行添加原生组件。 ( http://6me.us/29r )

  • 《2017 React 大会成功举办》:2017 年 React Conf 于 3 月 13 日、14 日成功举办,会上来自世界各地的开发者就 React Fiber、Flow、Performance、React Native 等多个主题发表了演说与讨论,推荐选择自己喜欢的演讲视频观看。( http://conf.reactjs.org/lives... )

  • 《jQuery 3.2.0 发布》:jQuery 3.2.0 中包含了一系列的错误修复、性能提升以及部分弃用 API 的彻底移除 。重大的更新包括添加了对于自定义 CSS 属性操作的支持,彻底移除了 isArray、nodeName 等方法以及修复了.width()等部分方法中的问题。( http://6me.us/BN8 )

  • 《Sketch 宣布开源其文件格式》:随着近日发布的 Sketch 43 版本,Sketch 宣布开源其文件格式,这也意味着未来可能会有人基于该格式开发 Windows 版本应用或者简单的 Sketch 文件浏览器。鉴于其文件格式为 JSON,我们也可以畅想未来会出现自动构建的 Web Service。( http://6me.us/DyAYEC )

  • 《Chromium 即将支持 APNG》:该 Commit 会为 Chromium 添加 APNG 格式的支持,该格式可以逐步替换现存的 Gif 格式 。( https://parg.co/bO9 )

  • 《Kotlin 1.1新增协程、类型别名特性,提升了对JavaScript的支持》:Kotlin的新版本引入了多项新的语言特性(其中最值得注意的就是协程),同时还提升了对其JavaScript目标环境的支持。( http://www.infoq.com/cn/news/... )

开发教程

步步为营,掌握基础技能

  • 《Flexbox 语法清单》:该网页提供了交互式的 CSS Flexbox 教程,详细介绍了 Flexbox 的使用语法与经典案例。( http://yoksel.github.io/flex-... )

  • 《Sketch:React Native 的 Playground 》:随着 Create React Native App 的发布,Expo 发布了能够在线编辑 React Native 应用的工具 Sketch。开发者可以在 Web 上直接编辑 React Native 应用代码,或者拖拽方式加入组件,然后通过 Expo 客户端完成本地预览。( http://6me.us/aGFX )

  • 《编写 JavaScript 框架:客户端路由》:本文是编写 JavaScript 框架系列的最后一篇,主要着眼于讨论如何实现 JavaScript 客户端路由及其与服务端路由的区别。( https://parg.co/bOL )

  • 《30 天学习 30 个 VR 项目》:本系列作者介绍了从 0 到 1 如何开发 30 个常见的 VR 项目,从最基础的图片浏览、视频播放,到交互性动画等等 。( https://risonsimon.com/days-i... )

  • 《CORS 详细指南》:本文是对于浏览器中跨域访问协议 CORS 进行详细介绍,并且以完整的代码交互示例演示 CORS 协议的效果与使用方法。( https://parg.co/bOF )

  • 《Angular的模块间通信》:模块是Angular的构建单元,Angular应用程序的所有可视化元素也是由模块构建的。当我们把模块拆散成更小的模块时,我们就要确保它们可以把数据传来传去。到那时候,恰当地模块间通信机制就成了我们应用程序的基础,可以让所有的数据都保持同步状态。( https://parg.co/bOD )

工程实践

立足实践,提示实际水平

  • 《前端代码测试概述》:作者在本系列文章中介绍了前端代码测试的相关概念与实践技巧,包括了单元测试、集成测试、端到端测试等多个方面。( http://6me.us/posk )

  • 《以组件为中心的 React 懒加载》:React Loadable 是以组件为中心的懒加载框架,其基于 Webpack 2 提供的 import 提供的异步代码分割与加载功能进行了一系列的封装。( http://6me.us/mNHi )

  • 《另一种 CSS 压缩思路》:本文作者提出了一种新的 CSS 压缩思路,有可能会损坏原有的 CSS 文件,不过其压缩比率相较于现有的通用 CSS 压缩策略会更为优秀。( https://luisant.ca/remynifier )

  • 《来自 Vixlet 的 React 优化策略》:在过去的数年中,来自 Vixlet 的前端开发团队一直使用 React 与 Redux 的开发架构,本文即是该团队分享其在开发过程中发现的 React 优化策略的介绍。( http://6me.us/dx5 )

  • 《PWA 在饿了么的实践经验》:本篇旨在和大家分享「饿了么 M 站」(https://h5.ele.me/msite/)在 PWA 改造中的实践经验。涉及到的方面有:PWA 线上部署的准备工作、多页应用的 prerender 优化、实践过程中踩到的(和推进解决的)坑。( https://parg.co/bO7 )

  • 《滴滴 webapp 5.0 Vue 2.0 重构经验分享》:滴滴的 webapp 是运行在微信、支付宝、手 Q 以及其它第三方渠道的打车软件。借着产品层面的功能和视觉升级,我们用 Vue 2.0 对它进行了一次技术重构;本文即是本次重构中的经验分享。( https://github.com/DDFE/DDFE-... )

深度阅读

深度思考,升华开发智慧

  • 《2017 成为专业 Web 开发者的学习路线图》:作者在此文中以图表的方式展现了 2017 年中如果想成为专业的 Web 开发者,应该在 Web 前端、服务端以及 DevOps 领域所需要学习到的技术栈以及进阶路线图。( http://6me.us/W0k )

  • 《关于 JWE 安全漏洞的讨论》:JSON Web Token 是基于 JSON 的访问令牌创建标准(RFC 7519),本文则是介绍了 JWE 面对的 Invalid Curve Attack 原理以及受影响的开源库等内容。( http://6me.us/D0iKp )

  • 《wasm_lua》:wasm_lua 提供了能够运行于 WASM 环境下的 Lua 虚拟机,未来基于 Lua 构建前端框架也是个可行的选择 。( https://github.com/vvanders/w... )

  • 《U.S. Web 设计标准》:近日 U.S. 官方网站的样式与视觉设计指南 1.0.0 版本发布,包含了大量的 Bug 修复与反馈修正。( https://parg.co/bO1 )

  • 《Preact 内部原理探秘》:Preact 是提供了类似于 React API 不过速度更快、包体更小的 React 替代包,本系列文章是 Preact 的开发者介绍其内部工作原理 。( https://parg.co/bOj )

  • 《扩展JS应用在架构性取舍上应关注八点要素》:如果想要构建可扩展的软件,可以从很多角度来思考软件架构。但是如果每个角度都去考虑,根本不可能做出想要的软件。这就是为什么需要从架构的角度对设计进行取舍:取我们最需要的,舍次要的。。( https://parg.co/bOn )

开源项目

乐于分享,共推前端发展

  • 《手淘发布 Atlas》:手机淘宝安卓客户端容器化框架 Atlas 正式宣布开源。Atlas由阿里巴巴移动团队自研,以容器化思路解决大规模团队协作问题,实现并行开发、快速迭代和动态部署,适用于Android 4.x以上系统版本的大小型App开发。 (https://github.com/alibaba/at...

  • 《Animista》:Animista 是开箱即用的 CSS 动画库,其作者还发布了非常易用的在线预览与选择站点,适合于设计人员选择合适的动画效果。( http://animista.net/ )

  • 《Quokka.js》:Quokka 能够帮助我们在常用的编辑器(譬如 VSCode)中快速建立原型试验场,包括了行内错误提示、代码测试与覆盖率提示、富文本输出格式化等等。( https://quokkajs.com/ )

  • 《Guetzli》:Google 宣布开源新的 JPEG 编码器 Guetzli,与现有的压缩编码工具相比,其能够减少近 35% 的文件尺寸而依然保持图片质量。( http://6me.us/AM7a )

  • 《wasm-loader》:wasm-loader 是能够用于 Webpack 的 WASM 二进制模块导入工具,其能够允许你在 JavaScript 代码中导入 wasm 格式文件并且将二进制文件打包成为 JS Bundle 的一部分 。( https://github.com/ballercat/... )

巅峰人生

一览众山,聆听巅峰故事

2022 年了,还不了解 PWA ? 教你 VuePress 博客如何快速兼容 PWA

2022 年了,还不了解 PWA ? 教你 VuePress 博客如何快速兼容 PWA

前言

在 《一篇带你用 VuePress + Github Pages 搭建博客》中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档。

本篇我们讲讲如何兼容 PWA。

PWA

PWA,英文全称:Progressive Web Apps, 中文翻译:渐进式 Web 应用

引用 MDN 的介绍:

PWA 指的是使用指定技术和标准模式来开发的 Web 应用,这同时赋予它们 Web 应用和原生应用的特性。

例如一方面,Web 应用更加易于发现:相比于安装应用,访问一个网站显然更加容易和迅速。你还可以通过链接来分享 Web 应用。

另一方面,原生应用与操作系统可以更加完美的整合,也因此为用户提供了无缝的用户体验。你可以通过安装应用使得它在离线的状态下也可以运行;相较于使用浏览器访问,用户也更喜欢通过点击主页上的图标来访问它们喜爱的应用。

PWA 赋予了我们创建同时拥有以上两种优势的应用的能力。

体验

如果你之前没有了解过 PWA,大概率可能也不明白这是个什么效果,没有关系,我们直接看一个 PWA 应用示例,我们打开 https://m.weibo.cn/,这里是在电脑端打开的:

我们可以看到,在地址栏还有一个安装图标,点击一下,就会弹出安装应用的选项框:

我们点击安装后,该页面会自动关闭,然后开启一个应用窗口:

同时,打开 Mac 的启动台,我们会看到已经添加了微博的图标:

点击就会直接打开上面的应用窗口。

简单的来说,我们兼容 PWA,就是想要实现这样的桌面图标的功能,当然了, PWA 其他还有离线缓存、推送通知等功能,这里就不多说了。

开启 PWA

开启 PWA,需要注意三个点:

  1. 提供一个 manifest.json 文件,描述应用的名称、图标等信息
  2. 开启 Service Worker,这个交给现有的 PWA 插件来实现
  3. 开启 HTTPS

实践

1. 安装

插件地址:https://v1.vuepress.vuejs.org/zh/plugin/official/plugin-pwa.html

yarn add -D @vuepress/plugin-pwa
# OR npm install -D @vuepress/plugin-pwa

2. 修改 config.js

module.exports = {
  head: [
    [''link'', { rel: ''icon'', href: ''/logo.png'' }],
    [''link'', { rel: ''manifest'', href: ''/manifest.json'' }],
    [''meta'', { name: ''theme-color'', content: ''#3eaf7c'' }],
    [''meta'', { name: ''apple-mobile-web-app-capable'', content: ''yes'' }],
    [''meta'', { name: ''apple-mobile-web-app-status-bar-style'', content: ''black'' }],
    [''link'', { rel: ''apple-touch-icon'', href: ''/icons/apple-touch-icon-152x152.png'' }],
    [''link'', { rel: ''mask-icon'', href: ''/icons/safari-pinned-tab.svg'', color: ''#3eaf7c'' }],
    [''meta'', { name: ''msapplication-TileImage'', content: ''/icons/msapplication-icon-144x144.png'' }],
    [''meta'', { name: ''msapplication-TileColor'', content: ''#000000'' }]
  ],
  plugins: [
    [
      ''@vuepress/pwa'',
      {
        serviceWorker: true,
        updatePopup: {
            message: "发现新内容可用",
            buttonText: "刷新"
        }
     }
    ]
  ]
}

3. 添加 manifest.json 等资源

接下来我们添加所需要的资源,在 .vuepress目录下建立 public文件夹,然后添加所需要的文件如 manifest.json文件:

{
    "name": "TypeScript中文文档",
    "short_name": "TypeScriptDocs",
    "display": "standalone",
    "background_color": "#fff",
    "start_url": "/learn-typescript-test/",
    "scope": "/learn-typescript-test/",
    "description": "TypeScript 中文文档 进阶教程",
    "icons": [{
      "src": "logo52.png",
      "sizes": "52x52",
      "type": "image/png"
    },{
       "src": "logo288.png",
       "sizes": "288x288",
       "type": "image/png"
    }]
  }

这其中字段的具体含义,可以查看 MDN 的 Manifest 介绍。

要注意其中的 start_urlscope,如果你使用的是 GitHub 或者 Gitee 仓库的 Pages 服务,并且地址上带了仓库名,你需要将这里的learn-typescript-test替换为你的仓库名,如果是直接的域名,start_url 写成 \scope写成 .或者直接不写。

然后是补齐所需要的图标图片:

4. 部署生产环境测试

虽然我们在上篇《VuePress 博客如何开启本地 HTTPS 访问》 讲了如何在本地开启 HTTPS,但是因为我们使用的这个插件只有在生产环境才会开启 Service Worker:

所以呢,我们部署到线上看一下效果,如果顺利的话,你就会看到地址栏上也出现了安装图标:

常见问题

但如果没有显示该图标,我们可以查看开发者工具里的「应用」 -「清单」,其中会显示出现的错误:

根据这里的报错进行排查。

如果出现了可安装性中的:

为检测到任何匹配的 service worker。您可能需要重新加载页面,或者检查当前页面的 service worker 是否也控制了清单错误中的起始 URL。

这也有可能是因为你的 start_urlscope 设置的有问题。

正常安装后,如果打开应用发现背景色是 Vue 绿色,比如这种:

这是因为你忘记修改 config.js 里的背景色了:

系列文章

博客搭建系列是我至今写的唯一一个偏实战的系列教程,预计 20 篇左右,讲解如何使用 VuePress 搭建、优化博客,并部署到 GitHub、Gitee、私有服务器等平台。本篇为第 23 篇,全系列文章地址:https://github.com/mqyqingfeng/Blog

微信:「mqyqingfeng」,加我进冴羽唯一的读者群。

如果有错误或者不严谨的地方,请务必给予指正,十分感谢。如果喜欢或者有所启发,欢迎 star,对作者也是一种鼓励。

nuxt.js pwa 的启动画面添加到主屏幕 ios 和 Apk pwa

nuxt.js pwa 的启动画面添加到主屏幕 ios 和 Apk pwa

如何解决nuxt.js pwa 的启动画面添加到主屏幕 ios 和 Apk pwa

嘿,我正在尝试为我的 nuxt js 项目设置启动画面,我已经尝试过所有像这样的元标记: ————

{link rel:"apple-touch-startup- image",media:"screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)",href:"splash/launch-2688x1242.png"}

———-

在我的 nuxt-config.js 中的所有尺寸中,但不工作, 如果你知道如何为我的 nuxt 项目设置启动画面,请帮助我

解决方法

为此,您可以自定义加载指示器:https://nuxtjs.org/docs/2.x/features/loading/#the-loading-indicator-property
并使用自定义的,您可以在其中设计您的启动画面

不确定它是 PWA 的事实是否需要额外的工作,但如果是,这个应该解决它:https://pwa.nuxtjs.org/icon/

PWA “start_url 确实响应了,但不是通过 service worker” -- NextJS-PWA

PWA “start_url 确实响应了,但不是通过 service worker” -- NextJS-PWA

如何解决PWA “start_url 确实响应了,但不是通过 service worker” -- NextJS-PWA

我一直在使用 next-pwa (npm link) 来自动化服务工作者设置,以便在 NextJS 中设置 PWA。在大多数情况下,一切都很顺利。但是,我终生无法弄清楚如何解决灯塔审计中仍然出现的一个错误(如下所示)。我已经阅读了大量帖子并尝试实施了几种不同的解决方案,但到目前为止还没有骰子。


enter image description here


这是由sw.js自动创建的NextJS

  1. // sw.js
  2. if (!self.define) {
  3. const e = e => {
  4. ''require'' !== e && (e += ''.js'');
  5. let n = Promise.resolve();
  6. return (
  7. i[e] ||
  8. (n = new Promise(async n => {
  9. if (''document'' in self) {
  10. const i = document.createElement(''script'');
  11. (i.src = e),document.head.appendChild(i),(i.onload = n);
  12. } else importScripts(e),n();
  13. })),n.then(() => {
  14. if (!i[e]) throw new Error(`Module ${e} didnt register its module`);
  15. return i[e];
  16. })
  17. );
  18. },n = (n,i) => {
  19. Promise.all(n.map(e)).then(e => i(1 === e.length ? e[0] : e));
  20. },i = { require: Promise.resolve(n) };
  21. self.define = (n,s,c) => {
  22. i[n] ||
  23. (i[n] = Promise.resolve().then(() => {
  24. let i = {};
  25. const r = { uri: location.origin + n.slice(1) };
  26. return Promise.all(
  27. s.map(n => {
  28. switch (n) {
  29. case ''exports'':
  30. return i;
  31. case ''module'':
  32. return r;
  33. default:
  34. return e(n);
  35. }
  36. })
  37. ).then(e => {
  38. const n = c(...e);
  39. return i.default || (i.default = n),i;
  40. });
  41. }));
  42. };
  43. }
  44. define(''./sw.js'',[''./workBox-1ca495a9''],function(e) {
  45. ''use strict'';
  46. importScripts(),self.skipwaiting(),e.clientsClaim(),e.precacheAndRoute(
  47. [
  48. {
  49. url: ''/_next/static/Bf0fOQ5vTfsmLElkL5uPJ/_buildManifest.js'',revision: ''Bf0fOQ5vTfsmLElkL5uPJ''
  50. },{
  51. url: ''/_next/static/Bf0fOQ5vTfsmLElkL5uPJ/_ssgManifest.js'',{
  52. url: ''/_next/static/chunks/224-5da05219d75f4eb1a9e2.js'',{
  53. url: ''/_next/static/chunks/580-2d0b17ccc09c231c1f63.js'',{
  54. url: ''/_next/static/chunks/597-27159eb1f0ff7f4322bb.js'',{
  55. url: ''/_next/static/chunks/framework-40503bb0b87dcc30c2dc.js'',{
  56. url: ''/_next/static/chunks/main-f0954d00fdee968e0986.js'',{
  57. url: ''/_next/static/chunks/pages/_app-f80cf1ab407b29886a1c.js'',{
  58. url: ''/_next/static/chunks/pages/_error-8470b41bc6cfedf1d350.js'',{
  59. url: ''/_next/static/chunks/pages/index-e03b34c1331d21cd05ac.js'',{
  60. url: ''/_next/static/chunks/polyfills-3d2c0f0875171918a758.js'',{
  61. url: ''/_next/static/chunks/webpack-fb3a8e0c92f7e9ed77fb.js'',{
  62. url: ''/browserconfig.xml'',revision: ''653d077300a12f09a69caeea7a8947f8''
  63. },{ url: ''/favicon.ico'',revision: ''21b739d43fcb9bbb83d8541fe4fe88fa'' },{
  64. url: ''/icons/android-icon-144x144.png'',revision: ''ba231a435173f4830fe422263f5dd3eb''
  65. },{
  66. url: ''/icons/android-icon-192x192.png'',revision: ''93bde9a252c9a48d377f60dfa88b25e2''
  67. },{
  68. url: ''/icons/android-icon-36x36.png'',revision: ''60cbd3297c42a432069c7f5e9d640c12''
  69. },{
  70. url: ''/icons/android-icon-48x48.png'',revision: ''4b898d6d22adce8db36ede1b8c811f1b''
  71. },{
  72. url: ''/icons/android-icon-512x512.png'',revision: ''6a8a40c983dbc0bc42a97b9e4cda77a6''
  73. },{
  74. url: ''/icons/android-icon-72x72.png'',revision: ''3d1f4c9b46b285fa6cb2c587ea2334e0''
  75. },{
  76. url: ''/icons/android-icon-96x96.png'',revision: ''5f522065b076d980b50278fecf7c0f34''
  77. },{
  78. url: ''/icons/apple-icon-114x114.png'',revision: ''ca65289710709e327077cf035bade9e0''
  79. },{
  80. url: ''/icons/apple-icon-120x120.png'',revision: ''478371dd294735fa2d579d0c027442be''
  81. },{
  82. url: ''/icons/apple-icon-144x144.png'',{
  83. url: ''/icons/apple-icon-152x152.png'',revision: ''c7c7e34b1d917f17a4132eb253262424''
  84. },{
  85. url: ''/icons/apple-icon-180x180.png'',revision: ''117fea2a93944d8ecab1797de5bbe301''
  86. },{
  87. url: ''/icons/apple-icon-512x512.png'',{
  88. url: ''/icons/apple-icon-57x57.png'',revision: ''5c0a5653d999f01b12ba2a2c1343a664''
  89. },{
  90. url: ''/icons/apple-icon-60x60.png'',revision: ''6ee47df922e9336918c9266c651fbb11''
  91. },{
  92. url: ''/icons/apple-icon-72x72.png'',{
  93. url: ''/icons/apple-icon-76x76.png'',revision: ''f7e6c5d5649be3dac2479043e0c3c05f''
  94. },{
  95. url: ''/icons/apple-icon-precomposed.png'',revision: ''528eff11ef1a3f9094763b37bb9ef69e''
  96. },{
  97. url: ''/icons/apple-icon.png'',{
  98. url: ''/icons/favicon-16x16.png'',revision: ''e90dc768aad2517760a068c794a8e7da''
  99. },{
  100. url: ''/icons/favicon-32x32.png'',revision: ''2804f09f47660e4593b8f05f1007973f''
  101. },{
  102. url: ''/icons/favicon-96x96.png'',{
  103. url: ''/icons/maskable_icon_x1.png'',revision: ''cab51d5ebecc0e119828c83518472714''
  104. },{
  105. url: ''/icons/ms-icon-144x144.png'',{
  106. url: ''/icons/ms-icon-150x150.png'',revision: ''f0b0f7361d893e945de9e383b898b485''
  107. },{
  108. url: ''/icons/ms-icon-310x310.png'',revision: ''f3258e3670d0eb63ba56fb40ad30386c''
  109. },{
  110. url: ''/icons/ms-icon-512x512.png'',{
  111. url: ''/icons/ms-icon-70x70.png'',revision: ''7a04d01451acba7481bd3ddfadb7255d''
  112. },{ url: ''/manifest.json'',revision: ''973196764f3f071b66c8f53b18a0eda3'' },{ url: ''/vercel.svg'',revision: ''4b4f1876502eb6721764637fe5c41702'' }
  113. ],{ ignoreURLParametersMatching: [] }
  114. ),e.cleanupOutdatedCaches(),e.registerRoute(
  115. ''/'',new e.NetworkFirst({
  116. cacheName: ''start-url'',plugins: [
  117. new e.ExpirationPlugin({
  118. maxEntries: 1,maxAgeSeconds: 86400,purgeOnQuotaError: !0
  119. })
  120. ]
  121. }),''GET''
  122. ),e.registerRoute(
  123. /^https:\\/\\/fonts\\.(?:googleapis|gstatic)\\.com\\/.*/i,new e.CacheFirst({
  124. cacheName: ''google-fonts'',plugins: [
  125. new e.ExpirationPlugin({
  126. maxEntries: 4,maxAgeSeconds: 31536e3,e.registerRoute(
  127. /\\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({
  128. cacheName: ''static-font-assets'',maxAgeSeconds: 604800,e.registerRoute(
  129. /\\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({
  130. cacheName: ''static-image-assets'',plugins: [
  131. new e.ExpirationPlugin({
  132. maxEntries: 64,e.registerRoute(
  133. /\\.(?:js)$/i,new e.StaleWhileRevalidate({
  134. cacheName: ''static-js-assets'',plugins: [
  135. new e.ExpirationPlugin({
  136. maxEntries: 32,e.registerRoute(
  137. /\\.(?:css|less)$/i,new e.StaleWhileRevalidate({
  138. cacheName: ''static-style-assets'',e.registerRoute(
  139. /\\.(?:json|xml|csv)$/i,new e.NetworkFirst({
  140. cacheName: ''static-data-assets'',e.registerRoute(
  141. /\\/api\\/.*$/i,new e.NetworkFirst({
  142. cacheName: ''apis'',networkTimeoutSeconds: 10,plugins: [
  143. new e.ExpirationPlugin({
  144. maxEntries: 16,e.registerRoute(
  145. /.*/i,new e.NetworkFirst({
  146. cacheName: ''others'',''GET''
  147. );
  148. });

这是next.config.js

  1. const withPWA = require(''next-pwa'');
  2. module.exports = withPWA({
  3. disable: process.env.NODE_ENV === ''development'',register: true,sw: ''/sw.js'',future: { webpack5: true },distDir: ''/.next'',pwa: {
  4. dest: ''public''
  5. }
  6. });

和我的public/manifest.json

  1. {
  2. "name": "Parakeat Language Learning","short_name": "Parakeat","icons": [
  3. {
  4. "src": "icons/android-icon-36x36.png","sizes": "36x36","type": "image/png","density": "0.75"
  5. },{
  6. "src": "icons/android-icon-48x48.png","sizes": "48x48","density": "1.0"
  7. },{
  8. "src": "icons/android-icon-72x72.png","sizes": "72x72","density": "1.5"
  9. },{
  10. "src": "icons/android-icon-96x96.png","sizes": "96x96","density": "2.0"
  11. },{
  12. "src": "icons/android-icon-144x144.png","sizes": "144x144","density": "3.0"
  13. },{
  14. "src": "icons/android-icon-192x192.png","sizes": "192x192","density": "4.0"
  15. },{
  16. "src": "icons/android-icon-512x512.png","sizes": "512x512",{
  17. "src": "icons/maskable_icon_x1.png","sizes": "196x196","purpose": "any maskable"
  18. }
  19. ],"start_url": "/","scope": "","orientation": "portrait","display": "standalone","theme_color": "#002","background_color": "#ffffff"
  20. }

我几乎没有想法,我一直在阅读 next-pwa npm docs、相关的 example file 和 third-party resources,对于所有这些内容,它似乎只是 工作,然而......我没有这样的运气。

最后,我部署它时的响应(虽然它成功了,也许这是问题的一部分?)

enter image description here

解决方法

根据:
https://github.com/shadowwalker/next-pwa/issues/107
https://github.com/shadowwalker/next-pwa/issues/108
https://github.com/shadowwalker/next-pwa/issues/124

他们认为这是 Lighthouse 的一个错误。当我禁用网络时,它似乎可以正常工作。

PWA:防止 url 在 PWA 中打开

PWA:防止 url 在 PWA 中打开

如何解决PWA:防止 url 在 PWA 中打开?

我使用 @angular/pwa 构建了一个 angular 应用,它支持 Microsoft、Google、Facebook 和 Twiitter 等外部登录。当用户想要使用外部登录名登录时,我使用 window.open 打开托管 Challenge 的 URL。

问题在于,当从浏览器中的网络应用程序调用 window.open 时,该 url 被强制在 PWA 中打开。

我几乎已经尽我所能来防止这种情况发生,但没有成功。我尝试的最后一件事是 host my endpoints for my external logins on a subdomain,效果很好。

但现在我已经在我的网络应用程序中实现了 2FA,为了使 2FA 起作用,必须从与调用 ExternalLoginSigninAsync 相同的域中调用 TwoFactorAuthenticatorSignInAsync。那么如何强制一个 url (window.open) 在浏览器中打开而不是在 PWA 中打开?

PS:别想了

  1. 从 navigationUrls ("navigationUrls": [ "!/web/v3/Account/connect/" ]) 中排除
  2. window.open(url,''_system'')
  3. window.open(url,''_blank'')
  4. 使用 ngsw-bypass (window.open(url + ''?ngsw-bypass=true''))

都试过了,还是不行。

编辑

This block of code 似乎决定了是启动 PWA 还是打开新标签页。

调用栈:

  • WebappLauncherActivity.shouldLaunchWebapp
  • WebApkValidator.canWebApkHandleUrl
  • WebApkValidator.resolveInfosForUrlAndOptionalPackage 应该为您不想在 PWA 中打开的网址返回 false

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

关于前端每周清单:jQuery 3.2发布,滴滴采用Vue 2.0重构Web App、饿了么 PWA 实践经验分享的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于2022 年了,还不了解 PWA ? 教你 VuePress 博客如何快速兼容 PWA、nuxt.js pwa 的启动画面添加到主屏幕 ios 和 Apk pwa、PWA “start_url 确实响应了,但不是通过 service worker” -- NextJS-PWA、PWA:防止 url 在 PWA 中打开的相关信息,请在本站寻找。

本文标签: