Web-Component-Rezept

Eine Web Component wird als view.component registriert und rendert normalerweise in einem Shadow Root. Wählen Sie das kleinste gültige Setup.

Variante A: nur Inhalt

Ein Chart, Diagramm, Renderer oder eine Visualisierung darf PrimeVue und Tailwind weglassen, wenn sie kein Control rendert und keine gemeinsame Tailwind-Utility schreibt.

Sie muss dennoch:

  • Ein gültiges Custom-Element-Tag veröffentlichen.
  • Die Barrierefreiheit der gerenderten Inhalte wahren.
  • Unterstützte Wippy-Konfiguration und CSS-Auslieferung verwenden.
  • Projektprivate Facade-Klassen vermeiden.
  • Über das kanonische Make-Target des Wippy-Modul-Repositories bauen.

Wird später ein Button, Input, Formular, Menü oder ein anderes PrimeVue-artiges Control ergänzt, endet diese Ausnahme.

Variante B: Control-tragend

Eine Komponente mit Controls muss PrimeVue über das Wippy-PrimeVue-Plugin installieren und die erforderlichen CSS-Auslieferungs-Keys konfigurieren. Der folgende Einstieg ist der aktuell vom Package unterstützte Vue-Weg:

import { defineComponent, h } from 'vue'
import Button from 'primevue/button'
import { PrimeVuePlugin } from '@wippy-fe/theme/primevue-plugin'
import {
  WippyVueElement,
  define,
  type WippyElementConfig,
} from '@wippy-fe/webcomponent-vue'
import pkg from '../package.json'

const Root = defineComponent({
  name: 'ExampleControlsRoot',
  setup() {
    return () => h(Button, { label: 'Save' })
  },
})

class ExampleControlsElement extends WippyVueElement {
  static get wippyConfig(): WippyElementConfig {
    return {
      propsSchema: pkg.wippy.props,
      hostCssKeys: ['themeConfigUrl', 'primeVueCssUrl', 'iframeCssUrl'],
    }
  }

  static get vueConfig() {
    return {
      rootComponent: Root,
      plugins: [PrimeVuePlugin],
    }
  }
}

export async function webComponent() {
  return ExampleControlsElement
}

define(import.meta.url, ExampleControlsElement)

Die Package-Metadaten müssen dasselbe Custom Element benennen:

{
  "name": "@example/controls",
  "version": "0.1.0",
  "type": "module",
  "specification": "wippy-component-1.0",
  "wippy": {
    "type": "component",
    "tagName": "example-controls",
    "props": {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
  }
}

Der Komponenten-Build verwendet das strikte Wippy-Komponenten-Plugin und den vollständigen gepinnten Import-Map-Snapshot des Ziel-Hosts:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { wippyComponentPlugin } from '@wippy-fe/vite-plugin'
import hostImportMap from './wippy-import-map.json'

export default defineConfig({
  plugins: [vue(), wippyComponentPlugin({ required: true })],
  build: {
    lib: {
      entry: 'src/element.ts',
      formats: ['es'],
      fileName: 'index',
    },
    rollupOptions: {
      external: Object.keys(hostImportMap.imports),
    },
  },
})

Verwenden Sie das gemeinsame Wippy-Tailwind-Preset, wenn diese Komponente Tailwind-Utilities schreibt. PrimeVue selbst verlangt von einem Modul nicht, Tailwind-Utilities zu erfinden.

Shadow-Root-Regeln

  • Öffentliche CSS-Variablen dürfen in den Shadow Root vererben.
  • Selektor-Regeln wirken nur, wenn der Host sie in den Root liefert.
  • Gemeinsames PrimeVue-Theme-CSS ist eine unterstützte Abhängigkeit.
  • Beliebige Facade-Klassen sind keine portablen APIs.
  • Overlay-Platzierung muss in der echten Laufzeitumgebung verifiziert werden; erzwingen Sie kein generisches Platzierungsrezept.

Metadaten und Build

Dokumentieren Sie Props und Events sowohl in den Package-Metadaten als auch im Registry-Eintrag, wie es das gewählte Schema verlangt. Rufen Sie das Make-Target des Modul-Repositories auf; dessen Rezept verwendet:

npm run build -- --outDir <target> --emptyOutDir

Rufen Sie dieses zugrunde liegende Kommando nicht direkt auf. Unter Windows rufen Sie make.bat auf; es delegiert an make.ps1.

Siehe Theme Authoring, Tailwind Contract und Build and Dependency Contract.