Skip to content

Lit Islands

Web Components mit Lit - standardbasierte, wiederverwendbare Components.

Überblick

Bundle-Größe: 7-8kb (Lit Runtime)

Lit baut auf Web Components Standards für maximale Wiederverwendbarkeit.

Grundstruktur

javascript
// islands/counter.js
import { LitElement, html } from 'lit';

class CounterComponent extends LitElement {
  static properties = {
    title: { type: String },
    count: { type: Number }
  };

  // Disable Shadow DOM for Tailwind support
  createRenderRoot() {
    return this;
  }

  constructor() {
    super();
    this.title = 'Counter';
    this.count = 0;
  }

  increment() {
    this.count++;
  }

  render() {
    return html`
      <div class="p-6 bg-white rounded-lg border">
        <h3 class="text-lg font-semibold mb-4">${this.title}</h3>
        <p class="mb-2">Count: ${this.count}</p>
        <p class="mb-4 text-gray-600">Doubled: ${this.count * 2}</p>
        <div class="flex gap-2">
          <button @click=${() => this.count--} class="px-4 py-2 bg-gray-600 text-white rounded">-</button>
          <button @click=${this.increment} class="px-4 py-2 bg-blue-600 text-white rounded">+</button>
        </div>
      </div>
    `;
  }
}

// Unique name for HMR
const timestamp = Date.now();
const uniqueName = `counter-component-${timestamp}`;

if (!customElements.get(uniqueName)) {
  customElements.define(uniqueName, CounterComponent);
}

export default class CounterIsland {
  constructor(element, props = {}) {
    this.element = element;
    const component = document.createElement(uniqueName);
    Object.assign(component, props);
    element.appendChild(component);
    this.component = component;
  }

  destroy() {
    this.component?.remove();
  }
}

Kernkonzepte

Reaktive Properties

javascript
static properties = {
  title: { type: String },
  count: { type: Number },
  items: { type: Array }
};

Lifecycle

javascript
connectedCallback() {
  super.connectedCallback();
  // Component hinzugefügt
}

disconnectedCallback() {
  super.disconnectedCallback();
  // Component entfernt
}

updated(changedProperties) {
  // Nach Update
  if (changedProperties.has('count')) {
    console.log('Count changed');
  }
}

Templates

javascript
render() {
  return html`
    <div>
      <h3>${this.title}</h3>
      <button @click=${this.increment}>
        Count: ${this.count}
      </button>
    </div>
  `;
}

Vorteile

  • Web Components Standard - Standardkonform
  • Wiederverwendbarkeit - Auch außerhalb des CMS nutzbar
  • Moderne API - Lit Template System
  • Mittlere Bundle-Größe - 7-8kb

Nachteile

  • Shadow DOM - Tailwind erfordert createRenderRoot()
  • Verbosity - Mehr Code als Svelte
  • Bundle-Größe - Größer als Svelte/Preact

Vollständige Beispiele

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

Webmate Studio Component Development Dokumentation