PWA (Progressive Web App)
Documentation Vite-PWA
Une Progressive Web App (PWA) est une application qui combine le meilleur du web et du mobile. Elle s'installe sur l'écran d'accueil, fonctionne hors connexion et offre une expérience fluide proche d'une app native.
Configuration Vite
Configuration complète
// vite.config.js
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import tailwindcss from "@tailwindcss/vite";
import { VitePWA } from "vite-plugin-pwa";
import path from "path";
export default defineConfig(({ mode }) => {
const isDev = mode === 'development';
return {
appType: 'spa',
build: isDev ? {
minify: false,
sourcemap: true,
} : {
minify: 'terser',
terserOptions: {
compress: { drop_console: true, drop_debugger: true },
},
sourcemap: false,
},
optimizeDeps: {
include: ['prop-types', 'parse-numeric-range', 'boolbase', 'style-to-object', 'debug', 'extend', 'react-signature-canvas'],
},
resolve: {
alias: {
'src': path.resolve(__dirname, './src'),
'prop-types': 'prop-types/prop-types.js',
},
},
plugins: [
react(),
tailwindcss(),
VitePWA({
registerType: 'autoUpdate',
workbox: {
globPatterns: ['**/*.{js,css,html,ico,png,svg,json}'],
cleanupOutdatedCaches: true,
maximumFileSizeToCacheInBytes: 3000000,
skipWaiting: true,
clientsClaim: true,
runtimeCaching: [
{
urlPattern: /\/api\/(home|profile)/,
handler: 'NetworkFirst',
options: {
cacheName: 'api-cache',
expiration: {
maxEntries: 50,
maxAgeSeconds: 60 * 60 * 24 * 7,
},
cacheableResponse: { statuses: [0, 200] },
networkTimeoutSeconds: 10,
},
},
{
urlPattern: /\.(?:png|jpg|jpeg|svg|gif|webp)$/,
handler: 'CacheFirst',
options: {
cacheName: 'images-cache',
expiration: {
maxEntries: 100,
maxAgeSeconds: 60 * 60 * 24 * 30,
},
},
},
],
},
injectRegister: "auto",
includeAssets: ["favicon.ico", "assets/*", "favicon.png", "apple-touch-icon.png"],
// Dynamic manifest served by SmartAuth PwaController
manifest: false,
}),
]
};
});
Points clés de la configuration
- Build conditionnel : sourcemaps et logs en dev, minification et suppression des console.log en production
- Runtime caching : les routes API
/api/homeet/api/profilesont cachées en NetworkFirst, les images en CacheFirst - manifest: false : le manifest n'est pas généré par Vite, il est servi dynamiquement par SmartAuth (voir ci-dessous)
Manifest dynamique (SmartAuth)
SmartBoot utilise un manifest dynamique servi par SmartAuth via le PwaController. Le manifest est généré à partir des constantes Dolibarr de votre module.
Configuration dans index.html
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="manifest" href="api.php/manifest">
<link rel="icon" type="image/png" href="api.php/icon/64">
<link rel="apple-touch-icon" href="api.php/icon/192">
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>
Routes SmartAuth
| Route | Description |
|---|---|
GET /manifest | Retourne le manifest.json dynamique |
GET /icon/{size} | Retourne l'icône PWA à la taille demandée (64, 192, 512) |
Constantes Dolibarr
Configurez le manifest via les constantes de votre module dans l'administration Dolibarr :
| Constante | Description | Défaut |
|---|---|---|
{MODULE}PWANAME | Nom complet de l'application | Nom du module |