Коротка відповідь
middleSVG‑оптимізація — це процес зменшення розміру файлу без втрати якості. Я застосовую інструменти, такі як SVGO, і вручну видаляю непотрібні атрибути, колірні коди та метадані. Також використовую інлайн‑SVG у React, щоб уникнути додаткових HTTP‑запитів.
Повне пояснення
Що це і навіщо SVG‑оптимізація зменшує розмір файлів, що підвищує швидкість завантаження сторінок і знижує використання пропускної здатності. Це критично для мобільних пристроїв і SEO.
Ключові принципи, терміни, інваріанти
- Minification – видалення пробілів, коментарів і непотрібних атрибутів.
- Path simplification – зменшення кількості команд у
dатрибуті шляхів. - Color reduction – заміна довгих HEX‑кодів на короткі або використання
currentColor. - ViewBox normalization – встановлення однорідного
viewBox, що дозволяє масштабувати SVG без втрати якості. - Inlining – вставка SVG у HTML/JSX замість окремих файлів.
Як це працює (життєвий цикл, алгоритм)
- Підготовка – збір усіх SVG‑ресурсів.
- Автоматичний процес – запуск SVGO або подібного плагіна, що застосовує правила minification і path simplification.
- Ручна перевірка – видалення метаданих (
<metadata>,<!-- comments -->), зайвих стилів і атрибутів (id,class). - Вбудовування – вставка очищеного SVG у JSX:
<svg {...props}>...</svg>.
Практика і реалізація (React/Next.js)
import { ReactComponent as Logo } from './logo.svg';
const Header = () => <header><Logo width={48} height={48} /></header>;
У Next.js можна використовувати next/image для статичних SVG, а також налаштувати svgr плагін у Vite/Webpack.
Тестування (Jest, Testing Library)
- Перевірка, що SVG рендериться без помилок:
expect(screen.getByTestId('logo')).toBeInTheDocument();. - Порівняння розміру файлу до/після оптимізації за допомогою
file-size.
Оптимізація продуктивності
- Inlining зменшує кількість HTTP‑запитів.
- Symbol sprite (
<symbol>/<use>) дозволяє повторно використовувати один SVG‑файл. - Lazy loading через
loading='lazy'для великих інлайн‑SVG.
Accessibility (ARIA)
- Додаємо
role="img"іaria-labelабоtitleдля опису. - Уникаємо зайвих атрибутів, що збільшують DOM‑розмір.
Безпека та валідація
- Перевірка SVG на XSS‑загрози: видалення
<script>,on*атрибутів. - Використання CSP‑правил:
img-src 'self'іscript-src 'none'.
Типові помилки й edge cases
- Залишені
id/classатрибути, що створюють колізії. - Неоптимізовані
pathз великою кількістю точок. - Відсутність
viewBox, що призводить до некоректного масштабування.
Cheatsheet + можливі follow‑up питання
- SVGO plugins:
removeViewBox,cleanupIDs,convertColors. - React‑SVG:
@svgr/webpackабоvite-plugin-svgr. - Follow‑up: «Як обрати між інлайн‑SVG і sprite?» – обговорити trade‑offs щодо кешування, розміру DOM та SEO.