Quickstart
Zwei End-to-End-Beispiele — eine Micro-Frontend-App (Vue) und eine Web Component (Vue) — aus dem öffentlichen Repository wippyai/app. Jedes zeigt die minimal nötigen Dateien, wie das Artefakt beim Backend registriert wird und wie es gebaut wird. Folgen Sie den Links zum Repo für den vollständigen, lauffähigen Quellcode und zu den Vertiefungsdokumenten für jede Option.
Voraussetzungen: ein Wippy-Backend mit verdrahteten Modulen wippy/views und wippy/facade, Node.js 22 oder neuer, Vite 7 und die aktuelle kohärente @wippy-fe/*-Package-Familie für den Ziel-Web-Host. Diese Toolchain-Anforderungen stammen aus dem gewählten Web-Host-Package; prüfen Sie sie erneut, wenn sich dieses Package ändert. Holen Sie die import-map.json des Ziel-Web-Hosts, externalisieren Sie jeden aufgeführten Key einschließlich der ungenutzten, und bundeln Sie einen importierten exakten Specifier nur, wenn er fehlt. Siehe Build System für die Toolchain.
Beispiel 1 — Micro-Frontend-App (Vue)
Eine vollständige Vue-3-SPA, die der Web Host über seine gewählte Page-Engine rendert (standardmäßig ein iframe oder ein Web Fragment). Repo: frontend/applications/main.
package.json — der wippy-Block deklariert sie als Page und legt fest, welches CSS der Host injiziert:
{
"name": "@example/admin",
"specification": "wippy-component-1.0",
"wippy": {
"type": "page",
"title": "Admin",
"icon": "tabler:layout-dashboard",
"path": "dist/app.html",
"proxy": {
"enabled": true,
"injections": {
"css": { "themeConfig": true, "iframe": true, "primevue": true }
}
}
}
}
src/app.ts — Host-Dienste auflösen, mounten und den obligatorischen bidirektionalen Routen-Sync verdrahten:
import { config } from '@wippy-fe/proxy' // synchroner Getter — kein await nötig
import { createApp } from 'vue'
import { createAppRouter } from '@wippy-fe/router'
import App from './app/app.vue'
import { routes } from './router'
export function createMainApp() {
const app = createApp(App)
const initialPath = config.context?.route ?? '/'
const router = createAppRouter(routes, { initialPath })
app.use(router)
app.mount('#app')
return { app, router }
}
Registrieren Sie sie in der _index.yaml Ihres Moduls (das ist Betreiber-/Deployment-Policy — siehe Micro Frontend Apps (view.page)):
- name: admin
kind: registry.entry
meta:
type: view.page
name: admin
announced: true # in der Navigationsleiste des Hosts anzeigen
url: /app
base_path: app/admin
entry_point: app.html
mountRoute: /admin/:part(.*)*
Rufen Sie das Make-Target des Moduls auf, um in das ausgelieferte Verzeichnis
zu bauen, und liefern Sie die Ausgabe dort aus, wohin url + base_path zeigt;
der Host rendert sie unter /admin. Das Makefile-Rezept verwendet
npm run build -- --outDir <abs-or-relative> --emptyOutDir; make.ps1
implementiert dasselbe Target für Windows, und make.bat ruft lediglich
make.ps1 auf. Vollständige Anleitung: Micro Frontend App.
Beispiel 2 — Web Component (Vue)
Ein Custom Element, das der Host im DOM der Page (Shadow DOM) mountet, einbettbar aus jeder Page oder jedem Chat-Artefakt. Repo: frontend/web-components/reaction-bar.
package.json — der wippy-Block deklariert das Tag, die Props (HTML-Attribute) und die Events:
{
"name": "@example/reaction-bar",
"specification": "wippy-component-1.0",
"wippy": {
"tagName": "example-reaction-bar",
"type": "widget",
"props": {
"type": "object",
"properties": {
"reactions": { "type": "array", "items": { "type": "string" }, "default": ["👍", "👎", "❤️"] },
"allow-multiple": { "type": "boolean", "default": false }
}
},
"events": {
"type": "object",
"properties": { "reaction": { "type": "object", "description": "Fired when a reaction is toggled" } }
}
}
}
src/index.ts — eine Vue-Komponente in WippyVueElement einwickeln und registrieren. define(import.meta.url, …) liest den vom Host angehängten Query-Parameter ?declare-tag=, deshalb muss es import.meta.url verwenden:
import { WippyVueElement, define } from '@wippy-fe/webcomponent-vue'
import { PrimeVuePlugin } from '@wippy-fe/theme/primevue-plugin'
import ReactionBar from './app/reaction-bar.vue'
import stylesText from './styles.css?inline'
import pkg from '../package.json'
class ReactionBarElement extends WippyVueElement {
static get wippyConfig() {
return {
propsSchema: pkg.wippy.props,
hostCssKeys: ['themeConfigUrl', 'primeVueCssUrl'] as const, // Host-Theme + PrimeVue in den Shadow Root ziehen
inlineCss: stylesText,
}
}
static get vueConfig() {
return { rootComponent: ReactionBar, plugins: [PrimeVuePlugin] }
}
}
export async function webComponent() {
return ReactionBarElement
}
define(import.meta.url, ReactionBarElement)
src/app/reaction-bar.vue — Props lesen und Events auslösen mit den Composables aus @wippy-fe/webcomponent-vue:
<script setup lang="ts">
import Button from 'primevue/button'
import { ref, computed } from 'vue'
import { useComponentProps, useComponentEvents } from '../constants'
const props = useComponentProps()
const emit = useComponentEvents()
const active = ref(new Set<string>())
const reactions = computed(() => props.value.reactions ?? [])
function toggle(emoji: string) {
active.value.has(emoji) ? active.value.delete(emoji) : active.value.add(emoji)
active.value = new Set(active.value)
emit('reaction', { emoji, count: active.value.has(emoji) ? 1 : 0, active: active.value.has(emoji) })
}
</script>
<template>
<Button
v-for="emoji in reactions"
:key="emoji"
:label="emoji"
:aria-label="`Toggle ${emoji} reaction`"
:aria-pressed="active.has(emoji)"
text
@click="toggle(emoji)"
/>
</template>
(useComponentProps / useComponentEvents sind dünne Wrapper um useProps() / useEvents(), definiert in src/constants.ts.)
Registrieren Sie sie als view.component (alle drei Tore sind für den Autoload erforderlich — siehe Web Components (view.component)):
- name: reaction-bar
kind: registry.entry
meta:
type: view.component
name: reaction-bar
tag_name: example-reaction-bar
announced: true
auto_register: true
url: /app/wc/reaction-bar
entry_point: index.js
Bauen Sie sie, und jede Page (oder jedes Chat-Artefakt) kann das Tag verwenden:
<example-reaction-bar reactions='["👍","🎉"]'></example-reaction-bar>
Vollständige Anleitung: Web Component.
Mehr entdecken
Das Repo app liefert mehrere lauffähige Web Components unter frontend/web-components/:
| Komponente | Zeigt |
|---|---|
reaction-bar |
Props + Auslösen von Events |
counter-persist |
Zustand, der Reloads überlebt, via @wippy-fe/pinia-persist |
chart-circle |
Bundling einer Drittanbieter-Bibliothek (Chart.js) im Shadow DOM |
mermaid |
Children-Inhalte (<template data-type="…">) + ein Lazy-Fallback-Bundle |
markdown |
markdown-it + sanitize-html |
websocket-log |
Live-Daten über on(...)-Topic-Subscriptions |
model-gallery |
Authentifizierte API-Aufrufe über den Proxy + PrimeVue im Shadow DOM |
Zum Theming beider Artefakte lesen Sie Theming → Theming: Micro Frontend Apps / Theming: Web Components. Zum lokalen Betrieb ohne vollständigen Host siehe Host-less Mode.