3.9 KiB
3.9 KiB
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
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 :
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
- Développer le frontend dans
pmoapp/webavec React/TypeScript. - À chaque modification :
cd pmoapp/web
npm run build
- Ton backend Go peut réutiliser la même variable
AppRootpour 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 :
pmologpour le logger SSEpmoapppour la web app React- Embedding automatique du build Vite dans le binaire Go
Veux‑tu que je fasse ça ?