vite-pwa: 网站更新-带提示的 workbox-cli

基于PWA,带提示的网站更新实现,利用本地的 workbox-cli 实现

01 安装依赖

全局依赖,如果系统中已经存在,这里不用执行了

yarn global add workbox-cli

项目 app 相关

yarn add @jswork/react-pwa-promotion

02 app 中添加提示框

提示导入 pages/_app.tsx ,核心代码看在这里

  • import ReactPwaPromotion from '@jswork/react-pwa-promotion';
  • <ReactPwaPromotion disabled={!isProd} interval={10 * 1000} />
/**
 * @Author: aric 1290657123@qq.com
 * @Date: 2024-10-13 09:05:33
 * @LastEditors: aric 1290657123@qq.com
 * @LastEditTime: 2025-04-13 20:55:57
 */

import { Outlet, useNavigate } from 'react-router-dom';
import { QueryClientProvider } from '@tanstack/react-query';
import { scanVite } from '@jswork/scan-modules';
import StateProvider from '@jswork/react-tiny-state';
import ModalManager from '@/shared/providers/modal-manager';
import ReactPwaPromotion from '@jswork/react-pwa-promotion';

// when vite
const moduleFiles = import.meta.glob('../shared/stores/*.ts', { eager: true });
const stores = scanVite(moduleFiles, { modules: '/stores/' });

const App = () => {
  const isProd = import.meta.env.PROD;
  // nav + back
  nx.$nav = useNavigate();
  nx.$navBack = () => nx.$nav(-1);

  return (
    <QueryClientProvider client={nx.$client}>
      <ModalManager>
        <StateProvider store={stores}>
          <Outlet />
          <ReactPwaPromotion disabled={!isProd} interval={10 * 1000} />
        </StateProvider>
      </ModalManager>
    </QueryClientProvider>
  );
};

export default App;

03 app 中添加css 支持

04 根目录添加 workbox 相关配置

workbox-config.cjs 示例

module.exports = {
  maximumFileSizeToCacheInBytes: 100 * 1024 * 1024,
  globDirectory: 'dist/',
  globPatterns: ['**/*.{js,png,svg,json,txt,css,map}'],
  globIgnores: ['*/fallback.js'],
  globFollow: true,
  globStrict: false,
  swDest: 'dist/sw.js',
  skipWaiting: false,
  clientsClaim: false,
  // runtimeCache: unpkg.com
  runtimeCaching: [
    {
      urlPattern: /\/static\/js\//,
      handler: 'CacheFirst',
      options: { cacheName: 'static-js' }
    },
    {
      urlPattern: /\/static\/css\//,
      handler: 'CacheFirst',
      options: {
        cacheName: 'static-css'
      }
    },
    {
      urlPattern: /\/static\/media\//,
      handler: 'CacheFirst',
      options: {
        cacheName: 'static-media'
      }
    },
    {
      urlPattern: /^https:\/\/(unpkg\.com|cdnjs\.cloudflare\.com|at\.alicdn\.com)/,
      handler: 'CacheFirst',
      options: {
        cacheName: 'cdn-assets',
        cacheableResponse: {
          statuses: [0, 200]
        }
      }
    }
  ]
};

05 添加 build 配置

package.json 配置

  • 核心配置:"postbuild": “workbox generateSW workbox-config.cjs"
"postbuild": “workbox generateSW workbox-config.cjs"
{
  "name": "vite-admin-business",
  "private": true,
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "postbuild": "workbox generateSW workbox-config.cjs",
  }
}
pwa vite react