Files
pmomusic/doc/webapp.md

104 lines
3.9 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Oui exactement, tu peux clairement séparer ton **backend Go** (PMO logger, serveur UPnP, etc.) de la **web app** dans un nouveau package, par exemple `pmoapp`, et lembarquer via `embed`. Cest dailleurs la meilleure pratique si tu envisages une **application web complète et évolutive**, avec plusieurs pages, routes, et fonctionnalités.
Voici comment je te conseille de procéder et pourquoi :
---
## **1⃣ Création du package web indépendant**
```bash
mkdir pmoapp
cd pmoapp
npm create vite@latest web
```
* **Nom du projet** : `web`
* **Framework** : React (on garde ton choix initial, populaire et bien documenté pour des interfaces complexes)
### **Pourquoi React** :
* Large écosystème (bibliothèques UI, state management, routing)
* Réactivité naturelle pour les flux temps réel (comme SSE)
* Compatible avec TypeScript, ce qui est pratique si ton projet Go devient complexe et que tu veux des typings fiables.
### **Choix du langage**
Les options que tu as :
| Option | Avantages | Quand la choisir |
| --------------------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| **TypeScript** (recommandé) | Typage statique, moins derreurs runtime, meilleur pour projet long terme | Quand tu commences un projet sérieux et que tu veux scalabilité et sécurité |
| TypeScript + SWC | SWC compile plus vite que Vite/TS, utile pour gros projets | Si tu vises build ultra-rapide et dev rapide |
| JavaScript | Simple, pas de compilation typée | Pour prototypage rapide ou projet temporaire |
| JavaScript + SWC | JS mais compilation rapide | Peu utilisé, peu dintérêt si tu ne fais pas du JS lourd |
**✅ Recommandation : TypeScript classique**
* Tu as un projet qui va évoluer et peut devenir complexe
* Les types aident à maintenir la cohérence avec le backend Go (ex : typage des logs, props des composants, etc.)
* Tu nas pas besoin de SWC pour linstant, Vite est déjà très rapide pour dev et build
---
## **2⃣ Ajouter un build statique pour embed**
Dans ton Go package `pmoapp`, crée un fichier `web.go` :
```go
package pmoapp
import (
"embed"
"io/fs"
"net/http"
)
//go:embed web/dist/*
var AppRoot embed.FS
// Expose static files
func Handler(mux *http.ServeMux) {
fsys, _ := fs.Sub(AppRoot, "web/dist")
mux.Handle("/app/", http.StripPrefix("/app/", http.FileServer(http.FS(fsys))))
mux.HandleFunc("/app", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "web/dist/index.html")
})
}
```
**Pourquoi :**
* `/app` → sert lentrée de lapplication (`index.html`)
* `/app/` → sert tous les assets statiques générés par Vite (`dist/`)
* Avec `embed.FS`, ton build React est complètement **embarqué dans le binaire Go**, tu nas pas besoin de Node en production.
---
## **3⃣ Workflow futur**
1. Développer le frontend dans `pmoapp/web` avec React/TypeScript.
2. À chaque modification :
```bash
cd pmoapp/web
npm run build
```
3. Ton backend Go peut **réutiliser la même variable `AppRoot`** pour servir les pages.
Tu pourras ensuite :
* Ajouter des routes React (`react-router-dom`)
* Ajouter des pages dynamiques
* Utiliser des composants pour logs, dashboard, configuration, etc.
---
Si tu veux, je peux te préparer **larborescence complète recommandée pour ton projet Go + React**, avec :
* `pmolog` pour le logger SSE
* `pmoapp` pour la web app React
* Embedding automatique du build Vite dans le binaire Go
Veuxtu que je fasse ça?