104 lines
3.9 KiB
Markdown
104 lines
3.9 KiB
Markdown
|
|
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 l’embarquer via `embed`. C’est d’ailleurs 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 d’erreurs 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 d’inté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 n’as pas besoin de SWC pour l’instant, 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 l’entrée de l’application (`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 n’as 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 **l’arborescence 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
|
|||
|
|
|
|||
|
|
Veux‑tu que je fasse ça ?
|