Questo tutorial e rivolto a Hugo v0.100+. Il sistema di layout e cambiato significativamente rispetto alle versioni piu vecchie. Se usi Hugo prima della v0.90, aspettati differenze nelle regole di lookup dei template, nella sintassi di configurazione e nel modo in cui vengono risolte le partial.
Introduzione#
Questo tutorial mostra come creare un tema semplice in Hugo. Si presuppone familiarita con HTML, la riga di comando bash e Markdown per formattare i contenuti. Vedremo come Hugo usa i template e come organizzarli per creare un tema. Non tratteremo l’uso dei CSS per lo stile.
Inizieremo creando un nuovo sito con un template molto elementare, poi aggiungeremo alcune pagine e post. Con piccole variazioni su questo schema, sara possibile creare molti tipi diversi di siti web.
In questo tutorial, i comandi da eseguire iniziano con il prompt “$”. L’output seguira. Le righe che iniziano con “#” sono commenti esplicativi. Quando mostriamo aggiornamenti a un file, “:wq” sull’ultima riga significa salvare il file.
Ecco un esempio:
| |
Alcune definizioni#
Ci sono alcuni concetti da capire prima di creare un tema.
Skin#
Le skin sono i file responsabili dell’aspetto del sito. Includono i CSS che controllano colori e font, il Javascript che determina azioni e reazioni, e le regole che Hugo usa per trasformare i contenuti in HTML che il sito servira ai visitatori.
Ci sono due modi per creare una skin. Il piu semplice e crearla nella directory layouts/. Cosi facendo non dovrai configurare Hugo per riconoscerla, perche il primo posto dove Hugo cerca regole e file e la directory layouts/.
La seconda scelta e crearla in una sottodirectory della directory themes/. In questo caso dovrai sempre indicare a Hugo dove cercare la skin.
La differenza tra creare una skin in layouts/ e crearla in themes/ e molto sottile. Una skin in layouts/ non puo essere personalizzata senza modificare i template e i file statici da cui e costruita. Una skin creata in themes/, invece, puo essere personalizzata, ed e quindi piu facile da usare per altri.
Il resto di questo tutorial chiamera “tema” una skin creata nella directory themes/.
La home page#
La home page, o landing page, e la prima pagina che molti visitatori vedono. E il file index.html nella directory radice del sito web. Poiche Hugo scrive i file nella directory public/, la nostra home page e public/index.html.
Il file di configurazione del sito#
Quando Hugo viene eseguito, cerca un file di configurazione che contenga impostazioni che sovrascrivono i valori predefiniti per l’intero sito. Il file puo usare TOML, YAML o JSON.
Hugo trasforma i file Markdown in HTML. Per default, Hugo si aspetta di trovare i file Markdown nella directory content/ e i file template nella directory themes/. Creera i file HTML nella directory public/.
Contenuto#
Il contenuto e memorizzato in file di testo che contengono due sezioni. La prima sezione e il “front matter”, ovvero le meta-informazioni sul contenuto. La seconda sezione contiene Markdown che verra convertito in HTML.
Front matter#
Il front matter contiene informazioni sul contenuto. Come il file di configurazione, puo essere scritto in TOML, YAML o JSON. TOML e delimitato da “+++”, YAML da “---”, JSON da parentesi graffe.
Le informazioni nel front matter vengono passate al template prima che il contenuto venga renderizzato in HTML.
Markdown#
Il contenuto e scritto in Markdown, che semplifica la scrittura. Hugo passa il contenuto attraverso un motore Markdown per creare l’HTML che verra scritto nel file di output.
File template#
Hugo usa i file template per renderizzare il contenuto in HTML. I file template sono un ponte tra contenuto e presentazione. Le regole nel template definiscono quale contenuto viene pubblicato, dove viene pubblicato e come viene renderizzato nel file HTML.
Ci sono tre tipi di template: single, list e partial. Ogni tipo prende del contenuto come input e lo trasforma in base ai comandi nel template.
Template single#
Un template single viene usato per renderizzare un singolo pezzo di contenuto, come un articolo o un post.
Template list#
Un template list renderizza un gruppo di contenuti correlati. Potrebbe essere un sommario dei post recenti o tutti gli articoli in una categoria.
Il template della homepage e un tipo speciale di template list. Hugo assume che la home page del sito funzioni come portale per il resto del contenuto.
Template partial#
Un template partial puo essere incluso in altri template. Deve essere chiamato con il comando template “partial”. E molto utile per raggruppare comportamenti comuni, come un banner usato da tutte le pagine.
Creare un nuovo sito#
Usiamo Hugo per creare un nuovo sito web. Creeremo il nostro nella cartella Sites nella home directory.
Il comando “new site” creera uno scheletro del sito con la struttura di directory di base e un file di configurazione funzionante.
| |
Controlla la directory content/ per confermare che sia vuota.
Le altre directory (archetypes/, layouts/ e static/) vengono usate per personalizzare un tema. Per ora ignorale.
Generare l’HTML per il nuovo sito#
Eseguendo il comando hugo senza opzioni si leggeranno tutti i contenuti disponibili e si genereranno i file HTML. Copiera anche tutti i file statici. Poiche il sito e vuoto, fara poco, ma lo fara molto velocemente.
| |
Il flag --verbose fornisce informazioni extra. Le righe che iniziano con “WARN:” sono messaggi di avviso. Le esamineremo a breve.
| |
La nuova directory public/ contiene i contenuti generati. Quando sei pronto a pubblicare, e da li che si parte.
| |
Hugo ha creato due file XML standard, ma non ci sono file HTML.
Testare il nuovo sito#
Verifica che il server web integrato funzioni. Avvialo con il comando “server”:
| |
Connettiti all’URL elencato. Vedrai una lista dei file nella directory public/, perche Hugo non ha creato una home page (il sito non ha ancora contenuti).
Torniamo agli avvisi:
| |
Il secondo avviso e per la pagina 404. Il primo e per la home page: Hugo non ha trovato un template per essa.
Creare un nuovo tema#
Hugo non include un tema predefinito. Vengono forniti vari temi e Hugo ha un comando per crearne di nuovi.
Creeremo un tema chiamato “zafta”. Poiche l’obiettivo e mostrare come usare i template, il tema non conterra CSS: brutto ma funzionante.
Creare lo scheletro#
Usa il comando hugo new theme per creare lo scheletro del tema:
| |
Lo scheletro include template (file .html), file di licenza, descrizione del tema (theme.toml) e un archetype vuoto.
| |
I file template dello scheletro sono vuoti. Li riempiremo a breve.
Aggiornare il file di configurazione per usare il tema#
Ora che abbiamo un tema, aggiungiamo il suo nome al file di configurazione:
| |
Generare il sito#
Ora che abbiamo un tema vuoto, generiamo di nuovo il sito:
| |
L’avviso per la home page e sparito e c’e una riga informativa aggiuntiva che indica che Hugo sta sincronizzando dalla directory del tema.
| |
Hugo ha creato una home page, una directory css/ e una directory js/.
La home page#
Hugo supporta molti tipi di template. La home page e speciale: ha un tipo di template proprio e il file layouts/index.html viene usato per generare il suo HTML.
Il file template della home page e vuoto, quindi il file HTML generato e vuoto. Se il template avesse regole, Hugo le avrebbe usate per generare la home page.
La magia dei file statici#
Hugo fa due cose durante la generazione del sito: usa i template per trasformare i contenuti in HTML e copia i file statici nel sito. A differenza dei contenuti, i file statici non vengono trasformati: vengono copiati esattamente come sono.
Il ciclo di sviluppo del tema#
Quando lavori su un tema, farai modifiche nella directory del tema, ricostruirai il sito e verificherai le modifiche nel browser. Hugo rende questo molto semplice:
- Svuota la directory public/.
- Esegui il server web integrato in modalita watch.
- Apri il sito nel browser.
- Aggiorna il tema.
- Dai un’occhiata al browser per vedere i cambiamenti.
- Torna al punto 4.
Svuotare la directory public/#
Quando genera il sito, Hugo crea nuovi file e aggiorna quelli esistenti nella directory public/, ma non elimina i file non piu utilizzati. Si consiglia di pulire il sito prima di rigenerarlo.
L’opzione –watch di Hugo#
L’opzione --watch di Hugo monitora le directory content/ e del tema per le modifiche e ricostruisce il sito automaticamente.
Live Reload#
Il server web integrato di Hugo supporta il live reload. Man mano che le pagine vengono salvate sul server, il browser viene informato di ricaricare la pagina. Di solito accade piu velocemente di quanto si possa dire “incredibile”.
Comandi di sviluppo#
Usa i seguenti comandi come base per il tuo workflow:
| |
Aggiornare il template della home page#
La home page e una delle poche pagine speciali che Hugo crea automaticamente. Come detto prima, cerca uno di tre file nella directory layout/ del tema:
- index.html
- _default/list.html
- _default/single.html
Creare una home page statica#
Aggiungiamo del testo al template:
| |
Costruisci il sito e verifica i risultati:
| |
Costruire una home page “dinamica”#
“Dinamica” in un sito statico? Intendo una home page che rifletta automaticamente i contenuti del sito ogni volta che Hugo la costruisce. Useremo l’iterazione nel template.
Creare nuovi post#
Hugo ha un comando per generare lo scheletro di un post:
| |
Il comando “new” usa un archetype per creare il file del post. Hugo ha creato un file archetype predefinito vuoto, ma cio causa un errore in presenza di un tema. La soluzione e creare un file archetypes specifico per il tipo post:
| |
Il contenuto dei file post e simile a questo:
| |
Costruisci il sito e verifica i risultati. L’output dovrebbe indicare che sono state create 2 pagine:
| |
Template list e single#
In Hugo abbiamo tre tipi principali di template. Il template della home page, che abbiamo gia aggiornato, viene usato solo dalla home page. I template “single” vengono usati per generare l’output per un singolo file di contenuto. I template “list” vengono usati per raggruppare piu contenuti prima di generare l’output.
In generale, i template list si chiamano “list.html” e quelli single “single.html”.
Aggiungere contenuto alla home page#
La home page mostrera un elenco di post. Aggiorniamo il suo template:
| |
Hugo usa il motore di template Go. Quel motore scansiona i file template cercando comandi racchiusi tra “{{” e “}}”:
rangee un iteratore che scorre le prime dieci pagine..Titlestampa il valore della variabile “title” del front matter.endsegnala la fine dell’iteratore range.
Costruisci il sito e verifica: la home page ora mostra i titoli dei due post.
Aggiungere contenuto ai post#
I post si trovano in content/post/. La loro sezione e “post” e il loro tipo e anch’esso “post”.
Hugo usa sezione e tipo per trovare il file template. Prima cerca un file template che corrisponda al nome della sezione o del tipo. Se non lo trova, cerca in _default/. Per i post cerchera prima post/single.html, poi _default/single.html.
Aggiorniamo il template single predefinito:
| |
Costruisci e verifica: i post ora mostrano il loro contenuto.
Creare link ai contenuti#
Aggiungiamo link dalla home page ai post:
| |
Creare un elenco di post#
Abbiamo un file public/post/index.html vuoto. Facciamo in modo che mostri un elenco di tutti i post. Il file template da aggiornare e _default/list.html.
Creare pagine di primo livello#
Aggiungiamo una pagina “about” al primo livello:
| |
La pagina viene creata in about-time/index.html (Hugo usa lo slug per il nome). Notiamo anche che la home page mostra il link “about” insieme ai post. Questo non e desiderabile, quindi aggiorniamo il template:
| |
Per risolvere il problema dell’URL della pagina about, commenta lo slug nel file content/about.md e aggiorna i permalink in config.toml:
| |
Condividere i template#
Se hai seguito fin qui, avrai notato che i post hanno titoli nel browser ma la home page no. Possiamo risolvere usando le partial.
Creare le partial header e footer#
In Hugo, una partial e un template riusabile. Hugo le cerca lungo un percorso di ricerca definito, il che facilita la sovrascrittura della presentazione del tema da parte degli utenti finali.
| |
Aggiornare il template della home page per usare le partial#
La differenza piu evidente tra una chiamata a template e una a partial e l’assenza del percorso:
{{ template "theme/partials/header.html" . }}versus
{{ partial "header.html" . }}Entrambe passano il contesto.
| |
Aggiornare il template single predefinito per usare le partial#
| |
Aggiungere la data di pubblicazione ai post#
E comune che i post mostrino la data in cui sono stati scritti. Aggiungiamo quella funzionalita.
Aggiungere la data al template#
Il codice template sara:
{{ .Date.Format "Mon, Jan 2, 2006" }}I post usano il template single predefinito, quindi modifichiamo quel file:
| |
Costruisci e verifica: i post mostrano la data. Tuttavia, anche la pagina “about” mostra la data, il che non e desiderabile.
La soluzione e creare un template di sezione per i post:
| |
Ora aggiorniamo la versione del template single per i post:
| |
Abbiamo rimosso la logica della data dal template predefinito e l’abbiamo messa nel template del post. Costruisci e verifica: i post hanno le date e la pagina about no.
Non ripetere il codice#
DRY e un buon obiettivo di design e Hugo lo supporta molto bene. Parte dell’arte di un buon template e sapere quando aggiungere un nuovo template e quando aggiornarne uno esistente. Hugo rende il refactoring facile e veloce, quindi va bene rimandare la suddivisione di un template.
Override del tema senza fare fork#
Costruire un tema completo da zero, come mostrato in questo tutorial, offre il controllo totale. Ma nella pratica la maggior parte delle persone parte da un tema esistente (aggiunto come submodule git) e deve solo modificare alcuni aspetti. L’ordine di lookup dei template di Hugo rende questo semplice senza toccare i file sorgente del tema.
La regola e semplice: Hugo controlla la directory layouts/ del tuo sito prima della directory layouts/ del tema. Questo significa che puoi sovrascrivere qualsiasi partial del tema mettendo un file con lo stesso percorso relativo sotto layouts/partials/ del tuo sito.
Ad esempio, questo blog usa il tema Blowfish. Per iniettare un meta tag di verifica Google nella sezione <head> senza modificare il tema, si usa un file:
layouts/partials/extend_head.html<meta name="google-site-verification" content="YOUR_VERIFICATION_CODE" />Il template base di Blowfish chiama {{ partial "extend_head.html" . }} come punto di estensione. Poiche il file a livello di sito viene trovato per primo nell’ordine di lookup, viene usato al posto di quello vuoto incluso nel tema.
Lo stesso pattern funziona per qualsiasi partial. Per sovrascrivere il footer:
layouts/partials/footer.htmlPer sovrascrivere il template single dei post:
layouts/posts/single.htmlPrima di sovrascrivere una partial, ispeziona il sorgente del tema per capire quale contesto (.) riceve. Le partial condividono il contesto della pagina passato a loro, quindi hai accesso a .Title, .Params, site.BaseURL e tutto il resto disponibile nel template chiamante.
Questo pattern mantiene il tuo tema come submodule pulito e non modificato, aggiornabile con git submodule update --remote in qualsiasi momento. Le tue personalizzazioni vivono in layouts/ del tuo sito e sopravvivono agli aggiornamenti del tema.
Se vuoi approfondire uno qualsiasi di questi argomenti, offro sessioni di coaching 1:1 per ingegneri che lavorano su integrazione AI, architettura cloud e platform engineering. Prenota una sessione (50 EUR / 60 min) o scrivimi a manuel.fedele+website@gmail.com.