Indice

Chapitre 3 : Déploiement

1. Variables d'environnement

Développement

snippet.bash
# mobile/.env.development
VITE_API_URL=http://localhost/dolibarr/custom/monmodule/pwa/api.php

Production

snippet.bash
# mobile/.env.production
VITE_API_URL=https://mondomaine.com/custom/monmodule/pwa/api.php

2. Build de production

snippet.bash
cd mobile
 
# Installer les dépendances
npm install
 
# Build de production
npm run build

Les fichiers sont générés dans mobile/dist/.

3. Déployer les fichiers

Copier le contenu de mobile/dist/ vers pwa/dist/ :

snippet.bash
# Depuis le dossier mobile/
cp -r dist/* ../pwa/dist/

Ou utiliser un script npm :

snippet.json
{
  "scripts": {
    "build": "vite build",
    "deploy": "vite build && cp -r dist/* ../pwa/dist/"
  }
}

4. Structure finale

monmodule/
├── pwa/
│   ├── api.php
│   └── dist/
│       ├── index.html
│       └── assets/
│           ├── index-abc123.js
│           └── index-def456.css
└── ...

5. Configuration serveur

Apache (.htaccess)

Dans pwa/dist/.htaccess :

snippet.apache
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /custom/monmodule/pwa/dist/
 
  # Rediriger vers index.html pour le routage React
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . index.html [L]
</IfModule>
 
# Cache des assets
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType text/css "access plus 1 year"
  ExpiresByType application/javascript "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType image/jpeg "access plus 1 year"
</IfModule>

Nginx

snippet.nginx
location /custom/monmodule/pwa/dist/ {
    try_files $uri $uri/ /custom/monmodule/pwa/dist/index.html;
 
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

6. Accès à l'application

L'application est accessible à :

https://mondomaine.com/custom/monmodule/pwa/dist/

7. PWA (Progressive Web App)

Manifest

Créer public/manifest.json :

snippet.json
{
  "name": "Mon Application",
  "short_name": "MonApp",
  "description": "Description de l'application",
  "start_url": "/custom/monmodule/pwa/dist/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#1976d2",
  "icons": [
    {
      "src": "images/icon-192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "images/icon-512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}

Service Worker (optionnel)

Pour le mode offline, utiliser vite-plugin-pwa :

snippet.bash
npm install vite-plugin-pwa
snippet.javascript
// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { VitePWA } from 'vite-plugin-pwa';
 
export default defineConfig({
  plugins: [
    react(),
    VitePWA({
      registerType: 'autoUpdate',
      manifest: {
        name: 'Mon Application',
        short_name: 'MonApp',
        theme_color: '#1976d2'
      }
    })
  ]
});

8. Checklist de déploiement

9. Debug en production

Logs Dolibarr

snippet.php
// Dans un controller
dol_syslog("Debug: " . json_encode($payload), LOG_DEBUG);

Les logs sont dans documents/dolibarr.log.

Console navigateur

En production, les erreurs JavaScript sont visibles dans la console du navigateur (F12).

← Chapitre précédent | Retour au module | Module suivant : Fonctionnalités avancées →