Vue 3 Composition API vs Options API für große Komponentenbibliotheken
Vue 3 Composition API vs Options API: Wie sich beide auf Wiederverwendung, Tests und Einarbeitung in großen Admin-Komponentenbibliotheken und Contributor-Teams auswirken.

Warum diese Wahl in großen Admin-Komponentenbibliotheken wichtig ist
Eine große Komponentenbibliothek in einer Admin-App ist kein Marketingauftritt mit ein paar Buttons. Es sind Dutzende (oder Hunderte) Bausteine, die sich über Bildschirme wiederholen: Datentabellen mit Sortierung und Massenaktionen, Filter-Panels, Formulare mit Validierungsregeln, Drawer und Modals, Bestätigungsabläufe und kleine Helfer wie Datumswähler und Berechtigungs-Gates.
Weil diese Muster überall auftreten, kopieren Teams oft Code und passen ihn an, um Deadlines zu halten. Eine Tabelle bekommt eine eigene Filterleiste, eine andere eine leicht andere — und bald hast du fünf "fast gleiche" Versionen. Dann hört die Frage Composition API vs Options API auf, nur eine persönliche Vorliebe zu sein, und beginnt die Gesundheit der ganzen Bibliothek zu beeinflussen.
Zuerst bricht meist die Konsistenz. Die UI funktioniert weiter, aber das Verhalten driftet: Ein Modal schließt per Escape an einer Stelle, an einer anderen nicht; dasselbe Formularfeld validiert auf Blur auf einer Seite und erst beim Submit auf einer anderen. Danach sinkt die Geschwindigkeit, weil jede Änderung das Durchsuchen von Beinahe-Duplikaten erfordert. Schließlich sinkt das Vertrauen: Leute vermeiden Refactors, weil sie nicht vorhersagen können, was alles betroffen ist.
Drei praktische Entscheidungen sind in einer geteilten Bibliothek am wichtigsten:
- Code-Wiederverwendung: wie man geteilte Logik verpackt, ohne verknotete Abhängigkeiten.
- Testing: wie leicht sich Verhalten verifizieren lässt, ohne fragile, UI-schwere Tests.
- Onboarding: wie schnell ein neuer Mitwirkender eine Komponente lesen und sicher ändern kann.
Ein einfaches Beispiel: Deine Admin-Oberfläche hat 20 Listen-Seiten und das Produktteam möchte eine "Gespeicherte Filter"-Funktion. Wenn Tabelle, Filter und URL-Sync-Logik verstreut und inkonsistent sind, wirst du es entweder langsam ausliefern oder mit Bugs liefern. Der gewählte API-Stil beeinflusst, ob diese Logik an einem wiederverwendbaren Ort lebt, wie klar sie in jeden Screen eingebunden ist und wie leicht jemand Neues sie erweitern kann.
Wenn du Vue 3 Admin-Apps baust (auch in Teams, die Vue 3 z. B. in Plattformen wie AppMaster für die Web-UI verwenden), kann diese Entscheidung früh getroffen Monate an späterer Wartung sparen.
Wie sich Options und Composition im Alltag unterscheiden
Der schnellste Weg, den Unterschied zu spüren, ist, eine große Admin-Komponente zu öffnen und zu fragen: „Wo ändere ich das Verhalten für dieses eine Feature?“ In einer Komponentenbibliothek taucht diese Frage täglich auf.
Bei der Options API ist Code nach Typ gruppiert: data für State, methods für Aktionen, computed für abgeleitete Werte und watch für Seiteneffekte. Diese Struktur ist leicht zu überfliegen, wenn eine Komponente klein ist. In einer großen Tabelle oder Formular-Komponente verteilt sich die Logik für ein einzelnes Feature (z. B. Massenaktionen oder Feldvalidierung) oft über mehrere Blöcke. Man kann es ordentlich halten, aber es erfordert Disziplin und konsistente Namensgebung, um ein „Datei-hin-und-her-springen“-Workflow zu vermeiden.
Mit der Composition API wird Code in der Regel nach Feature gruppiert. Du definierst zugehörigen State, abgeleitete Werte, Seiteneffekte und Helfer nebeneinander und kannst wiederkehrende Logik in Composables auslagern. In einer Admin-Bibliothek entspricht das oft der Denkweise: „Alles zur Filterung ist hier“, „Alles zur Zeilenauswahl ist hier“. Es reduziert außerdem Duplikation über ähnliche Komponenten hinweg, z. B. durch Wiederverwendung von usePagination in mehreren Tabellen.
Ein großer Unterschied im Alltag ist, wie Abhängigkeiten sichtbar werden:
- Options API kann impliziter wirken: eine Methode greift vielleicht auf
this.user,this.filtersundthis.loadingzu, und das sieht man erst beim Lesen der Methode. - Composition API ist tendenziell expliziter: wenn eine Funktion über
filtersundloadingschließt, siehst du die Variablen in der Nähe definiert, und du kannst sie bei Bedarf an Hilfsfunktionen übergeben.
Der Nachteil: Composition API kann laut werden, wenn alles in ein einziges setup() geworfen wird ohne Struktur.
Eine praktische Faustregel:
- Wähle Options API, wenn Komponenten hauptsächlich presentational sind und nur leichte Logik haben.
- Wähle Composition API, wenn Komponenten mehrere Features mit gemeinsamen Regeln über die Bibliothek hinweg haben.
- Wenn du Composition API wählst, vereinbare ein einfaches Layout, das Code nach Feature gruppiert (nicht „zuerst alle refs“).
- Wenn du Options API wählst, erzwinge Namenskonventionen und halte verwandte Logik zusammen mit kurzen Kommentaren und konsistenten Methodennamen.
Beide Ansätze können funktionieren. Entscheidend ist die Organisationsweise, die die nächste Änderung offensichtlich macht, nicht clever.
Code-Wiederverwendung: was sauber skaliert und was unordentlich wird
In Admin-Apps ist Wiederverwendung keine nette Zusatzfunktion. Du wiederholst das gleiche Verhalten über Dutzende Bildschirme, und kleine Inkonsistenzen werden zu Bugs und Support-Tickets.
Die meisten Wiederverwendungsbedürfnisse fallen in wiederkehrende Kategorien: Sortierung/Filter/Pagination, die zum Backend passen, Formularvalidierung und Fehler-Mapping, Berechtigungsprüfungen und UI-Gates, Query-Syncing (URL-Params, gespeicherte Ansichten, Default-Filter) und Massenaktionen mit Tabellenauswahlregeln.
Options API Wiederverwendung: mächtig, aber Komplexität leicht versteckbar
Mit Options API beginnt Wiederverwendung oft mit Mixins, extends oder Plugins.
Mixins sind schnell, skaliert aber schlecht, weil sie verbergen, woher eine Methode oder ein computed kommt. Zwei Mixins können stillschweigend auf denselben Methodennamen stoßen und schon debuggt man Verhalten, das in der Komponentendatei nicht sichtbar ist.
extends wirkt manchmal sauberer als Mixins, schafft aber Vererbungsrätsel, bei denen man mehrere Dateien lesen muss, um zu verstehen, was eine Komponente wirklich tut. Plugins eignen sich gut für App-weite Anliegen (globale Direktiven, geteilte Services), sind aber kein guter Ort für geschäftsspezifische Regeln, die von Bildschirm zu Bildschirm variieren.
Der unordentliche Moment kommt, wenn Wiederverwendung implizit wird. Neue Beitragende können nicht beantworten „woher kommt diese Daten?“ ohne die ganze Codebasis zu durchsuchen.
Composition API Wiederverwendung: Composables bleiben explizit
Bei der Composition API basiert Wiederverwendung meist auf Composables: kleine Funktionen, die refs, computed Werte und Handler zurückgeben. Der große Vorteil ist, dass Wiederverwendung sichtbar nahe am Anfang der Komponente erscheint und du Parameter übergeben kannst statt dich auf versteckten Komponenten-Kontext zu verlassen.
Ein usePagination Composable kann z. B. Defaults akzeptieren und Änderungen in einer konsistenten Form ausgeben, während usePermissions die aktuelle Rolle und einen Feature-Namen akzeptiert. Dann geht es weniger um Syntax und mehr darum, ob deine Bibliothek explizites Wiring impliziter Vererbung vorzieht.
Um Wiederverwendung vorhersehbar zu halten, behandle jede wiederverwendbare Einheit wie eine kleine API: klarer Name, definierte Eingaben und Ausgaben, eine Verantwortung. Wenn ein Composable Pagination, Caching, Berechtigungen und Notifications übernimmt, teile es. Es ist viel einfacher, ein Teilstück später zu tauschen, ohne alles zu brechen.
Wiederverwendbare Formular- und Tabellenkomponenten schmerzfrei bauen
In Admin-Apps sind Formulare und Tabellen der Ort, an dem eine Komponentenbibliothek sich auszahlt oder in ein Labyrinth verwandelt. Beide APIs können funktionieren. Der Unterschied ist, wie du gemeinsames Verhalten wie Dirty-State, Fehler-Mapping und Submit-Flows paketierst, ohne jede Komponente „special“ zu machen.
Für gemeinsame Formularlogik treibt die Options API oft zu Mixins oder gemeinsamen Helfern. Mixins sind anfangs bequem, aber später ist es schwer zu beantworten: „Woher kommt dieser Feldfehler?“ oder „Warum ist Submit deaktiviert?“
Die Composition API macht diese Art von Wiederverwendung sichtbarer, weil du Logik in Composables verschiebst (z. B. useDirtyState, useFormErrors, useSubmitFlow) und genau siehst, was eine Formular-Komponente einbindet. In einer großen Bibliothek ist diese Klarheit oft wichtiger als ein paar eingesparte Zeilen.
Ein praktischer Weg, Komponenten-APIs stabil zu halten, ist, die öffentliche Oberfläche als Vertrag zu behandeln: Props, Emits und Slots sollten selten geändert werden, auch wenn du intern neu schreibst. Dieser Vertrag sieht in beiden Stilen gleich aus, aber Composition API macht Refactors oft sicherer, weil du ein Composable nach dem anderen ersetzen kannst, ohne das Template-API zu berühren.
Muster, die mit wachsender Bibliothek gewöhnlich sinnvoll bleiben:
- Baue Basis-Komponenten, die eine Aufgabe gut erledigen (BaseInput, BaseSelect, BaseTable), und komponiere daraus Feature-Komponenten.
- Bevorzuge Slots für Layout-Flexibilität (Action-Bereich, Empty States, Cell-Rendering) statt Props für jede Ecke.
- Normalisiere Events früh (
update:modelValue,submit,rowClick), damit Apps nicht von internen Details abhängen. - Halte Validierung und Formatierung nah an Inputs, Geschäftsregeln aber außerhalb (in Composables oder Parent-Containern).
Überabstraktion ist die häufige Falle. Eine "Superform"-Komponente, die jeden Feldtyp, jede Validierungsregel und jede Layout-Option abdeckt, wird oft schwerer zu nutzen als plain Vue. Eine gute Regel: braucht ein Basis-Komponent mehr als eine Handvoll Props, sind es vielleicht zwei Komponenten.
Manchmal ist Duplikation die richtige Entscheidung. Wenn nur ein Screen einen seltsamen Tabellenkopf mit Multi-Row-Gruppierung braucht, kopiere ein kleines Stück und halte es lokal. Clevere Abstraktionen haben oft eine lange Wartungskurve, besonders wenn neue Beitragende versuchen zu unterscheiden zwischen „normalen“ Komponenten und einem Framework im Framework.
Wenn du dich zwischen Composition und Options für eine große Formular- und Tabellenbibliothek entscheidest, optimiere zuerst für Lesbarkeit des Datenflusses. Wiederverwendung ist gut, aber nicht, wenn sie den Pfad von Benutzeraktion zu emittem Event verbirgt.
Test-Auswirkung: was sich leichter verifizieren lässt
In einer Komponentenbibliothek fallen Tests typischerweise in drei Bereiche: reine Logik (Formatierung, Validierung, Filter), Rendering (was bei einem bestimmten Zustand sichtbar ist) und Interaktionen (Klicks, Eingabe, Tastatur, Emits). Der gewählte API-Stil ändert, wie oft du die erste Kategorie ohne Mounten einer kompletten Komponente testen kannst.
Options API-Tests sehen oft so aus: „mount die Komponente, verändere Instanz-State, assert im DOM“. Das funktioniert, kann aber zu größeren Tests führen, weil Logik in methods, computed, watch und Lifecycle-Hooks gemischt ist. Wenn etwas fehlschlägt, suchst du außerdem nach Watcher-Timing, Lifecycle-Seiteneffekten oder der Logik selbst.
Options API passt oft gut zu:
- User-Flows, die auf Lifecycle-Reihenfolge beruhen (fetch on mount, reset on route change)
- Watcher-getriebenem Verhalten (Auto-Save, Query-Sync)
- Event-Emission aus Komponentenmethoden (
save(),reset(),applyFilter())
Composition API verschiebt das Gleichgewicht. Wenn du Logik in Composables auslagerst, kannst du diese als Plain-Funktionen unit-testen — mit kleinen Eingaben und klaren Ausgaben. Das reduziert die Anzahl der "mount and click"-Tests und lokalisiert Fehler. Außerdem werden Abhängigkeiten leichter kontrollierbar: statt ein Global zu mocken, übergibst du die Abhängigkeit (z. B. Fetch-Funktion, Datumsformatter oder Berechtigungsprüfer) in das Composable.
Konkretes Beispiel: eine wiederverwendbare AdminTable mit Sortierung, Pagination und Auswahl. Mit Composition API kann die Auswahl-Logik in useRowSelection() leben und getestet werden, ohne die Tabelle zu rendern (toggle, clear, select all, über Seiten hinweg bewahren). Dann brauchst du nur kleinere Komponententests, um sicherzustellen, dass Template Buttons, Checkboxen und Emits richtig verdrahtet sind.
Um Tests klein und lesbar zu halten (unabhängig vom Stil), baue eine klare Nahtstelle zwischen Logik und UI:
- Pack Geschäftsregeln in reine Funktionen oder Composables, nicht in Watcher.
- Halte Seiteneffekte (Fetch, Storage, Timer) hinter injizierten Abhängigkeiten.
- Bevorzuge einige fokussierte Integrationstests pro Komponente, nicht einen riesigen "alles"-Test.
- Benenne States und Events konsistent über die Bibliothek (reduziert Test-Setup).
- Vermeide versteckte Kopplungen (z. B. Methode A, die auf Watcher B angewiesen ist).
Wenn dein Ziel ein Stil ist, der Tests stabiler macht, strebe weniger Lifecycle-getriebenes Verhalten und mehr isolierte Logikeinheiten an, die du ohne DOM verifizieren kannst.
Onboarding neuer Beitragender: wie schnell Leute produktiv werden
In einer großen Admin-Komponentenbibliothek geht es beim Onboarding weniger darum, Vue beizubringen, als darum, Leuten zu helfen, Dinge zu finden, dieselben Konventionen zu befolgen und sich sicher zu fühlen, Änderungen vorzunehmen. Meiste Verzögerungen entstehen aus drei Lücken: Navigation (wo ist die Logik?), Konventionen (wie machen wir das hier?) und Vertrauen (wie ändere ich das, ohne fünf Bildschirme zu brechen?).
Mit der Options API kommen Neue oft am ersten Tag schneller zurecht, weil die Struktur vertraut ist: props, data, computed, methods, watchers. Der Nachteil ist, dass echtes Verhalten oft verstreut ist. Ein Feature wie "server-side filtering" kann zwischen einem Watcher, einem computed und zwei Methoden plus einem Mixin aufgeteilt sein. Leute lesen jeden Block, aber verbringen Zeit damit, die Story zusammenzufügen.
Mit der Composition API liegt der Onboarding-Vorteil darin, dass verwandte Logik zusammenstehen kann: State, Seiteneffekte und Helfer an einem Ort. Der Preis ist Composable-Literacy. Neue müssen Muster wie useTableState() verstehen und wie reaktive Werte durch mehrere Composables fließen. Ohne klare Grenzen kann es sich anfühlen wie Herumspringen zwischen Dateien ohne Karte.
Ein paar Konventionen lösen die meisten Fragen, egal welchen Stil du wählst:
- Verwende eine vorhersehbare Struktur:
components/,composables/,types/,tests/. - Wähle ein Namensmuster und halte dich daran (z. B.
useX,XTable,XForm). - Füge kurze Docblocks hinzu: was die Komponente macht, wichtige Props und die Haupt-Events.
- Definiere eine "Escape-Hatch"-Regel (wann ein neues Composable oder Helper ok ist).
- Halte eine kleine "goldene" Komponente, die das bevorzugte Muster zeigt.
Beispiel: Wenn dein Team ein Vue 3 Admin-Panel generiert und dann anpasst (z. B. eine Web-App, die mit AppMaster erzeugt und von Entwicklern erweitert wird), verbessert sich das Onboarding deutlich, wenn es einen offensichtlichen Ort gibt, um Tabellenverhalten (Sortierung, Filter, Pagination) anzupassen und einen Ort, um UI-Wiring (Slots, Column-Renderer, Row-Actions) zu ändern. Diese Klarheit ist wichtiger als die gewählte API.
Schritt-für-Schritt: einen Stil wählen und sicher einführen
Für eine große Admin-UI-Bibliothek ist der sicherste Weg, die Frage zu klären, mit einem gut abgegrenzten Feature zu starten und es wie einen Pilot zu behandeln, nicht als Rewrite.
Wähle ein Modul mit klarer Funktionalität und hoher Wiederverwendung, z. B. Tabellenfilter oder Formularvalidierung. Bevor du Code anfasst, schreibe auf, was es heute tut: Eingaben (Props, Query-Params, Nutzeraktionen), Ausgaben (Events, Emits, URL-Änderungen) und Edge-Cases (Empty State, Reset, Server-Fehler).
Als Nächstes setze Grenzen. Entscheide, was in der Komponente bleiben muss (Rendering, DOM-Events, Accessibility) und was in gemeinsamen Code verschoben werden kann (Filter-Parsen, Debounce, API-Param-Building, Default-State). Viele Bibliotheken machen den Fehler, UI-Entscheidungen in geteilten Code zu verstecken — das erschwert Wiederverwendung.
Ein praktischer Rollout-Plan:
- Wähle eine Komponente, die das Muster klar zeigt und in mehreren Screens genutzt wird.
- Extrahiere eine gemeinsame Einheit (Composable oder Helper) mit kleiner, expliziter API.
- Schreibe zuerst einen fokussierten Test für diese Einheit, basierend auf realen Admin-Szenarien.
- Refaktoriere die gewählte Komponente End-to-End mit der neuen Einheit.
- Wende das Muster auf eine weitere Komponente an, um zu bestätigen, dass es skaliert.
Halte die geteilte API langweilig und offensichtlich. Ein useTableFilters() Composable könnte z. B. Initial-Filters akzeptieren und filters, apply(), reset() und toRequestParams() bereitstellen. Vermeide "Magie", die aus globalem State liest, außer das ist eine klare Regel in deiner App.
Nach dem Pilot veröffentliche eine kurze interne Richtlinie mit einem Beispiel, das Beitragende kopieren können. Eine konkrete Regel schlägt ein langes Dokument: „Alle Tabellenfilter-Logik lebt in einem Composable; Komponenten binden nur UI-Kontrollen und rufen apply() auf."
Vor einer breiteren Einführung definiere eine einfache Done-Bedingung:
- Neuer Code liest sich über zwei Komponenten hinweg gleich.
- Tests decken die gemeinsame Logik ohne komplettes UI-Mounten ab.
- Ein neuer Beitragender kann eine Filterregel ändern, ohne fremde Dateien zu bearbeiten.
Wenn dein Team Admin-Portale auch mit No-Code-Tools wie AppMaster baut, kannst du denselben Pilot-Ansatz dort nutzen: wähle einen Workflow (z. B. Genehmigungen), definiere Verhalten und standardisiere das Muster, bevor du es produktweit skalierst.
Häufige Fehler und Fallen in großen Bibliotheken
Die größten Probleme in einer großen Komponentenbibliothek drehen sich selten um Syntax. Sie entstehen durch kleine lokale Entscheidungen, die sich anhäufen und Wiederverwendung, Tests und Wartbarkeit erschweren.
Eine häufige Falle ist das zufällige Mischen von Mustern. Wenn die Hälfte der Bibliothek Options API nutzt und die andere Hälfte Composition API ohne Regel, wird jede neue Komponente zur Stil-Debatte. Außerdem entstehen duplizierte Lösungen für dieselben Probleme, nur in unterschiedlichen Formen. Wenn du beide zulässt, definiere eine klare Policy: neuer Code nutzt einen Stil, Legacy wird nur bei Bedarf verändert und gemeinsame Logik lebt an einer vereinbarten Stelle.
Eine andere Falle ist das "God Composable". Es beginnt oft als hilfreiches useAdminPage() oder useTable() und saugt Routing, Fetching, Caching, Selektion, Dialoge, Toasts und Berechtigungen auf. Es wird schwer testbar, weil ein Aufruf viele Seiteneffekte auslöst. Und schwer wiederverwendbar, weil jeder Screen nur einen Teil davon braucht, aber die Komplexitätskosten zahlt.
Watcher sind ebenfalls häufige Schmerzquelle. Sie sind einfach hinzuzufügen, wenn etwas asynchron aus dem Takt gerät, aber Timing-Bugs tauchen später auf (besonders bei async Daten und debounced Inputs). Wenn Leute melden "manchmal verliert es meine Auswahl", kann die Reproduktion Stunden dauern.
Warnsignale, dass die Bibliothek in Probleme läuft:
- Eine Komponente funktioniert nur in einer exakten Reihenfolge von Props und Events.
- Ein Composable liest und schreibt globalen State, ohne es offensichtlich zu machen.
- Mehrere Watcher aktualisieren denselben Zustand.
- Refactors brechen ständig Consumer-Screens in kleinen Weisen.
- Beitragende meiden bestimmte Dateien, weil sie riskant wirken.
Die letzte Falle ist das Brechen der Public API bei Refactors. In Admin-Apps verbreiten sich Komponenten wie Tabellen, Filter und Formularfelder schnell. Ein Prop-Name, ein Emit oder Slot-Verhalten zu ändern, kann stillschweigend dutzende Screens brechen.
Eine sichere Vorgehensweise ist, Komponenten-APIs wie Verträge zu behandeln: depreziere statt zu löschen, halte Kompatibilitäts-Shims eine Weile und füge einfache Usage-Tests hinzu, die die Komponente so mounten, wie Konsumenten sie nutzen. Wenn du Vue 3 Admin-Interfaces generierst (z. B. mit AppMaster), ist das besonders wichtig, weil konsistente Komponentenverträge das Wiederverwenden von Screens erleichtern und Änderungen vorhersehbar machen.
Schnelle Checks, bevor du dich festlegst
Bevor du Composition API, Options API oder eine Mischung wählst, mach ein paar schnelle Checks an realen Komponenten aus deiner Bibliothek. Das Ziel ist simpel: mach es leicht, Logik zu finden, sicher wiederzuverwenden und die relevanten Teile zu testen.
1) Findet jemand die Logik schnell?
Öffne eine typische Admin-lastige Komponente (Filter + Tabelle + Berechtigungen + Massenaktionen). Tu so, als wärst du neu im Code.
Ein gutes Zeichen ist, wenn ein Beitragender in unter 2 Minuten beantworten kann: „Wo ist die Filter-Logik?“ oder „Was entscheidet, ob der Button deaktiviert ist?". Bei Options API bedeutet das meist, dass Logik klar über computed, methods und Watcher verteilt ist. Bei Composition API heißt das, setup() ist in kleine benannte Blöcke (oder Composables) organisiert und vermeidet eine einzige riesige Funktion.
2) Verhalten gemeinsame Utilities wie Funktionen, nicht wie Magie?
Geteilter Code sollte klare Eingaben und Ausgaben haben und minimale Seiteneffekte. Wenn ein Helper in globalen State greift, übergebene Objekte mutiert oder Netzwerkanfragen auslöst, ohne dass es offensichtlich ist, wird Wiederverwendung riskant.
Kurzer Check:
- Kannst du anhand der Signatur eines Composables oder Helpers abschätzen, was es zurückgibt?
- Kannst du es in zwei Komponenten verwenden, ohne verstecktes Setup?
- Lässt sich sein Zustand in Tests ohne Hacks zurücksetzen?
3) Sind eure Tests auf Admin-Verhalten fokussiert?
Admin-Apps scheitern auf vorhersehbare Weise: Filter greifen falsch, Berechtigungen leaken Aktionen, Formulare validieren inkonsistent und Tabellenzustand bricht nach Bearbeitungen. Statt intern Implementation-Details zu testen (Watcher vs Refs), schreibe Tests um Verhalten: „Rolle X sieht Aktion Y nicht“, „Speichern zeigt Fehler und behält Benutzereingabe“, „Filter-Änderungen aktualisieren Query und Empty-State-Message". So bleiben Tests stabil, auch wenn du später zwischen Stilen refaktorierst.
4) Habt ihr einen Standard für async Zustand?
Große Bibliotheken bekommen viele kleine async-Flows: Options laden, Felder validieren, Tabellenzeilen laden, Retry-Logik. Wenn jede Komponente ihr eigenes loading/error-Handling erfindet, wird Onboarding und Debugging langsam.
Wähle eine klare Form für async Zustand (loading, error, retries, cancellation). Composition API fördert oft ein wiederverwendbares useAsyncX() Composable, während Options API eine standardisierte data()-Form plus gemeinsame Methoden bieten kann. Beides ist ok, solange es konsistent ist.
5) Sind die öffentlichen Komponenten-APIs stabil und selbsterklärend?
Behandle Komponenten wie Produkte. Props, Emits und Slots sind der Vertrag. Wenn dieser Vertrag oft ändert, wird jeder Admin-Screen fragil.
Suche nach Kommentaren, die Absicht erklären (nicht Mechanik): was Props bedeuten, welche Events garantiert werden und was intern ist. Wenn du interne Admin-Tools mit einer Plattform wie AppMaster baust, hilft dieselbe Denkweise: stabile Bausteine machen künftige Screens schneller auslieferbar.
Beispiel-Szenario und nächste Schritte für dein Team
Stell dir eine "Users"-Seite vor, die du neu baust: eine Filter-Leiste (Status, Rolle, Erstellungsdatum), eine Tabelle mit auswählbaren Zeilen, Massenaktionen (deaktivieren, löschen, exportieren) und rollenbasierte Zugriffe (nur Admins können bulk löschen, Manager können Rollen bearbeiten).
UI kann mit Composition oder Options API gleich aussehen, der Code organisiert sich aber anders.
In Options API entsteht oft eine große Komponente mit data für Filter und Selektion, computed für abgeleiteten Zustand und methods für Fetching, Massenaktionen und Berechtigungsprüfungen. Wiederverwendung tritt meist als Mixins oder Helper-Module auf. Es ist vertraut, aber verwandte Logik kann verstreut sein (Fetching in methods, Query-Sync in watch, Berechtigungen in computed).
In Composition API teilst du die Seite typischerweise in fokussierte Composables: eins für Query und Filter, eins für Tabellen-Selektion und Massenaktionen, eins für Berechtigungen. Die Page-Komponente setzt diese Teile zusammen, und die Logik für jede Sorge bleibt zusammen. Der Nachteil ist, dass klare Namens- und Ordnerkonventionen notwendig sind, damit Beitragende nicht denken, alles sei "Magie im setup".
Wiederverwendung tritt in Admin-Bibliotheken typischerweise rund um Filter, URL-Sync, server-seitige Tabellenmuster (Pagination, Sorting, Select-All, Bulk-Action-Guards), Berechtigungsprüfungen und konsistente Empty/Loading-Zustände auf.
Ein Plan mit nächsten Schritten, der für die meisten Teams funktioniert:
- Wähle einen Standardstil für neuen Code und erlaube Ausnahmen nur mit schriftlicher Begründung.
- Definiere Konventionen: wo Composables liegen, wie sie benannt werden, was sie importieren dürfen und was sie zurückgeben müssen.
- Füge eine kleine Referenzseite (z. B. die Users-Seite) als Goldstandard hinzu.
- Schreibe Tests zuerst um wiederverwendbare Teile (Filter, Berechtigungen, Massenaktionen), nicht um Layout.
- Wenn Geschwindigkeit wichtiger ist als tiefe Anpassung für einige Screens, erwäge, diese mit einem No-Code-Tool wie AppMaster zu generieren und konzentriere deine handgeschriebene Bibliothek auf die wirklich einzigartigen Teile.
Wenn ihr bereits mit AppMaster arbeitet, hilft es, dasselbe mentale Modell zwischen generierten und handgeschriebenen Teilen zu behalten: stabile Komponentenverträge und gemeinsame Logik als kleine, explizite Einheiten verpackt. Für Teams, die No-Code für interne Tools evaluieren, generiert AppMaster (appmaster.io) vollständige Anwendungen (Backend, Web, Mobile) und erlaubt gleichzeitig, eine standardisierte Vue 3 Web-UI dort zu nutzen, wo es wichtig ist.
Wenn du diese Woche nur eins machst: Mach die Users-Seite zu deiner Vorlage und setze sie in Code-Reviews durch. Ein klares Beispiel hilft mehr für Konsistenz als ein langer Styleguide.
FAQ
Empfehlung: Standardisiere auf die Composition API, wenn deine Bibliothek wiederkehrende Verhaltensweisen wie Filter, Pagination, Massenaktionen und Berechtigungsprüfungen hat. Sie macht es einfacher, gemeinsame Logik in Composables auszulagern und Abhängigkeiten expliziter zu halten. Die Options API ist sinnvoll, wenn Komponenten überwiegend presentational sind und wenig Logik enthalten.
Kurz: die Options API gruppiert Code nach Typ (data, methods, computed, watch), sodass die Logik für ein Feature oft verstreut ist. Die Composition API gruppiert normalerweise nach Funktion (alles zu filters oder selection zusammen). Wähle die Variante, die die nächsten Änderungen leicht auffindbar und sicher macht.
Mixins und extends können in großen Bibliotheken schnell undurchsichtig werden, weil sie verbergen, wo Methoden oder berechnete Werte herkommen, und Namenskonflikte erzeugen. Die Composition API fördert Composables mit klaren Ein- und Ausgaben, wodurch das Wiring in der Komponente sichtbar bleibt. Explizite Wiederverwendung bleibt auf Dauer wartbarer.
Behandle jedes Composable wie eine kleine API: eine Aufgabe, klare Parameter und vorhersehbare Rückgaben. Wenn ein Composable Pagination, Caching, Berechtigungen und Notifications mischt, teile es auf. Kleine Composables sind leichter zu testen, wiederzuverwenden und verursachen weniger unerwartete Seiteneffekte.
Halte die öffentliche Schnittstelle stabil: Props, Emits und Slots sollten sich selten ändern. Formatierung und Basisvalidierung gehören nahe an die Input-Komponenten; Geschäftslogik gehört in Composables oder Container. So kannst du intern refaktorisieren, ohne jede Anwendung anzupassen.
Die Composition API erleichtert meist Unit-Tests, weil Logik in Composables und reinen Funktionen lebt, die ohne Rendering getestet werden können. Die Options API führt häufiger zu gemounteten Komponententests, bei denen Watcher- und Lifecycle-Timing stören können. Unabhängig vom Stil sorgt die Trennung von Geschäftslogik und UI für kleine, stabile Tests.
Standardisiere eine einzige Form für asynchronen Zustand wie loading, error und definiere Retry-/Cancel-Verhalten. Wenn jede Komponente ihre eigene Conventions erfindet, wird Debugging langsam. Du kannst diese Standardisierung mit beiden APIs umsetzen, wichtig ist Konsistenz.
Am Anfang ist die Options API oft leichter, weil die Struktur vertraut ist. Composition API wirkt schneller, sobald Leute eure Composables und Ordnerkonventionen kennen, weil verwandtes Verhalten sichtbar gruppiert ist. Die größte Hilfe beim Onboarding ist ein "goldenes" Beispielcomponent und konsequente Code-Reviews.
Wähle ein klar abgegrenztes, vielgenutztes Feature (z. B. Table-Filter oder Formular-Fehlermapping) als Pilot. Extrahiere eine gemeinsame Einheit mit kleiner, expliziter API, schreibe zuerst einen fokussierten Test und refaktoriere eine Komponente komplett damit. Erst nach erfolgreichem Einsatz in mindestens zwei Komponenten ausrollen.
Achte auf häufige Near-Duplicates, kompetitierende Watcher, Komponenten, die nur in einer bestimmten Reihenfolge funktionieren, oder häufige Breaks bei Props/Events/Slots. Wenn Leute bestimmte Dateien meiden, ist das ein klares Warnsignal: APIs sind zu riskant oder zu undurchsichtig.


