HTML web components: introduzione
I Web Components sono un set di standard W3C che permettono di creare elementi HTML riutilizzabili e incapsulati, indipendenti dal framework usato. Combinano Custom Elements, Shadow DOM e HTML Templates per offrire una soluzione nativa al problema della componentizzazione, paragonabile a React o Vue ma senza dipendenze esterne. Vediamo i fondamenti.
I tre pilastri
Custom Elements permettono di definire nuovi tag HTML con comportamento personalizzato. Shadow DOM offre incapsulamento di stili e markup, isolando il componente dal resto della pagina. HTML Templates (<template> e <slot>) consentono di definire markup riutilizzabile con punti di estensione. Insieme costituiscono la base per costruire componenti veri, autonomi, riusabili tra progetti e framework diversi.
Vantaggi
Nessuna dipendenza da framework specifici: il tuo componente funziona in React, Vue, Angular, vanilla JS. Standard nativo del browser: nessun build step, nessuna dipendenza, nessun bundler obbligatorio. Incapsulamento reale tramite Shadow DOM: niente conflitti CSS con il resto della pagina. Sono ideali per design system aziendali, librerie UI condivise, micro-frontend, widget embeddabili in pagine eterogenee.
Lit e librerie helper
Costruire Web Components da zero è verboso. Lit (lit.dev, di Google) offre un'API moderna: dichiari templates con template literals tagged (html`...`), reactivity con decoratori @property, lifecycle semplificato. Bundle finale ~5KB. Alternative: Stencil (di Ionic) compila Web Components ottimizzati, FAST (di Microsoft) offre componenti enterprise pronti. Per componenti riusabili tra progetti React/Vue/Angular l'investimento in Web Components paga: scrivi una volta, usi ovunque, senza tax di framework specifico né lock-in.
Adozione nel mondo reale
YouTube, Twitter, GitHub, ING, Photoshop Web, Salesforce Lightning usano Web Components in produzione. Adobe Spectrum, Microsoft FAST sono design system enterprise basati su Web Components. La maturità tecnologica è ottima nel 2026, supporto browser universale. Particolarmente potenti per: design system aziendali, micro-frontend con architetture moderne, librerie UI da distribuire come pacchetti standalone, widget embeddabili in pagine eterogenee dove non puoi imporre un framework specifico al consumatore del componente riusabile.
Server-side rendering
Per default i Web Components renderizzano lato client. Per SEO e first paint veloce, esistono soluzioni SSR: Lit-SSR per componenti Lit, hydration declarativa con Declarative Shadow DOM (template shadowrootmode="open"). Frameworks come Astro, Enhance, e WebC supportano Web Components in SSR nativamente. Pattern: server emette HTML con shadow DOM dichiarativo, client hydrata aggiungendo interattività. Strategia ideale per landing page, content-heavy sites, e dovunque il primo render veloce conta. Web Components con SSR competono direttamente con React Server Components in termini di performance e capabilities.
Distribuzione e versioning
I Web Components si distribuiscono come pacchetti npm standard. Vendor major design system pubblicano i loro componenti su npm: @shoelace-style/shoelace, @adobe/spectrum-web-components. Caricamento via import oppure tag script type=module diretto. Versioning semver come ogni libreria JavaScript. Vantaggio rispetto a React/Vue: l'utente del componente non deve usare lo stesso framework, può integrarli in qualsiasi stack. Per produrre componenti riusabili enterprise, il standard Web Components ti dà autonomia dal framework lock-in del consumatore finale del tuo design system pubblicato.
Risorse e community
Per imparare Web Components: documentazione MDN, web.dev guides di Google, libro "Web Components in Action" di Ben Farrell, video tutorial su YouTube di channel come Fireship, Lit-html docs. Community Discord di Lit, forum di Stack Overflow tag web-components. Strumenti dev: Storybook supporta Web Components per documentazione e showcase, Cypress per E2E testing, Web Test Runner per unit testing. Per pubblicare componenti: npm package con TypeScript types, README con esempi, demo deployata su CodeSandbox o StackBlitz. Patterns design system: webcomponents.dev offre playground e showcase di componenti pubblici per ispirazione e learning.
Procedura passo-passo
- Definisci una classe che estende HTMLElement: class MyButton extends HTMLElement.
- Nel constructor crea uno shadow root: this.attachShadow({mode: 'open'}).
- Imposta innerHTML dello shadowRoot con HTML+CSS del componente.
- Registra il custom element: customElements.define('my-button', MyButton).
- Usa il componente nell'HTML: <my-button>Click</my-button>.
- Per content projection usa <slot> nel template.
- Implementa lifecycle: connectedCallback, disconnectedCallback, attributeChangedCallback.
Errori comuni e come risolverli
- Tag senza trattino: Custom Element richiede almeno un trattino nel nome (kebab-case); my-button OK, mybutton no.
- Stili globali nello shadow: lo Shadow DOM isola; gli stili globali non penetrano (è feature, non bug).
- Mancanza di lifecycle: dimenticare connectedCallback per setup; impostare event listener nel constructor è sconsigliato.
- Reactivity manuale: i Web Components non hanno reactivity built-in; gestisci aggiornamenti manualmente o con librerie come Lit.
- Compatibilità polyfill: browser molto vecchi richiedono polyfill, ma quelli moderni li supportano nativamente.
Domande frequenti
D: Web Components sostituiscono React?
R: Non necessariamente; complementari. Web Components per componenti cross-framework, React per logica di app.
D: Sono SEO-friendly?
R: Sì se renderizzati lato server o se il contenuto critico è nello slot light DOM.
D: Esistono librerie per semplificarli?
R: Sì: Lit (Google), Stencil, FAST sono le più popolari per sviluppo produttivo.
D: Posso usarli con TypeScript?
R: Assolutamente sì; tipo HTMLElement è nativo e i decoratori semplificano la sintassi.
Hai bisogno di aiuto?
Se vuoi sviluppo web con il team di G Tech Group, scrivici tramite il modulo di contatto.