Skip to content

generateSW

vite-plugin-pwa 插件上决定使用此策略之前,您必须阅读使用哪种模式

你可以在 workbox 网站上找到这个方法的文档:generateSW

你可以在 workbox 网站上找到插件的使用指南:使用插件

缓存外部资源

如果你使用一些 CDN 来下载一些资源,比如 fontscss ,你必须将它们包含在 service worker 预缓存中,这样你的应用程序在离线时也能正常运行

下面案例将使用来自 https://fonts.googleapis.comcsshttps://fonts.gstatic.comfonts .

index.html 文件中,您必须配置 csslink ,并且必须为外部资源(参见处理第三方请求)包含 crossorigin="anonymous" 属性:

index.html
html
<head>
  <link rel="dns-prefetch" href="https://fonts.googleapis.com" />
  <link rel="dns-prefetch" href="https://fonts.gstatic.com" />
  <link
    rel="preconnect"
    crossorigin="anonymous"
    href="https://fonts.googleapis.com"
  />
  <link
    rel="preconnect"
    crossorigin="anonymous"
    href="https://fonts.gstatic.com"
  />
  <link
    rel="stylesheet"
    crossorigin="anonymous"
    href="https://fonts.googleapis.com/css2?family=Fira+Code&display=swap"
  />
</head>

然后在您的 vite.config.ts 文件中添加以下代码:

VitePWA 选项
ts
VitePWA({
  workbox: {
    runtimeCaching: [
      {
        urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i,
        handler: 'CacheFirst',
        options: {
          cacheName: 'google-fonts-cache',
          expiration: {
            maxEntries: 10,
            maxAgeSeconds: 60 * 60 * 24 * 365, // <== 365 days
          },
          cacheableResponse: {
            statuses: [0, 200],
          },
        },
      },
      {
        urlPattern: /^https:\/\/fonts\.gstatic\.com\/.*/i,
        handler: 'CacheFirst',
        options: {
          cacheName: 'gstatic-fonts-cache',
          expiration: {
            maxEntries: 10,
            maxAgeSeconds: 60 * 60 * 24 * 365, // <== 365 days
          },
          cacheableResponse: {
            statuses: [0, 200],
          },
        },
      },
    ],
  },
});

排除路由

为了防止某些路由被 service worker 拦截,您只需将这些路由通过正则匹配添加到 workboxnavigateFallbackDenylist 选项列表中即可:

ts
VitePWA({
  workbox: {
    navigateFallbackDenylist: [/^\/backoffice/],
  },
});

警告

你必须处理那些被排除路由的离线支持:如果请求 navigateFallbackDenylist 页面上的内容,你将得到 No internet connection

Background Sync

你可以在你的 vite.config.ts 文件中给插件中添加以下代码,以为您的 service worker 添加一个 Background Sync 管理器:

VitePWA 选项
ts
VitePWA({
  workbox: {
    runtimeCaching: [
      {
        handler: 'NetworkOnly',
        urlPattern: /\/api\/.*\/*.json/,
        method: 'POST',
        options: {
          backgroundSync: {
            name: 'myQueueName',
            options: {
              maxRetentionTime: 24 * 60,
            },
          },
        },
      },
    ],
  },
});

在MIT许可下发布.