Files
svg-sprites/docs/ru/guides/react-vite.md
2026-07-14 16:11:39 +03:00

4.8 KiB
Raw Blame History

React-компонент для Vite

Это автономный quick start для exact mode key react@vite: генератор создаёт типизированный IconsIcon, а Vite публикует отдельный SVG asset.

1. Генерация спрайта

Главное преимущество: генератор не нужно устанавливать и добавлять в package.json. npx временно скачивает CLI, а generated production runtime не импортирует @gromlab/svg-sprites.

src/sprite/
├── icons/
│   ├── check.svg
│   └── warning.svg
├── index.ts
└── svg-sprite.config.ts

Минимальный plain config:

export default {
  mode: 'react@vite',
  name: 'icons',
}

Если input не указан, SVG читаются из ./icons относительно конфига. Вместо .ts можно использовать .js с default export или .json.

npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts

В CI замените latest на точную версию, например @gromlab/svg-sprites@1.1.5. Exact Vite commands:

{
  "scripts": {
    "sprites": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts",
    "dev": "npm run sprites && vite",
    "build": "npm run sprites && tsc --noEmit && vite build",
    "typecheck": "npm run sprites && tsc --noEmit"
  }
}

Не добавляйте predev, prebuild или pretypecheck, если соответствующие scripts уже явно запускают npm run sprites. Generated .svg-sprite не коммитится. Generated локальный .gitignore, который исключает этот каталог, нужно добавить в Git один раз. Generated declarations self-contained: они описывают компонент и manifest без импорта @gromlab/svg-sprites.

Пользовательский barrel возвращает generated API:

// src/sprite/index.ts
export * from './.svg-sprite/index.js'

Production usage:

import { IconsIcon, iconsIconNames } from './sprite'

export function SaveButton() {
  return (
    <button type="button">
      <IconsIcon
        icon="check"
        width={24}
        height={24}
        aria-hidden="true"
        style={{ '--icon-color-1': '#16a34a' }}
      />
      Сохранить
    </button>
  )
}

console.log(iconsIconNames)

Prop icon является union имён исходных файлов. Vite автоматически обрабатывает generated CSS Module и импорт sprite.svg?no-inline; query запрещает inline и заставляет Vite выпустить отдельный hashed SVG asset. Если TypeScript не знает Vite asset imports, добавьте /// <reference types="vite/client" /> в src/vite-env.d.ts.

2. Дебаг и превью

Viewer необязателен и нужен только для debug/preview. Установите package отдельно:

npm install --save-dev @gromlab/svg-sprites

Используйте React bridge со статическим массивом loaders:

import { SpriteViewer } from '@gromlab/svg-sprites/react'

const sources = [
  () => import('./sprite/.svg-sprite/svg-sprite.manifest.js'),
] as const

export function IconsDebugPage() {
  return <SpriteViewer sources={sources} title="Иконки проекта" />
}

Строковый путь в import() должен указывать на generated JS manifest. Держите страницу за debug-маршрутом; SpriteViewer не входит в production runtime IconsIcon.

3. Типизация конфига

Если package установлен локально, используйте helper:

import { defineSpriteConfig } from '@gromlab/svg-sprites'

export default defineSpriteConfig({
  mode: 'react@vite',
  name: 'icons',
})

Также можно импортировать SpriteConfig только как type и написать объект satisfies SpriteConfig.

Без package добавьте локальный type прямо в config:

type LocalSpriteConfig = {
  mode: 'react@vite'
  name?: string
  description?: string
  input?: string | string[]
  transform?: {
    removeSize?: boolean
    replaceColors?: boolean
    addTransition?: boolean
  }
  generatedNotice?: boolean
}

export default {
  mode: 'react@vite',
  name: 'icons',
} satisfies LocalSpriteConfig

Локальный type проверяет только этот exact mode и не создаёт runtime-зависимость.