Как лучше подключать svg иконки во vue js?

Возник вопрос о том как лучше с точки зрения производительности и правильности организации кода подключать svg-иконки? Как это делаете вы?

1 Вариант:
Создать под каждую иконку свой компонент ("Close-icon.vue", "Menu-icon.vue", "Edit-icon.vue") и просто подключать как отдельный компонент.

2 Вариант:
Создать один компонент, например "Icons.vue", внутри добавить пропс name и через условные операторы рендерить необходимую иконку в зависимости от того, что лежит в пропс. Условно, если в пропс передали "close", то в компоненте "Icons.vue", через "v-if/v-else-if" рендерить ту, которая равна "close".

Может есть еще какие-то более лучшие варианты или готовые библиотеки?

Дополнительно:

Если точно нужны inline svg, то vue-svg-loader - он делает автоматически ваш 1-й вариант.

Ещё есть vite-svg-loader - подключается как плагин к vite и удобен тем, что можно из vite.config менять как импортировать файл (url или raw).

Можно написать свой компонент в который передавать имя иконки. Только не делайте свой 2-й вариант - его недостаток в том, что все иконки всегда загружаются в браузер даже если никогда не будут показаны.

через "v-if/v-else-if" рендерить ту, которая равна "close".

Если у вас всего 2-3 иконки - можно и так, но в общем случае - старайтесь не использовать длинные "портянки" if/else. Почти всегда можно обойтись без такого кода. (conponent is или defineAsyncComponent)

На самом деле, решение зависит от ситуации.

Если у вас есть не огромный(!) набор иконок для повсеместного использования - то вам нужен SVG Sprite. В других ответах уже накидали даже названий библиотек для Vue.

Если коротко, то использование выглядит следующим образом:

Кладете в public файл со спрайтами (обычно, сборка такого файла берут на себя библиотеки. Не хитрый SVG файл, который можно один раз собрать и юзать сборку)

А далее - элементарный компонент

Icon.vue

Использования будет выглядеть следующим образом:
App.vue

Тут есть небольшой подводный камень, связанный с размерами (use не учитывает width, height, viewBox иконки, которая в Spritemap). Обходится элементарно - добавлением размера для svg с помощью CSS.

Если вам нужны 2-3 иконки - более рационально будет просто заинлайнить их в template. Не очень оптимизировано, зато не тратим кучи времени на ненужные телодвижения.

В случае с большим количеством иконок (более 500) SVG Sprite будет неэффективен ввиду того, что на каждую страницу будет загружаться тонна ненужных иконок. В таких случаях, лучше хранить иконки без спрайта, просто в ассетах и использовать ссылки на них в <use>.

Ссылки:
- https://developer.mozilla.org/en-US/docs/Web/SVG/E...

Я в vue не работал, но в react.js лучшим вариантом по производительности считается создание svg спрайта
иконки не входят в компоненты и не увеличивают размер бандла.

Думаю в vue будет лучшим тоже такой способ, вот загуглил и нашел даже библиотеку
https://www.npmjs.com/package/vue-svg-sprite

  • Во времена HTTP 2 спрайты не столь актуальны.
  • VolgaVolga, а что актуально?
  • Петр Сергеев, на самом деле в этом комменте имеется ввиду спрайты картинок, раньше их использовали чтобы было меньше потоков загрузки, ведь максимально тогда грузилось по моему 9 потоков с одного домена остальные становились в очередь. Для этого и делали спрайты из картинок, или разносили картинки по разным доменам, чтобы все картинки грузить в одном потоке, или с разных доменов.

    Но в данном вопросе суть совсем в другом, спрайты svg используются для того, чтобы уменьшить размер бандла, а значит увеличить скорость загрузки приложения.

У меня к примеру папка Icons и в паке IcomName.vue, внутри обычный содержащий svg-иконку. Когда нужна иконка, просто импортирую как обычный компонент Vue.

 

Для решения данной проблемы вы можете воспользоваться услугами фрилансеров. Мы выполним необходимую работу быстро и качественно.

 

    • Как лучше подключать svg иконки во vue js?Есть ответ
    • 07.04.2024
    Ответить

    Для подключения SVG иконок во Vue.js есть несколько способов. Один из наиболее распространенных способов - это использование компонента Vue SVG Sprite.

    Для начала установите пакет vue-svg-sprite с помощью npm:

    Затем добавьте его в ваш проект:

    Теперь вам нужно создать файл со всеми вашими SVG иконками. Обычно это делается путем создания файла с расширением .svg и помещения всех иконок внутри него.

    Затем вы можете использовать иконки в своих компонентах Vue следующим образом:

    Где icon-name - это имя вашей иконки, как она определена в вашем файле со всеми иконками.

    Еще один способ - это использование встроенного свойства :src для Как лучше подключать svg иконки во vue js? тега:

    Здесь @/assets/icons/ - это путь к вашим SVG иконкам внутри вашего проекта.

    Выберите подход, который лучше всего подходит для вашего проекта и начните использовать SVG иконки во Vue.js!

Оставить комментарий