back to top

Costruire Componenti Web Reattivi con Lit

Introduzione a Lit

Lit è una libreria moderna basata sugli standard dei Web Components, pensata per semplificare la creazione di interfacce utente reattive e modulabili. A differenza di framework più pesanti, Lit sfrutta in modo nativo Custom Elements e Shadow DOM, mantenendo al minimo la complessità e al massimo la compatibilità con il web platform. Questo lo rende ideale per sviluppatori frontend che desiderano costruire UI scalabili senza reinventare la ruota.

A differenza di un approccio classico basato su framework all-in-one, Lit si integra bene con design system e componenti preesistenti, come abbiamo visto nel contesto della guida all’integrazione di design system.

Impostazione del Progetto

Per iniziare con Lit, possiamo usare gli strumenti ufficiali proposti dagli sviluppatori Google o impostare un progetto con bundler come Vite o Webpack. Un setup minimale potrebbe partire da un semplice file HTML con import diretto da un CDN.

<!DOCTYPE html>
<html lang="it">
  <head>
    <script type="module" src="https://unpkg.com/lit@latest?module"></script>
  </head>
  <body>
    <my-component></my-component>
  </body>
</html>

Se si vuole adottare un ambiente più strutturato, è possibile configurare Vite con supporto TypeScript e Lit, ottenendo hot-reload nativo e ottime performance in fase di sviluppo. Questo approccio risulta utile anche per applicazioni come Progressive Web App.

Creare Componenti di Base

Un componente Lit si definisce estendendo LitElement e dichiarando un template renderizzato con la funzione html. Ecco un esempio di base:

import { LitElement, html, css } from 'lit';

class MyComponent extends LitElement {
  static styles = css`
    p {
      color: blue;
      font-weight: bold;
    }
  `;

  render() {
    return html`<p>Ciao da Lit!</p>`;
  }
}

customElements.define('my-component', MyComponent);

Il componente è autonomo, incapsula i propri stili e può essere usato ovunque in un documento HTML. Questa struttura consente di ridurre conflitti di namespace e garantire maggiore riutilizzabilità.

Gestione dello Stato

La reattività di Lit è strettamente legata alla gestione delle proprietà. Decorando i campi di classe con @property, il componente riesce a rilevare cambiamenti e a reagire automaticamente.

import { LitElement, html } from 'lit';
import { property } from 'lit/decorators.js';

class CounterButton extends LitElement {
  @property({ type: Number }) count = 0;

  _increment() {
    this.count++;
  }

  render() {
    return html`
      <button @click="${this._increment}">Cliccato ${this.count} volte</button>
    `;
  }
}

customElements.define('counter-button', CounterButton);

Ogni aggiornamento dello stato forza Lit a ri-renderizzare il template, aggiornando solo le parti davvero necessarie del DOM. Una caratteristica fondamentale per garantire performance elevate, come discusso anche nella guida a ottimizzazione per dispositivi a bassa potenza.

Utilizzare Slot e Props

Lit supporta i <slot>, consentendo la composizione di componenti più complessi. Questa capacità semplifica la creazione di layout flessibili mantenendo la logica riutilizzabile.

<card-component title="Demo">
  <p>Questo contenuto è slottato nel body del componente.</p>
</card-component>

Un card component in Lit può leggere attributi come title ed esporre uno slot per il contenuto dinamico. Ciò semplifica la costruzione di UI complesse, particolarmente utile se si punta a migliorare la UX con Web Components.

Aggiunta di Stili e Animazioni

Gli stili in Lit sono incapsulati tramite Shadow DOM, prevenendo conflitti con il CSS globale. È possibile aggiungere sia stili statici che dinamici. Ecco un esempio con animazioni CSS:

:host {
  display: block;
  animation: fadeIn 0.5s ease-in-out;
}

button {
  background: linear-gradient(90deg, #007aff, #00ffa6);
  border: none;
  color: white;
  padding: 0.8rem 1.2rem;
  cursor: pointer;
  transition: transform 0.2s ease;
}

button:hover {
  transform: scale(1.05);
}

@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

Le possibilità di combinazione con microinterazioni e accessibilità sono molteplici. Ad esempio, leggere la guida su ARIA e microinterazioni può aiutare a integrare soluzioni più inclusive e moderne.

Test dei Componenti

Una buona pratica nello sviluppo con Lit è testare i componenti in ambienti isolati con tool come Storybook, Jest o Playwright. Questo permette di garantire robustezza e prevenire regressioni.

Ad esempio, la combinazione di Jest con @testing-library/dom consente di effettuare snapshot test e simulazioni di interazioni utente. Puoi approfondire nella guida su testing frontend moderno e in quella dedicata a testare componenti web con Storybook e Jest.

import { fixture, html } from '@open-wc/testing';
import '../counter-button.js';

describe('counter-button', () => {
  it('incrementa al click', async () => {
    const el = await fixture(html`<counter-button></counter-button>`);
    const button = el.shadowRoot.querySelector('button');
    button.click();
    expect(el.count).to.equal(1);
  });
});

Concludere e Risorse Utili

Lit rappresenta un approccio pragmatico e moderno alla costruzione di componenti web reattivi. La sua leggerezza, unita al supporto per lo Shadow DOM e ai decoratori per la gestione dello stato, permette di sviluppare interfacce scalabili, performanti e compatibili con l’ecosistema web standard.

Per consolidare quanto visto, si consiglia di:

Lit non è solo un framework, è un pattern di sviluppo basato sugli standard del web, pensato per durare nel tempo. Se inizi oggi, stai già costruendo in modo nativo per il futuro.

Condividi

Articoli Recenti

Categorie popolari