Microfrontend: cosa sono e perché usarli | Antreem
Vai al blog

Microfrontend: cosa sono e perché usarli

di lettura
Massimo Artizzu
thumbnail

Nel mondo dello sviluppo web, si sta diffondendo sempre di più la tecnica dello sviluppo a microfrontend. Si tratta di uno dei concetti più innovativi del mondo frontend dai tempi dell’introduzione delle Single Page Application (SPA). Esso però, sostanzialmente, riprende e riadatta tecniche già utilizzate ma mai definite in maniera organica e ora in parte dimenticate.

L’idea di base è mutuata dalla tecnica dei microservizi, già ampiamente diffusa nel mondo dello sviluppo backend, in cui un’applicazione altro non è che un insieme di servizi. Tali servizi hanno la caratteristica di essere per nulla o debolmente accoppiati (cioè senza o con una quantità minimale di punti di interazione tra di loro, come ad esempio un database o una cache), e di granularità più fine possibile, vale a dire che la funzionalità dev’essere minimale. Amazon stabilisce la regola informale per cui, per non eccedere con il numero dei membri del team di sviluppo di un microservizio, esso si possa nutrire con al più due pizze (americane, quindi di grandi dimensioni).

Grafico rappresentante un'applicazione a microservizi. Ogni microservizio è un box indipendente e punta al gateway dell'applicazione, il quale punta al client. Alcuni microservizi puntano inoltre bidirezionalmente a dipendenze ausiliarie quali database, cache e bridge.
Schema di applicazione a microservizi. Ogni microservizio potrebbe dipendere da altri applicativi indipendenti (ad esempio, un proprio database), estendendo il livello di disaccoppiamento.

I vantaggi di questo approccio sono evidenti:

  • i team di sviluppo dei microservizi sono il più possibile indipendenti e non ostacolano il lavoro di altri gruppi con i propri problemi o ritardi;
  • il crash di un singolo microservizio non compromette la stabilità degli altri microservizi;
  • conseguentemente, la stabilità dello stesso gateway ne guadagna;
  • la superficie di attacco dell’applicazione è frammentata tra i vari microservizi, isolando il problema di eventuali hack malevoli.

Lo sviluppo frontend oggi

Nello sviluppo frontend si è invece assistito a un’evoluzione delle pratiche di sviluppo in senso sostanzialmente opposto. L’avvento delle Single Page Application – che siano sviluppate in React, in Angular o in qualsivoglia framework moderno – ha implicato che le applicazioni web fossero gestite interamente da un unico applicativo monolite, con un livello di accoppiamento elevato tra le funzionalità. Questo ha a sua volta comportato dei vantaggi:

  • facilità di creare un look&feel omogeneo dell’applicazione;
  • gestione delle rotte del browser come parte integrante dello stato dell’applicazione;
  • download una tantum degli asset dell’applicazione;
  • trasferimento dati ridotto al solo aggiornamento dello stato.

Tuttavia, lo sviluppo frontend non si è sempre esplicitato in applicazioni monolitiche. C’è stato un periodo in cui pagine e applicazioni web erano usualmente composte da uno scheletro principale e da un insieme di widget isolati e affiancati spesso in maniera disomogenea. Ma è da qui che parte il concetto di microfrontend.

I concetti di base

L’idea di partenza di un’architettura a microfrontend consiste nella suddivisione dell’interfaccia complessiva in sotto-funzionalità interattive il più possibile indipendenti.

Suddivisione di un'interfaccia utente in blocchi interattivi distinti: il contenuto al centro; menù e feed social sulla sinistra; stato utente in alto; pubblicità e chat sulla destra
Esempio di suddivisione di un sito o applicazione web in interfacce indipendenti e sviluppabili come microfrontend.

Una volta individuate le sottointerfacce, si procede allo sviluppo di ciascuna di esse – che diverrà così un microfrontend – parallelamente tra team differenti, e del layer di gestione e coordinamento dei vari microfrontend. Questo è un approccio che ricalca quello dell’architettura a microservizi, dove il layer orchestratore fa le veci del gateway di backend.

Ogni microfrontend consisterà quindi di una piccola applicazione rappresentante un’unica feature, caricata e visualizzata dal layer orchestratore insieme alle altre, e indipendente da esse. La realizzazione userà i comuni metodi di sviluppo frontend, basati su un framework moderno (Angular, Vue, React, …) e librerie di manipolazione dati e viste.

I vantaggi immediati sono i seguenti, simili a quelli già noti per i microservizi:

  • maggiore libertà dei team di scelta del proprio stack tecnologico;
  • minor impegno necessario per il coordinamento tra team e più tempo dedicato allo sviluppo e alla cura del prodotto;
  • sviluppi delle singole parti più spediti perché indipendenti tra loro.

Del resto, sono subito evidenti anche i compromessi da accettare per l’uso dei microfrontend:

  • ogni microfrontend avrà come dipendenze le proprie librerie e framework necessari per il funzionamento: è dunque possibile che l’utente debba scaricare, analizzare ed eseguire più versioni dello stesso pacchetto;
  • le linee guida di design UI e UX devono essere chiare e ben definite anzitempo, pena il rischio di avere una cacofonia di esperienze utente;
  • il layer orchestratore deve avere un’interfaccia chiara e concordata con i team di sviluppo.

Realizzare l’isolamento

Uno dei punti fondamentali del concetto dei microfrontend, al pari di quello dei microservizi, è il disaccoppiamento tra gli stessi. Questo significa che ogni parte dell’interfaccia dovrà avere influenza su un proprio ramo del DOM della pagina, avrà stili che agiscono solo e soltanto su esso, e dovrà definire un namespace nello spazio delle variabili globali da cui non dovrà uscire.

Schema rappresentante l'orchestrazione dei microfrontend
I microfrontend sono contenuti e comunicano col layer orchestratore tramite un’interfaccia ben definita. La creazione di eventi globali, come mostrare una finestra di dialogo, è delegata all’orchestratore con l’invio di messaggi con payload concordato.

Il metodo più semplice per realizzare ciò è l’uso di elementi <iframe>, che però pagano lo scotto di essere pesanti dal punto di vista del caricamento e dell’occupazione di memoria. Inoltre relegano a un’area visuale ben definita il microfrontend, senza possibilità di uscirne facendo a meno del layer orchestratore.

Un altro valido approccio consiste nell’impacchettamento del microfrontend in un custom element, possibilmente con incapsulamento degli stili. Un framework come Angular supporta questa procedura nativamente.

Tre blocchi rappresentanti differenti custom elements: sulla sinistra, un elemento news-feed e uno app-weather; sulla destra, user-chat
I Custom Elements, con i loro Shadow DOM e stile incapsulato, offrono il livello di isolamento necessario per un’architettura a microfrontend.

Negli altri casi, la versione pacchettizzata dei microfrontend dovrà essere tenuta isolata prestando cura a ogni aspetto di possibile conflitto tra le varie parti.

Microfrontend: perché sì

A questo punto è chiaro che un’architettura a microfrontend ha come obiettivo la developer experience (DX), al fine di ottimizzare la frequenza degli aggiornamenti e l’isolamento dei problemi, sacrificando in parte i tempi di startup iniziale e impegno di memoria e processore.

Questo è un approccio che ha come sfera ideale le applicazioni web di larga scala usate in ambito business, ma non esclude anche altre piattaforme web di ampio utilizzo dove il “peso” della parte puramente applicativa è sovrastato da altri asset (ad esempio la fruizione di contenuti multimediali).

Microfrontend: perché no

Come accennato, l’utilizzo di un’architettura a microfrontend comporta dei compromessi a livello di impegno di risorse. Tali risvolti si possono mitigare con un’infrastruttura di sistema che consenta la condivisione di pacchetti e librerie comuni, tramite uso di una Content Delivery Network (CDN) e protocolli di trasferimento più moderni come HTTP/2 e il prossimo HTTP/3. C’è da ricordare che consentire più libertà ai team nel scegliere il proprio stack tecnologico non significa lasciare carta bianca: è perfettamente legittimo circoscrivere l’ambito delle scelte a determinati framework e librerie comuni, in modo da creare anche delle codebase omogenee e più gestibili tramite code review.

Grafico con un box etichettato come Orchestratore che include due box microfrontend; un box esterno, CDN, contiene altri box di singoli pacchetti (React, axios, moment) che sono collegati in vario modo a orchestratore e microfrontend.
L’utilizzo di una CDN consente di minimizzare le risorse da scaricare qualora siano condivise tra i vari microfrontend e l’orchestratore (che a sua volta è un’applicazione). Alcuni microfrontend potrebbero comunque portarsi dietro pacchetti specifici dell’applicazione.

Tuttavia, anche con questi accorgimenti l’uso dei microfrontend potrebbe non essere la soluzione migliore. Ad esempio:

  • se l’ambito del progetto è gestibile da un unico team;
  • se è possibile avere una buona parallelizzazione degli sviluppi delle varie parti dell’applicazione tra i vari team;
  • se, per via del target di utenza e di connettività, si debba puntare a un uso di risorse del client minimale.

La scelta migliore

Deve essere innanzitutto chiaro che i microfrontend non sono una tecnica che consente di fare cose nuove, ma solo di affrontare i progetti con un nuovo approccio. Infatti, gli stessi risultati si possono raggiungere con uno sviluppo monolitico, ma questo comporta coordinamento, affiatamento e capacità di comunicazione tra team, nonché una diffusione delle capacità tecniche frutto di parecchi anni di esperienza.

Quando anche solo uno di questi punti viene a mancare si va incontro a normali problemi di coordinamento tra team che l’approccio dei microfrontend cerca di aggirare. Ad esempio, questa metodologia può essere valida nel caso di feature sviluppate da diversi team di fornitori esterni, che non sempre possono contare su una comunicazione fra loro ottimale.

Scelte simili di sviluppo sono sempre state intraprese, ma senza un approccio formale e una definizione precisa del metodo impiegato. Di conseguenza non si era finora arrivati a curare le varie problematiche di sviluppo sopra elencate.

Oggi la definizione del concetto di microfrontend aiuta a puntare l’attenzione proprio su questi aspetti metodologici.

Massimo Artizzu
Scritto da
Massimo Artizzu
Formato in Matematica, ma adottato professionalmente nella programmazione, un pallino avuto sin da piccolo. Amante di enigmi e origami, giocatore di rugby per diletto.