vite: pwa/sw(workbox配置) - cheatsheet

自己常用的 pwa 配置记录
更新于: 2024-10-08 17:42:38

vite 中使用

yarn add --dev vite-plugin-pwa

典型配置

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { VitePWA } from 'vite-plugin-pwa';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    react(),
    VitePWA({
      injectRegister: 'inline',
      // base: '/',
      // registerType: 'autoUpdate',
      workbox: {
        globPatterns: ['**/*.{js,css,html,ico,png,svg}'],
        globIgnores: ['**/fallback.js?v=*'],
        ignoreURLParametersMatching: [/^v$/], // 正则匹配查询参数的名称 'v'
        skipWaiting: false,
        clientsClaim: false,
        runtimeCaching: [
          {
            // /assets/locales/zh-CN.json?v=1725113024176
            urlPattern: ({ url }) => url.pathname.startsWith('/assets/locales/'),
            handler: 'CacheFirst', //
            options: {
              cacheName: 'locales-cache',
              expiration: {
                maxEntries: 3
              },
              cacheableResponse: {
                statuses: [0, 200] // 仅缓存状态码为 0 或 200 的响应
              }
            }
          },
          {
            urlPattern: /^https:\/\/cdnjs\.cloudflare\.com/,
            handler: 'CacheFirst',
            options: {
              cacheName: 'cdnjs-scripts'
            }
          },
        ]
      }
    })
  ],
  server: {
    host: '0.0.0.0'
  },
  preview: {
    // disable gzip
    headers: {
      // Service-Worker-Allowed
      'Service-Worker-Allowed': '/'
    }
  }
});

cheatsheet

功能重要配置(备注)
编译的静态文件
# 针对 build(dist) 目录里的文件
globPatterns: ['**/*.{js,css,html,ico,png,svg}']
glob 配置测试
globbedFiles = glob.sync(globPattern, {
  cwd: globDirectory,
  follow: globFollow,
  ignore: globIgnores,
  strict: globStrict,
});
针对 ajax 请求的一些动态文件
# 这部分类似于 http://127.0.0.1:5174/locales/en-US.json?v=__VERSION__ 这类国际化文件
urlPattern: ({ url }) => url.pathname.startsWith('/assets/locales/'),
handler: 'StaleWhileRevalidate', // 先用缓存,有网络上的更新,会更新缓存中的
CDN 请求,长久不会更新的,优先使用 Cache 里的
{
  urlPattern: /^https:\/\/cdnjs\.cloudflare\.com/,
  handler: 'CacheFirst',
  options: {
    cacheName: 'cdnjs-scripts'
  }
}
多个cdn,可以简写
{
  // unpkg.com|cdn.jsdelivr.net
  urlPattern: /^https:\/\/(unpkg\.com|cdn\.jsdelivr\.net)/,
  handler: 'CacheFirst',
  options: {
    cacheName: 'unpkg-jsdelivr-cache',
    cacheableResponse: {
      statuses: [0, 200]
    }
  }
}