Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Introduzione ad Alpine.js

Alpine.js: introduzione alla libreria JavaScript estremamente leggera che permette di aggiungere interattività alle pagine web
Alpine.js: introduzione alla libreria JavaScript estremamente leggera che permette di aggiungere interattività alle pagine web
Link copiato negli appunti

Lanciata su GitHub nel 2019 da Caleb Porzio, Alpine.js è una libreria JavaScript che permette di aggiungere interattività alle pagine web estremamente leggera, appena 7KB compressa gzip, con un impatto minimo sulle prestazioni. Alpine, quindi, garantisce tempi di caricamento ridotti, minore consumo di banda e migliori prestazioni, soprattutto sui dispositivi mobili.

Ispirata a Vue.js, ma ideale per progetti che non necessitano della complessità di Vue.js, Alpine vuole essere una soluzione simile a jQuery per semplicità di utilizzo, ma con un approccio dichiarativo.

Alpine permette di manipolare il DOM, gestire lo stato dell'applicazione, rispondere agli eventi e si adatta in particolare a progetti di piccole e medie dimensioni, come siti statici, applicazioni web con interazioni semplici, siti con risorse limitate.

Alpine, inoltre, si presta bene allo sviluppo di applicazioni web basate su Astro e htmx, il cosiddetto AHA Stack, e per aggiungere interattività ai temi WordPress senza appesantire i siti.

Oltre che per la leggerezza, Alpine si fa apprezzare per la semplicità, avendo una bassa curva di apprendimento. Non richiede poi l'esecuzione di una build dato che per utilizzare la libreria basta un tag script.

Caratteristiche generali di Alpine.js

Alpine.js adotta un approccio basato su componenti, elementi autonomi che racchiudono stato e comportamento. A differenza di altri framework, i suoi componenti non richiedono file separati o strumenti di build: vengono definiti direttamente nell'HTML attraverso l'attributo x-data.

In pratica, un componente è qualsiasi elemento del DOM che contiene la direttiva x-data:

<div x-data="{ count: 0 }">
	<button @click="count++">+1</button>
	<span x-text="count"></span>
</div>

Gli attributi, o direttive, di Alpine permettono di aggiungere interattività in modo dichiarativo. A differenza di quanto avviene con librerie che hanno un approccio imperativo, come jQuery, con Alpine.js si dichiara cosa si vuole che accada, invece che descrivere esattamente le operazioni da eseguire.

Le direttive iniziano tutte con il prefisso x- (ad esempio x-data, x-bind, x-show, ecc.) e possono essere raggruppate a seconda della funzione. Vediamo quali sono le direttive d'uso più comune.

Gestione dei dati e dei componenti: x-data e x-init

La direttiva x-data definisce un componente Alpine.js e fornisce i dati che saranno utilizzati dal componente stesso in un oggetto JSON. Nel codice che segue, viene dichiarata la variabile message:

<h1 x-data="{ message: 'Hello world!' }" x-text="message"></h1>

In questo esempio, x-data definisce il set di dati del componente, mentre x-text imposta il contenuto testuale dell'elemento h1.

La direttiva x-init esegue un'espressione JavaScript quando il componente viene inizializzato. Ecco un esempio:

<div x-data="{ date: null }" x-init="date = new Date()">
	<p x-text="date"></p>
</div>

Collegamento dei dati agli elementi del componente: x-bind e x-model

x-bind (in forma abbreviata :) lega un attributo HTML a un'espressione JavaScript: quando il valore dell'espressione cambia, l'attributo viene aggiornato automaticamente.

x-model imposta un collegamento (binding) bidirezionale tra un elemento di input e un dato del componente.

Ecco un esempio in cui si fa uso delle direttive x-bind e x-model:

<div x-data="{ textColor: 'black' }">
	<p x-bind:style="{ color: textColor }">Questo testo cambia colore</p>
	<input type="color" x-model="textColor">
</div>

In questo esempio,

  • abbiamo dichiarato la proprietà textColor x-data
  • x-model textColor
  • x-bind:style

In sintesi, quando l'utente seleziona un colore nel color picker, il colore del testo contenuto nell'elemento p si aggiorna di conseguenza.

Le direttive x-bind e x-model di Alpine aggiungono interattività agli elementi del DOM

Le direttive x-bind e x-model di Alpine aggiungono interattività agli elementi del DOM

Contenuti testuali e codice HTML: x-text e x-html

La direttiva x-text imposta dinamicamente il contenuto testuale di un elemento al valore di un'espressione JavaScript. Nell'esempio che segue, l'espressione genera una nuova data che viene impostata dinamicamente come contenuto dello span:

<div x-data="{ currentYear: new Date().getFullYear() }">
	Copyright © <span x-text="currentYear"></span>
</div>

x-html imposta dinamicamente il contenuto HTML di un elemento al valore di un'espressione JavaScript.

<div x-data="{ htmlContent: '<strong>Testo formattato</strong>' }">
	<div x-html="htmlContent"></div>
</div>

x-text e x-html non sono intercambiabili. x-text imposta il contenuto testuale di un elemento, mentre x-html imposta un contenuto HTML e va usato con cautela perché può generare vulnerabilità XSS (Cross-Site Scripting).

Gestione degli eventi con Alpine.js: x-on

x-on (in forma abbreviata @) esegue un'espressione JavaScript al verificarsi di un evento su un determinato elemento. Nell'esempio che segue, un contatore viene aggiornato dinamicamente al clic dell'utente su un pulsante:

<div x-data="{ count: 0 }">
	<button x-on:click="count++">Incrementa</button>
	<span x-text="count"></span>
</div>

Controllo del flusso: x-if e x-for

x-if aggiunge o rimuove completamente un elemento in base al valore di un'espressione JavaScript. Ecco un esempio:

<div x-data="{ open: false }">
	<button @click="open = ! open">Toggle</button>
	<template x-if="open">
		<div>Contents...</div>
	</template>
</div>

x-for ripete un blocco di codice HTML per ogni elemento di un array. Il codice che segue genera un elemento di lista per ogni elemento dell'array items:

<div x-data="{ items: ['foo', 'bar', 'baz'] }">
	<ul>
		<template x-for="item in items" :key="item">
			<li x-text="item"></li>
		</template>
	</ul>
</div>

Si noti l'elemento template con x-if e x-for. Si tratta di un contenitore invisibile che permette ad Alpine di gestire elementi dinamici senza appesantire il DOM. template sarà analizzato più dettagliatamente nelle prossime lezioni.

x-show e x-transition

La direttiva x-show permette di controllare la visibilità degli elementi del DOM in base a una condizione JavaScript. A differenza di x-if, che rimuove completamente un elemento dal DOM, x-show assegna la proprietà CSS display: none a un elemento.

La direttiva x-transition esegue la transizione di un elemento utilizzando le transizioni CSS. Ecco come utilizzare le due direttive:

<div x-data="{ show: false }">
	<button @click="show = ! show">Toggle</button>
	<div x-show="show" x-transition.duration.500ms>
		Hello 👋
	</div>
</div>

Riferimenti al DOM

x-ref fa direttamente riferimento agli elementi del DOM tramite le chiavi specificate, utilizzando la proprietà magica $refs. Nell'esempio che segue, al clic sul pulsante viene generato dinamicamente il testo dell'elemento p individuato dall'attributo x-ref:

<div x-data>
	<button @click="$refs.output.textContent = 'Ciao mondo!'">Scrivi testo</button>
	<p x-ref="output"></p>
</div>

In questa lezione introduttiva abbiamo descritto le caratteristiche generali della libreria Alpine.js e alcune delle direttive più utilizzate. Per ragioni di spazio, non abbiamo citato altre direttive importanti, come x-cloak, per la gestione del FOUC (Flash of Unstyled Content), e x-effect per gli effetti collaterali. Nel prossimo capitolo vedremo come gestire lo stato dei componenti Alpine.

Ti consigliamo anche