Files
pmomusic/doc/webapp.md

3.9 KiB
Raw Blame History

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

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 :

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 :
cd pmoapp/web
npm run build
  1. 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?