Skip to content

Alpine.js Islands

HTML-first, deklaratives Framework - wie Tailwind für JavaScript.

Überblick

Bundle-Größe: 14-15kb (Alpine Runtime)

Alpine.js ermöglicht es dir, reaktive UIs direkt im HTML zu schreiben.

Grundstruktur

javascript
// islands/counter.js
import Alpine from 'alpinejs';

export default class CounterIsland {
  constructor(element, props = {}) {
    this.element = element;
    const title = props.title || 'Counter';

    const html = `
      <div x-data="{ count: 0 }" class="p-6 bg-white rounded-lg border">
        <h3 class="text-lg font-semibold mb-4">${title}</h3>
        <p class="mb-2">Count: <span x-text="count"></span></p>
        <p class="mb-4 text-gray-600">Doubled: <span x-text="count * 2"></span></p>
        <div class="flex gap-2">
          <button @click="count--" class="px-4 py-2 bg-gray-600 text-white rounded">-</button>
          <button @click="count++" class="px-4 py-2 bg-blue-600 text-white rounded">+</button>
        </div>
      </div>
    `;

    element.innerHTML = html;

    if (!window.Alpine) {
      window.Alpine = Alpine;
      Alpine.start();
    } else {
      Alpine.initTree(element);
    }
  }

  destroy() {
    this.element.innerHTML = '';
  }
}

Kernkonzepte

Direktiven - HTML-First

Alpine.js bringt Reaktivität direkt ins HTML:

html
<!-- State deklarieren -->
<div x-data="{ count: 0, open: false }">

  <!-- Text anzeigen -->
  <span x-text="count"></span>

  <!-- Events -->
  <button @click="count++">Increment</button>

  <!-- Conditional Rendering -->
  <div x-show="open">Content</div>

  <!-- Loop -->
  <template x-for="item in items">
    <div x-text="item.name"></div>
  </template>

  <!-- Two-way binding -->
  <input x-model="message">
</div>

Magische Properties

html
<div x-data="{ items: [] }">
  <!-- $el - Aktuelles Element -->
  <button @click="$el.classList.add('active')">Click</button>

  <!-- $refs - Referenzen -->
  <input x-ref="myInput">
  <button @click="$refs.myInput.focus()">Focus</button>

  <!-- $watch - State beobachten -->
  <div x-init="$watch('count', value => console.log(value))">
</div>

Vorteile

  • HTML-First - Reaktivität im Markup
  • Einfach - Wie Tailwind für JS
  • Kein Build-Step - Direkt im Browser
  • Schnell - Für einfache Interaktionen

Nachteile

  • Bundle-Größe - 14-15kb (größer als Svelte/Preact)
  • Komplexität - Nicht ideal für komplexe UIs
  • Testbarkeit - Logik im HTML schwer testbar

Vollständige Beispiele

Siehe Beispiele mit Islands für vollständige Implementierungen:

Webmate Studio Component Development Dokumentation