Lezioni Apprese Aggiornando il Mio Blog
Astro, Tailwind, MDX, Pagefind e altro ancora!
Recentemente, mi sono imbarcato in un viaggio per aggiornare il mio sito Gatsby v1 di oltre 8 anni.
Questo post condividerà alcune lezioni che ho imparato durante questo processo e le interessanti tecnologie che ho esplorato.
Table of Contents
- Project Requirements
- Choosing my Right Technology Stack
- Astro: Learning Curve and Key Features
- Modern CSS: Wow
- Search: Pagefind
- Comments: Utterances
- Tailwind: Regrets
- Conclusion
Project Requirements
Prima di immergermi nell’aggiornamento, ho stabilito una serie di requisiti:
Poiché il mio blog riceve un numero altamente variabile di visualizzazioni di pagina giornaliere, ho pensato che un sito generato staticamente in anticipo mi avrebbe dato le prestazioni desiderate senza complessità aggiuntive.
Inoltre, dovevo mantenere i contenuti e le funzionalità esistenti di questo sito, tra cui:
- Code highlighting
- Comments
- Site Search
- Pre-existing React components: Quiz UI, Gist embeds
- Contact form
- Responsive images
- Sub 1-second load time
- Browser compatibility: 2018+
- Automated + PR-based deployments
Choosing my Right Technology Stack
Nel corso degli anni ho lavorato con molti strumenti per siti statici, da Jekyll, Hugo, Slate e Gatsby. Così come con molti framework front-end: Ember, Knockout, Angular, Vue e ovviamente React.
Quindi, ho esattamente troppe opzioni, che alla fine ho ridotto a Remix, Next.js e Astro,
Potrei scrivere un’intera serie di blog sul mio processo di valutazione, ma lo riassumerò qui:
Ho scelto Astro per la rapidità con cui potevo fare cose significative.
Il design delle loro API è rinfrescantemente semplice. È un ottimo equilibrio tra flessibilità e buone opinioni di design.
È stato rassicurante che Astro non abbia alcun evidente bias cloud o agenda di framework.
Astro non è stata l’unica tecnologia che ho utilizzato, ecco un elenco completo dello stack:
- Astro: Un generatore di siti statici moderno.
- ShadcnUI: Una raccolta di componenti riutilizzabili.
- Tailwind CSS: Un framework CSS utility-first.
- MDX: Contenuti Markdown + componenti inline.
- Pagefind: Libreria di ricerca per siti veloce, statica e offline. Non serve Algolia!
- Utterances: Sistema di commenti basato su GitHub issues.
- Netlify: Deploy automatizzati, form di contatto con captcha.
Astro: Learning Curve and Key Features
Astro è diventato rapidamente la pietra angolare del mio aggiornamento.
Ecco alcune funzionalità chiave che ho trovato particolarmente utili:
- File
.astro: A prima vista, i componenti Astro possono sembrare componenti React JSX, tuttavia sono piuttosto diversi e servono un insieme diverso di obiettivi. (Vedi tabella di confronto sotto.) - Basato sui suoi strumenti di build in Golang e Vite: funziona e basta. Gestisce senza problemi ESM/CJS, TypeScript, bundling del codice, stili, immagini, ecc.
- Nessun bias di framework o bias cloud. (Tosse Next.js, OpenNext)
- Rendering statico vs ibrido: Astro offre flessibilità per targeting sulla maggior parte delle piattaforme cloud: AWS, GCP, Firebase, Netlify, Vercel, Cloudflare Pages, Azure, Fly.io e molte altre.
- Collezioni di contenuti: L’API
getCollectionsemplifica il lavoro con i file di contenuti come fonte di dati. - Routing basato sui file: Il sistema di routing basato sui file di Astro, combinato con
getStaticPaths, rende la generazione delle pagine un gioco da ragazzi. - SEO: Astro non ti mette i bastoni tra le ruote, ed emette solo una quantità minima di
spazzaturaboilerplate (astro-island) quando necessario.
Alcune cose sono state un po’ sorprendenti, come lo styling attorno al markup iniettato da Astro e l’effetto di display:contents.
<style>astro-island,astro-slot,astro-static-slot{display:contents}</style>Comparazione tra componenti .astro e Client Component
I componenti Astro sono essenzialmente template HTML con un potente pattern di componenti e props. Possono recuperare dati in fase di build, accedere a risorse backend e mantenere certe informazioni sensibili nascoste.
Il modo migliore per comprendere i componenti .astro di Astro è confrontarli con i componenti lato client. (React, Vue, Svelte, ecc.)
| Cosa devi fare? | Componente .astro | Client Component |
|---|---|---|
| Generare HTML con un potente pattern template+componente | ✅ | ❌ |
| Recuperare dati in fase di build | ✅ | ❌ |
| Accedere a risorse backend (direttamente) | ✅ | ❌ |
| Mantenere informazioni sensibili nascoste (token di accesso, API key, ecc) | ✅ | ❌ |
| Ridurre il JavaScript lato client | ✅ | ❌ |
| Utilizzare Client component (React, Vue, Svelte, ecc) | ✅ | ✅ |
Aggiungere interattività e listener di eventi (onClick(), onChange(), ecc) | ❌ | ✅ |
Utilizzare State e Lifecycle Effects (useState(), useReducer(), useEffect(), ecc) | ❌ | ✅ |
| Utilizzare API disponibili solo nel browser | ❌ | ✅ |
| Utilizzare custom hook che dipendono da state, effects o API disponibili solo nel browser | ❌ | ✅ |
Modern CSS: Wow
Tornando allo sviluppo frontend, sono rimasto piacevolmente sorpreso dai progressi del CSS nativo:
- Variabili CSS: Disponibili da un po’ e abbastanza stabili tra i browser dal 202*.
- Nesting: Finalmente nelle specifiche, e senza la precedente sintassi goffa. Ora è simile a Less o SCSS.
- Nuovi selettori:
:is(),:where()e:has()offrono un targeting più preciso degli elementi. - Unità moderne come
ch,vwe funzioni comeclamp()forniscono un migliore controllo su layout e tipografia. - Impostare la spaziatura in modo più naturale con gli attributi
-inlinee-block. Imposta padding o margin su uno degli assi orizzontale o verticale. Invece dimargin: 0 1rem 0 1rem→margin-inline: 1rem. - Layout avanzati: Re-imparare CSS Grid. Wow, c’è un sacco di roba lì dentro. Può essere scoraggiante con i suoi apparentemente infiniti modi di utilizzo. Tieni presente che puoi cavartela imparandone 1 o 2. Dai un’occhiata a queste ottime risorse che mi hanno aiutato a fare trucchi con la griglia: video di Kevin Powell: Learn CSS Grid the easy way, Responsive senza media queries, Dieci layout moderni in una riga di CSS.
Search: Pagefind
Implementare una ricerca nel sito senza servizi di terze parti o hosting di database sembrava una sfida divertente. Dopotutto, non è che abbia 10.000 post da indicizzare (per ora.)
Mentre navigavo tra le integrazioni della comunità di Astro ho inciampato in un fantastico strumento che avrei voluto conoscere prima: Pagefind.
Pochi strumenti risolvono un problema così bene come Pagefind risolve la ricerca locale nei siti.
La semplicità di implementazione di Pagefind è una delizia. Può essere integrato con QUALSIASI contenuto di siti statici e puoi scegliere se vuoi un’interfaccia predefinita o costruire qualcosa di personalizzato se preferisci.
Ha risolto perfettamente tutto ciò che volevo. Ci sono voluti solo minuti per integrarlo e la maggior parte del lavoro ha comportato l’aggiunta di un tag <div id="search"></div> e un po’ di styling!
Comments: Utterances
Sfortunatamente, ho dovuto salutare Disqus e i commenti che avevo accumulato in molti anni.
Volevo un migliore controllo/visibilità sugli script di terze parti sul mio sito.
Inoltre, doveva essere semplice e manutenibile.
Questo mi ha portato a scegliere il fantastico servizio Utterances. Il suo sistema di commenti basato su GitHub si allinea bene con il mio pubblico. Inoltre, è facile da configurare e gratuito.
Tailwind: Regrets
C’è solo una tecnologia che sto sempre più rimpiangendo di aver usato: Tailwind.
Col tempo, riesco a sentire la differenza di costo tra scrittura e manutenzione. Tailwind è così veloce da scrivere, tuttavia una volta diventato abbastanza complesso, può diventare tedioso da leggere ed estendere.
Conclusion
Aggiornare il mio vecchio sito Gatsby v1 a uno stack moderno basato su Astro è stata un’esperienza divertente. 10/10, lo consiglio vivamente.
Se stai considerando di aggiornare un vecchio sito o costruirne uno nuovo statico (o ibrido), consiglio vivamente di dare un’occhiata ad Astro. La curva di apprendimento può essere ripida a volte, ma i benefici in termini di prestazioni, esperienza dello sviluppatore e messa in sicurezza futura del tuo progetto valgono bene lo sforzo.