почти в каждом внешнем проекте вам нужно использовать иконки. Есть несколько способов. Наиболее распространенный способ — использование значка шрифта или значка SVG.

Во многих случаях значки SVG почти лучше, чем значки шрифтов. Но главная проблема SVG-иконок — это размер. Иконки в формате SVG имеют свой путь и теги для отображения. например, простой значок звезды выглядит так:

Только представьте, что у вас на странице сотни иконок! Ваша HTML-страница будет очень большой и, конечно же, снизит производительность вашего сайта.

И для встроенных значков SVG нет механизма кэширования, потому что они находятся непосредственно в вашем HTML.

Мы можем использовать внешние файлы значков SVG вместо встроенного SVG, чтобы избежать увеличения размера HTML и использовать механизм кэширования. Но внешние файлы значков SVG для рендеринга должны открывать HTTP-запрос для каждого запроса, что снижает производительность веб-сайта. а также сложнее поддерживать и настраивать внешние значки SVG.

Как использовать значки SVG без увеличения размера HTML?

1. Удалите дубликаты SVG с помощью символа

В вашем доме у нас могут быть две кнопки с одинаковыми звездочками. Наверное, это то, что мы обычно делаем:

Это приведет к большому и трудно читаемому файлу HTML.

Существует функция SVG Symbol, помогающая предотвратить дублирование SVG. Элемент ‹symbol› — это графический шаблон, который может быть создан с помощью элемента ‹use›.

С помощью элемента ‹symbol› мы определяем SVG один раз и используем его с элементом ‹use› в любом месте в любом количестве, не записывая дубликаты SVG.

Давайте напишем предыдущий пример, используя Symbol:

В этом примере мы определяем ‹символ› с уникальным идентификатором. Затем с помощью элемента ‹use› мы можем отобразить этот символ в любом месте, где захотим, только со ссылкой на идентификатор символа в атрибуте href.

С помощью этой техники мы можем предотвратить дублирование SVG, но при этом размер нашего HTML-файла увеличится. Как мы можем исключить SVG из HTML и сделать его кэшируемым?

2. Отделите SVG от HTML с помощью ленивой инъекции

Браузеры поддерживают метод insertAdjacentHTML. У каждого элемента есть этот метод, который принимает позицию рендеринга и строку допустимого HTML в качестве источника, а затем отображает источник в этой позиции элемента.

Например, отобразите тег span в div:

Результат будет:

С помощью этого метода мы можем поместить наш SVG в файл JS и внедрить его в HTML после запуска этого файла JS.

Давайте напишем пример со звездами, используя Lazy-Injection и Symbol:

Результат:

Теперь мы удалили дубликаты SVG и отделили их от HTML. Теперь у нас есть только один JS-файл, который можно легко кэшировать как на стороне клиента, так и на стороне сервера. Кроме того, размер нашего HTML не будет слишком большим.

Поздравляем!

Заключение

Иконки SVG имеют много преимуществ, но их основная проблема заключается в увеличении размера HTML.

Первое, с чем мы должны быть осторожны при использовании значков SVG, — это избегать дублирования. Это можно решить с помощью элементов ‹symbol› и ‹use›.

Второе, что мы можем сделать, чтобы уменьшить размер HTML, — это отделить значки SVG от HTML в файле JS и отобразить их с помощью insertAdjacentHTML.

Помещение значков SVG в отдельный файл JS позволяет нам использовать значки SVG без увеличения размера HTML.

Мы также можем кэшировать этот JS-файл как на стороне клиента, так и на стороне сервера, что невозможно с чистыми встроенными значками SVG.