为什么要捐赠
API 探索器
升级指南
NEW!
quasar.config 文件
将项目转换为使用 Vite 的 CLI
浏览器兼容性
支持 TypeScript
目录结构
命令列表
CSS 预处理器
路由
延迟加载 - 代码分割
处理资产
启动文件
预取功能
API 代理
处理 Vite
处理 process.env
使用 Pinia 进行状态管理
使用 Vuex 进行状态管理
代码校验器
测试 & 审计
开发移动应用
Ajax 请求
将开发服务器开放到公共网络
Quasar CLI with Vite - @quasar/app-vite
配置 PWA

服务工作者

在 Quasar 项目中添加 PWA 模式意味着将创建一个新文件夹:/src-pwa,其中包含 PWA 特定文件

register-service-worker.js
# (或 .ts) 管理服务工作者的 UI 代码
manifest.json
# 您的 PWA 清单文件
custom-service-worker.js
# (或 .ts) 可选的自定义服务工作者文件(仅限 injectManifest 模式)

您可以自由地编辑这些文件。请注意以下几点

  1. register-service-worker.[js|ts] 会自动导入到您的应用程序中(像任何其他 /src 文件一样)。它会注册服务工作者(由 Workbox 或您的自定义服务工作者创建,具体取决于 workbox 插件模式 - quasar.config 文件 > pwa > workboxPluginMode),您也可以监听服务工作者的事件。您可以使用 ES6 代码。
  2. custom-service-worker.[js|ts] 将是您的服务工作者文件,但前提是 workbox 插件模式设置为 “injectManifest”(quasar.config 文件 > pwa > workboxMode: ‘injectManifest’)。否则,Quasar 和 Workbox 将为您创建一个服务工作者文件。
  3. 在生产构建中运行 Lighthouse 测试是很有意义的。

提示

处理服务工作者 文档页面上,您可以了解更多关于 register-service-worker.[js|ts] 以及如何与服务工作者交互的信息。

quasar.config 文件

您可以在这里配置 Workbox 的行为,也可以调整您的 manifest.json 文件。

pwa: {
  workboxMode: 'generateSW', // or 'injectManifest'
  injectPwaMetaTags: true, // boolean | (() => string)
  swFilename: 'sw.js', // should be .js (as it's the distribution file, not the input file)
  manifestFilename: 'manifest.json',
  useCredentialsForManifestTag: false,
  extendGenerateSWOptions (cfg) {},
  extendInjectManifestOptions (cfg) {},
  extendManifestJson (json) {},
  extendPWACustomSWConf (esbuildConf) {}
}

sourceFiles: {
  pwaRegisterServiceWorker: 'src-pwa/register-service-worker',
  pwaServiceWorker: 'src-pwa/custom-service-worker',
  pwaManifestFile: 'src-pwa/manifest.json',
}

如果您想篡改 /src 中 UI 的 Vite 配置

/quasar.config 文件

module.exports = function (ctx) {
  return {
    build: {
      extendViteConf (viteConf) {
        if (ctx.mode.pwa) {
          // do something with ViteConf
        }
      }
    }
  }
}

更多信息:Workbox

在 index.html 中添加自己的元标签

Quasar CLI 会(动态地)在您的 index.html 中添加一些面向 PWA 的元标签。如果您想自定义标签,请先在 /quasar.config 文件中禁用此行为

/quasar.config 文件

pwa: {
  injectPwaMetaTags: false
}

然后,编辑您的 /index.html 文件。以下是 Quasar CLI 动态注入的实际元标签

<head>

  <% if (ctx.mode.pwa) { %>
    <meta name="theme-color" content="<%= pwaManifest.theme_color %>">
    <link rel="mask-icon" href="icons/safari-pinned-tab.svg" color="<%= pwaManifest.theme_color %>">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="default">
    <meta name="msapplication-TileImage" content="icons/ms-icon-144x144.png">
    <meta name="msapplication-TileColor" content="#000000">
    <meta name="apple-mobile-web-app-title" content="<%= pwaManifest.name %>">
    <link rel="apple-touch-icon" href="icons/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="152x152" href="icons/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="167x167" href="icons/apple-icon-167x167.png">
    <link rel="apple-touch-icon" sizes="180x180" href="icons/apple-icon-180x180.png">
  <% } %>

</head>

请注意,您可以通过上面的 pwaManifest 访问您的 PWA 清单。

或者,您可以像下面这样为 injectPwaMetaTags 分配一个函数

/quasar.config 文件

pwa: {
  injectPwaMetaTags () {
    return `<meta name="apple-mobile-web-app-capable" content="yes">`
      + `<meta name="apple-mobile-web-app-status-bar-style" content="default">`
  }
}

选择 Workbox 模式

Workbox 有两种运行模式:generateSW(默认)和 injectManifest

通过 /quasar.config 文件设置您要使用的模式

/quasar.config 文件

pwa: {
  workboxMode: 'generateSW',
  extendGenerateSWOptions (cfg) {
    // configure workbox on generateSW
  }
}

pwa: {
  workboxMode: 'injectManifest',
  extendInjectManifestOptions (cfg) {
    // configure workbox on injectManifest
  }
}

generateSW

何时使用 generateSW

  • 您希望预缓存文件。
  • 您对运行时配置的需求很简单(例如,配置允许您定义路由和策略)。

何时不使用 generateSW

  • 您希望使用其他服务工作者功能(即 Web 推送)。
  • 您希望导入其他脚本或添加其他逻辑。

提示

请在 Workbox 网站 上查看此模式可用的 workboxOptions。

InjectManifest

何时使用 InjectManifest

  • 您希望对服务工作者有更多控制权。
  • 您希望预缓存文件。
  • 您在路由方面有更复杂的需求。
  • 您希望将服务工作者与其他 API 一起使用(例如 Web 推送)。

何时不使用 InjectManifest

  • 您希望最轻松地将服务工作者添加到您的网站。

提示

  • 如果您希望使用此模式,则必须自己编写服务工作者文件(/src-pwa/custom-service-worker.[js|ts])。
  • 请在 Workbox 网站 上查看此模式可用的 workboxOptions。

以下代码段是自定义服务工作者(/src-pwa/custom-service-worker.[js|ts])的默认代码,它模拟了 generateSW 模式的行为

/*
 * This file (which will be your service worker)
 * is picked up by the build system ONLY if
 * quasar.config file > pwa > workboxMode is set to "injectManifest"
 */

import { clientsClaim } from 'workbox-core'
import { precacheAndRoute, cleanupOutdatedCaches, createHandlerBoundToURL } from 'workbox-precaching'
import { registerRoute, NavigationRoute } from 'workbox-routing'

self.skipWaiting()
clientsClaim()

// Use with precache injection
precacheAndRoute(self.__WB_MANIFEST)

cleanupOutdatedCaches()

// Non-SSR fallback to index.html
// Production SSR fallback to offline.html (except for dev)
if (process.env.MODE !== 'ssr' || process.env.PROD) {
  registerRoute(
    new NavigationRoute(
      createHandlerBoundToURL(process.env.PWA_FALLBACK_HTML),
      { denylist: [/sw\.js$/, /workbox-(.)*\.js$/] }
    )
  )
}

配置清单文件

清单文件位于 /src-pwa/manifest.json。您可以自由地编辑它。

如果您需要在构建时动态更改它,可以通过编辑 /quasar.config 文件来实现

/quasar.config 文件

pwa: {
  extendManifestJson (json) {
    // tamper with the json
  }
}

在深入研究之前,请阅读有关 清单配置 的信息。

警告

请注意,您不需要编辑您的 index.html 文件(从 /index.html 生成)来链接到清单文件。Quasar CLI 会为您嵌入正确的内容。

提示

如果您的 PWA 在基本身份验证后面或需要授权标头,请将 quasar.config 文件 > pwa > useCredentialsForManifestTag 设置为 true,以便在清单文件元标签中包含 crossorigin="use-credentials"

PWA 清单

更多信息:PWA 清单

警告

不要在您的开发构建中运行 Lighthouse,因为在此阶段,代码有意未经优化,并且包含嵌入式源映射(以及许多其他内容)。有关更多信息,请参见这些文档的 测试和审计 部分。

自动重新加载和更新

对于那些不想在服务工作者更新时手动重新加载页面**并且使用默认 generateSW 工作箱模式**的用户,Quasar CLI 已配置 Workbox 一次性激活它。如果您需要禁用此行为

/quasar.config 文件

pwa: {
  extendGenerateSWOptions (cfg) {
    cfg.skipWaiting = false
    cfg.clientsClaim = false
  }
}

文件名哈希问题
@quasar/app-vite v1.1+

由于 Rollup 通过 Vite 构建资产的方式,当您更改任何脚本源文件(.js)时,这也会改变(几乎)所有 .js 文件的哈希部分(例如:454d87bdassets/index.454d87bd.js 中)。所有资产的修订号将在您的服务工作者文件中发生改变,这意味着当 PWA 更新时,它将再次重新下载所有资产。这真是浪费带宽,而且 PWA 更新需要更长时间!

默认情况下,Vite 会将所有文件名**包含哈希部分**进行构建。但是,如果您希望您的文件名不包含哈希部分,则需要编辑 /quasar.config 文件

/quasar.config 文件

build: {
  useFilenameHashes: false // true by default
}

当禁用文件名哈希时,最好确保您的 Web 服务器已相应地设置缓存(尽可能低),以确保一致地向无法使用 PWA 功能的客户提供资源。