feat: app instalable desde el navegador (PWA)
vite-plugin-pwa genera manifest.webmanifest + service worker en el build. Iconos nuevos generados a partir del logo actual (192, 512, maskable para Android). El service worker precachea solo assets estaticos (JS/CSS/iconos) -- /api nunca se cachea, siempre va a la red, asi los datos no quedan desactualizados. Se actualiza solo (autoUpdate) sin pedirle nada al usuario. Probado: build genera sw.js/manifest correctamente, el service worker registra y activa en un browser real, y la app (login, listado de proyectos, llamadas a /api) sigue funcionando igual que antes -- sin regresiones. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+32
-1
@@ -1,8 +1,39 @@
|
||||
import { defineConfig } from 'vite';
|
||||
import react from '@vitejs/plugin-react';
|
||||
import { VitePWA } from 'vite-plugin-pwa';
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [react()],
|
||||
plugins: [
|
||||
react(),
|
||||
VitePWA({
|
||||
registerType: 'autoUpdate',
|
||||
includeAssets: ['favicon.svg', 'favicon.png', 'apple-touch-icon.png'],
|
||||
manifest: {
|
||||
id: '/',
|
||||
lang: 'es-EC',
|
||||
name: 'LinkedCorp Proyectos',
|
||||
short_name: 'LinkedCorp',
|
||||
description: 'Gestión de proyectos y actividades de TI',
|
||||
theme_color: '#0078d4',
|
||||
background_color: '#202020',
|
||||
display: 'standalone',
|
||||
start_url: '/',
|
||||
icons: [
|
||||
{ src: 'pwa-192x192.png', sizes: '192x192', type: 'image/png' },
|
||||
{ src: 'pwa-512x512.png', sizes: '512x512', type: 'image/png' },
|
||||
{ src: 'pwa-maskable-512x512.png', sizes: '512x512', type: 'image/png', purpose: 'maskable' },
|
||||
],
|
||||
},
|
||||
workbox: {
|
||||
// El service worker nunca debe interceptar /api — siempre a la red, nunca cache de
|
||||
// respuestas viejas (datos de proyectos/actividades desactualizados seria peor que no
|
||||
// tener PWA). navigateFallback (para que recargar una ruta como /proyectos/5 sirva el
|
||||
// index.html cacheado) queda excluido de /api de forma explicita, aunque de por si esas
|
||||
// llamadas no son navegaciones de pagina.
|
||||
navigateFallbackDenylist: [/^\/api\//],
|
||||
},
|
||||
}),
|
||||
],
|
||||
server: {
|
||||
host: '0.0.0.0',
|
||||
port: 5196,
|
||||
|
||||
Reference in New Issue
Block a user