@finzor-ui/vite-plugin
@finzor-ui/vite-plugin
Плагин (и Nuxt-модуль), который подключает Finzor UI к Vite так, чтобы dev/SSR/first paint работали без ручной возни с optimizeDeps, ssr.noExternal и anti-FOUC для темы.
Стили компонентов Finzor не инжектит: они едут сами через module graph (import { FButton } from '@finzor-ui/button' → CSS чанка). Foundation по-прежнему один раз в приложении:
import '@finzor-ui/core/style.css'
Поддержка: Vite ^5 || ^6 || ^7 || ^8, пакеты @finzor-ui/* и @finzor-ui-pro/*.
Зачем он нужен
Без адаптера типичные сбои при работе с kit:
| Симптом | Причина | Что делает плагин |
|---|---|---|
| Медленный / нестабильный cold start в dev | Vite не знает, какие Finzor-пакеты prebundle’ить | Сканирует импорты приложения и пишет optimizeDeps.include |
| В SSR/Nuxt нет стилей Finzor на first paint | Vite считает пакеты external и не достаёт CSS side-effects | При ssr: true (и в Nuxt-модуле) мержит ssr.noExternal для Finzor scopes |
| Мигание светлой/тёмной темы до гидрации | <html> ещё без data-color-scheme / class |
Опционально выставляет attrs + blocking script до paint |
| Тихие ошибки «пакет не резолвится» / конфликт версий | Забыли установить / разные ranges в deps и devDeps | Warn-only проверки на старте сборки |
Когда можно обойтись без плагина: простой SPA, где вас устраивает дефолтный Vite, нет SSR и нет persist color-scheme. Стили компонентов всё равно приедут из module graph + core/style.css.
Когда ставить: Vite SSR, Nuxt, или SPA, где нужны prebundle, anti-FOUC тема или ранние предупреждения по зависимостям.
Модель доставки CSS / SSR
| Режим | CSS |
|---|---|
| SPA | Module graph (достигнутые entry/chunks) + @finzor-ui/core/style.css |
| Vite SSR / Nuxt | то же + ssr.noExternal для scopes @finzor-ui/* / @finzor-ui-pro/* |
Контракт пакетов Finzor, на который опирается плагин:
- один изоморфный JS surface (
dist/index.js) — нетdist/ssr.jsиexports["."].node; - CSS компонентов едет side-effect’ами из достигнутых public entry / chunks, не отдельными
./style.css/./style-all.css; - foundation — только
import '@finzor-ui/core/style.css'в приложении; - без package-closure inject и без prepend транзитивных CSS в
index.js.
Эквивалент ручного SSR-конфига (если плагин не используете):
ssr: {
noExternal: [/@finzor-ui(?:-pro)?\//]
}
Так Vite трансформирует пакеты и вытаскивает CSS side-effects на first paint.
Что плагин делает в проекте
Конкретно при plugins: [vue(), finzorUi(…)] (или Nuxt-модуле):
- Сканирует исходники (
srcпо умолчанию; в Nuxt —app,pages,components, …) на root-импорты@finzor-ui/*/@finzor-ui-pro/*. - Пишет
optimizeDeps.includeдля найденных пакетов (+@finzor-ui/core; в plain Vite по умолчанию ещё union с Finzor-deps изpackage.json). Tooling-only пакеты без module entry пропускает. - При
ssr: trueмержит в конфиг:
(идемпотентно;ssr: { noExternal: [/@finzor-ui(?:-pro)?\//] }noExternal: trueне трогает). - При
theme/colorScheme— first-paint bootstrap на<html>(Vite:transformIndexHtml; Nuxt:app.head). - При
validate: true(default) — warn, если пакет не резолвится, explicit-пакет не найден в scan, или один и тот же Finzor-пакет вdependenciesиdevDependenciesс разными ranges. - При
analyzeCss/debug— лог размеровdist/*.cssпо затронутым пакетам.
Чего плагин не делает:
- не подключает и не prepend’ит CSS-бандлы /
style-all/ package-closure; - не требует отдельный
@finzor-ui/*/ssrentry — один изоморфный JS; - не заменяет
import '@finzor-ui/core/style.css'в entry приложения.
Установка
pnpm add -D @finzor-ui/vite-plugin
Быстрый старт
Vite SPA
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { finzorUi } from '@finzor-ui/vite-plugin'
export default defineConfig({
plugins: [vue(), finzorUi()]
})
// main.ts
import '@finzor-ui/core/style.css'
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')
Vite SSR
import { finzorUi } from '@finzor-ui/vite-plugin'
export default defineConfig({
plugins: [vue(), finzorUi({ ssr: true })]
// noExternal для Finzor выставляет плагин
})
Nuxt
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@finzor-ui/vite-plugin/nuxt'],
// опционально:
// finzorUi: { colorScheme: 'system', theme: 'corporate' }
})
Модуль сам включает ssr.noExternal, optimizeDeps (scan-first) и прокидывает те же опции в Vite-плагин. Foundation CSS — в entry / layout приложения, как в SPA.
Опции
| Option | Default | Для пользователя |
|---|---|---|
ssr |
false |
Включите для Vite SSR. В Nuxt-модуле включается автоматически. |
theme |
— | Значение data-theme на <html> до первого paint. |
colorScheme |
— | 'light' | 'dark' | 'system' — anti-FOUC для цветовой схемы. |
scanDirs |
['src'] / Nuxt dirs |
Куда смотреть static-импорты Finzor. |
includePackageJsonDeps |
true (Vite) / false (Nuxt) |
Добавлять Finzor из package.json в optimizeDeps roots. |
validate |
true |
Warn-only проверки зависимостей. |
analyzeCss / debug |
false |
Диагностика CSS/roots в консоли. |
packages |
'auto' |
Явный список пакетов для validate/analyze. |
colorMode |
false |
Только Nuxt: opt-in sync с @nuxtjs/color-mode (Finzor = DOM driver). |
messages |
false |
Только Nuxt: глобальные defaults для @finzor-ui/messages через setConfig. |
Полные типы — в src/types.ts.
Anti-FOUC: тема и color scheme
Если пользователь может переключать светлую/тёмную схему (и тем более с persist), одного runtime FApp мало: до JS страница может мигнуть «не той» схемой.
Плагин при colorScheme:
- Ставит на
<html>data-color-scheme+ compat classlight|dark(дляsystemв статике — fallbacklight). - Вставляет blocking script: читает
localStorage['finzor-ui-color-scheme-preference'], иначе fallback из опции, резолвитsystemчерезmatchMedia, пишет attr + class +style.colorSchemeдо paint.
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@finzor-ui/vite-plugin/nuxt'],
finzorUi: {
colorScheme: 'system'
}
})
<!-- runtime: FApp — writer; select без своего v-model на схему -->
<template>
<FApp color-scheme="system" persist-color-scheme>
<FColorSchemeSelect />
</FApp>
</template>
finzorUi.colorMode (если подключён @nuxtjs/color-mode) — follower для $colorMode; DOM по-прежнему ведёт Finzor.
API
| Import | Когда |
|---|---|
finzorUi из @finzor-ui/vite-plugin |
Vite / Vite SSR |
default / module из @finzor-ui/vite-plugin/nuxt |
Nuxt (configKey: 'finzorUi') |
Корневой пакет также экспортирует низкоуровневые helpers (mergeFinzorSsrNoExternal, scan/optimize/bootstrap utils и т.д.) — для тестов и нестандартного wiring. В обычном приложении достаточно finzorUi или Nuxt-модуля.
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 0.5.12 | ^3.0 | ||
| 0.5.11 | ^3.0 | ||
| 0.5.10 | ^3.0 | ||
| 0.5.8 | ^3.0 | ||
| 0.5.7 | ^3.0 | ||
| 0.5.6 | ^3.0 | ||
| 0.5.5 | ^3.0 | ||
| 0.5.4 | ^3.0 | ||
| 0.5.3 | ^3.0 | ||
| 0.5.2 | ^3.0 | ||
| 0.5.1 | ^3.0 | ||
| 0.5.0 | ^3.0 | ||
| 0.4.2 | ^3.0 | ||
| 0.4.1 | ^3.0 | ||
| 0.3.8 | ^3.0 | ||
| 0.3.7 | ^3.0 | ||
| 0.3.6 | ^3.0 | ||
| 0.3.5 | |||
| 0.3.4 | |||
| 0.3.3 | |||
| 0.3.1 | |||
| 0.2.2 | |||
| 0.2.1 | |||
| 0.2.0 |