You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
website/ARCHITECTURE.md

3.2 KiB

Architettura

Questo è un progetto fullstack con una backend scritta in Go ed una frontend in JS, più precisamente utilizziamo NodeJS con Vite per build-are la frontend.

La cosa più interessante è l'integrazione tra Vite e la backend in Go per siti con più pagine (il nostro caso). Di base Vite supporta siti con più file html ma ha bisogno che gli venga detto quali sono tutti gli entrypoint HTML. Vedremo che questo progetto usa una tecnica che ci permette di indicare una volta sola le cose nel codice in Go senza stare a tenere sincronizzato il codice in Go e la configurazione di Vite.

Usage

Ci sono vari modi per lanciare la nostra applicazione in base all'environment, in particolare sono tutti isolati sotto forma di eseguibili in Go:

  • 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 lanciare 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 eseguire npm run build che chiama Vite e genera il codice per tutte le route dentro la cartella out/frontend/.

  • Quando siamo in development usiamo solo ./cmd/devserver/main.go che lancia in background il server di Vite (chiama npm run dev che a sua volta è un alias per node server.js) quindi possiamo vedere tutto in tempo reale da localhost:3000.

    Più precisamente il server di Vite 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 si prova ad andare su una pagina ci sono due casi

    • Se la route era statica allora leggiamo il file html, lo facciamo processare a Vite e poi lo rimandiamo all'utente.

    • Se invece la route era di tipo dinamico allora leggiamo sempre il file e lo processiamo con Vite però ora utilizziamo l'altra route speciale che esiste solo in fase di sviluppo /api/development/render che renderizza la pagina applicando il templating del server e poi una volta finito inviamo la pagina al client.

    Invece quando saremo in produzione tutte le pagina saranno già state renderizzate da Vite 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 entrypoint è ./cmd/build/main.go e lancia la nostra applicazione in una modalità "finta" senza server http ma vengono comunque 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 Vite quando faremo npm run build.

    Ciò serve perché così ci basta definire tutte le route una volta sola nel Go e poi in automatico funzioneranno anche nel server di Vite senza dover ripetere due volte il codice. (questa è la parte più magica di meta-programming di tutto il progetto)