Рецепт веб-компонента
Веб-компонент регистрируется как view.component и обычно отрисовывается в shadow root. Выбирайте наименьшую валидную конфигурацию.
Вариант A: только содержимое
График, диаграмма, рендерер или визуализация могут обходиться без PrimeVue и Tailwind, когда они не отрисовывают ни одного элемента управления и не создают общих утилит Tailwind.
При этом всё равно необходимо:
- Публиковать валидный тег пользовательского элемента.
- Сохранять доступность отрисовываемого содержимого.
- Использовать поддерживаемую конфигурацию Wippy и доставку CSS.
- Избегать приватных для проекта классов фасада.
- Собирать через каноническую Make-цель репозитория модуля Wippy.
Если позже добавляется кнопка, поле ввода, форма, меню или другой элемент управления в духе PrimeVue, это освобождение прекращается.
Вариант B: с элементами управления
Компонент с элементами управления должен подключать PrimeVue через плагин PrimeVue от Wippy и настраивать требуемые ключи доставки CSS. Приведённая ниже точка входа — текущий поддерживаемый пакетами путь для Vue:
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)
Метаданные пакета должны указывать на тот же пользовательский элемент:
{
"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
}
}
}
Сборка компонента использует строгий плагин компонентов Wippy и полный закреплённый снимок import map целевого хоста:
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),
},
},
})
Используйте общий пресет Tailwind от Wippy, когда этот компонент создаёт утилиты Tailwind. Сам PrimeVue не требует от модуля выдумывать утилиты Tailwind.
Правила shadow root
- Публичные CSS-переменные могут наследоваться в shadow root.
- Правила с селекторами действуют только если хост доставляет их в этот корень.
- Общий CSS темы PrimeVue — поддерживаемая зависимость.
- Произвольные классы фасада не являются переносимыми API.
- Размещение оверлеев должно проверяться в реальной среде выполнения; не навязывайте универсальный рецепт размещения.
Метаданные и сборка
Документируйте props и события и в метаданных пакета, и в записи реестра, как того требует выбранная схема. Вызывайте Make-цель репозитория модуля; её рецепт использует:
npm run build -- --outDir <target> --emptyOutDir
Не вызывайте эту нижележащую команду напрямую. В Windows вызывайте
make.bat; он делегирует make.ps1.
См. Создание темы, Контракт Tailwind и Контракт сборки и зависимостей.