2.9 KiB
Architettura
Questo progetto utilizza Go per la backend e l'ecosistema di NodeJS per la frontend. Più precisamente utilizziamo ViteJS.
La cosa più interessante è l'integrazione tra ViteJS e la backend in Go anche per siti con più pagine (di default ViteJS non rende ciò molto semplice).
Ci sono vari entry-point per la nostra applicazione (per comodità sono sempre moduli go che eventualmente lanciano altri processi se necessario):
-
Quando saremo in produzione l'unico server sarà quello di Go lanciato attraverso l'entry-point ./cmd/server/main.go
In particolare prima di poter lanciamo questo server bisogna aver eseguito ./cmd/build/main.go che esegue solo il codice relativo al router della nostra applicazione e genera un file
out/routes.json. Poi bisogna eseguirenpm run buildche chiama ViteJS e genera tutte le route dentro la cartellaout/frontend/ -
Quando siamo in development usiamo solo ./cmd/devserver/main.go che lancia in background il server di ViteJS (chiama
npm run devche a sua volta è un alias pernode server.js) quindi possiamo vedere tutto in tempo reale dalocalhost:3000.Più precisamente il server di ViteJs all'avvio richiede al server in Go tutte le route da montare utilizzando la route speciale
/api/development/routes(in particolare Fiber ed ExpressJS hanno la stessa sintassi per definire le route quindi questa cosa è facile da fare).Poi quando uno sviluppatore prova ad andare su una pagina ci sono due casi, se la route era statica allora leggiamo il file html, lo facciamo processare a ViteJS e poi lo rimandiamo all'utente. Se invece la route era di tipo dinamico allora leggiamo sempre il file e lo processiamo con ViteJS però ora utilizziamo l'altra route speciale che esiste solo in fase di sviluppo
/api/development/renderche renderizza la pagina applicando il templating del server e poi una volta finito inviamo la pagina al client.Quando saremo in produzione tutte le pagina saranno già state renderizzate da ViteJS quindi saremo nel caso standard di http server con views da renderizzare con il template engine del caso prima di mandare la pagina al client.
-
L'ultimo entry-point è ./cmd/build/main.go che lancia la nostra applicazione in una modalità "finta" in cui il server http non viene avviato ma vengono registrate tutte le route utilizzando sempre il modulo
dev. Questo ci permette di costruire l'albero delle route (statiche e dinamiche) che poi servirà a ViteJS quando facciamonpm run build.Ciò serve perché così ci basta definire tutte le route una volta sola nel Go e poi funzioneranno in automatico anche nel server di ViteJS senza dover ripetere due volte il codice. (questa è la parte più di meta-programming di tutto il progetto)