SVG
SVG — масштабируемый векторный формат, особенно удобный в React благодаря двум способам импорта: как изображение и как React-компонент. Это даёт гибкость: можно либо просто вставить картинку, либо управлять её содержимым программно.
Импорт SVG как изображения
Если вам нужно просто отобразить SVG-файл без изменения его содержимого:
import logo from './logo.svg';
function App() {
return <img src={logo} alt="Логотип" />;
}
Сборщик обрабатывает файл как обычное изображение: копирует в папку сборки, добавляет хеш и возвращает путь. Такой подход подходит для сложных SVG или когда не требуется стилизация.
Импорт SVG как React-компонента
Для простых иконок или логотипов, которые нужно стилизовать (менять цвет, размер, анимировать), используйте специальный синтаксис:
import { ReactComponent as Logo } from './logo.svg';
function App() {
return <Logo fill="blue" width="100" height="40" />;
}
Здесь ReactComponent — это зарезервированное имя, распознаваемое сборщиком. В результате Logo становится полноценным React-компонентом, встроенным в JSX. Это позволяет:
- Менять цвет через
fillилиstroke, - Управлять размерами через пропсы,
- Применять CSS-классы или инлайновые стили,
- Анимировать отдельные части через JavaScript.
Когда что использовать
- Как изображение: сложные SVG, внешние логотипы, когда не нужна интерактивность.
- Как компонент: иконки, простые графические элементы, где важна гибкость стилей и интеграция с React-состоянием.
Как выглядит настройка
В большинстве современных шаблонов (Create React App, Vite с @vitejs/plugin-react) поддержка импорта SVG как компонента включена по умолчанию. Однако если вы настраиваете сборку вручную, потребуется соответствующий лоадер или плагин:
-
Webpack: используется
@svgr/webpack. В конфигурации нужно добавить правило:{ test: /\.svg$/, use: ['@svgr/webpack', 'url-loader'] }Порядок важен:
@svgr/webpackобрабатывает импорт сReactComponent, аurl-loader— обычные импорты. -
Vite: достаточно установить
vite-plugin-svgr:npm install -D vite-plugin-svgrИ подключить в
vite.config.js:import svgr from 'vite-plugin-svgr'; export default { plugins: [svgr()] };После этого синтаксис
import { ReactComponent as Icon } from './icon.svg'будет работать корректно.
Без такой настройки попытка импорта как компонента вызовет ошибку: сборщик не распознает ReactComponent и вернёт только строку с путём.