SSR, задачи вставлять через CSS нету, так что выбираю между разными способами инлайнинга в HTML
1) есть https://github.com/visualfanatic/vue-svg-loader - он просто читает svg-файл, прогоняет через SVGO и рендерит во vue-компонент
2) есть https://github.com/kisenka/svg-sprite-loader - собирает файлы в спрайт, возвращает объект с айдишником символа, который можно использовать в <use> - но есть возможность дописать "генератор рантайма", чтобы возвращал сразу компонент (есть пример для реакта https://github.com/kisenka/svg-sprite-loader/blob/master/examples/custom-runtime-generator/svg-to-icon-component-runtime-generator.js - для ву получилось сделать аналогичный за 20 минут)
То есть клиентский код у обоих может быть одинаковым:
<template>
<button>Hi, <Icon /></button>
</template>
<script>
let Icon = require("icon.svg")
export default {
components: {Icon}
}
</script>
в первом не нравится, что он превращает svg в render-функцию (нафига?)
во втором не нравится, что SVGO можно подключить только сбоку, соответственно каждый svg будет парситься дважды.
и, главное, не могу понять, есть ли у спрайта преимущества перед тупой вставкой в код, если мы не используем svg из CSS. вроде при тупой вставке на каждое использование иконки будет генериться N дом-узлов, а для спрайта - только 2 (<svg> и <use>). с другой стороны, use вроде как порождает кусок shadow dom, который кажется копируется из источника.
при этом при тупой вставке мы можем легко раскрашивать из CSS отдельные куски SVG, а для спрайта - только все целиком (или я не прав?)
короче, пока накидал свой лоадер на основе vue-svg-loader, он тупо передает содержимое svg строкой в функцию, которая уже создает из нее компонент, всталяя svg через domProps: {innerHTML: ...}, - вроде работает, но прежде чем начать его активно юзать, хочу посоветоваться с умными людьми =)
я первое юзаю, доволен как слон. Код красивый.
Я галпом собираю спрайт из символов, потом вебпак инлайнит его в index.html при сборке. Использую с помощью компонента, в который передаю id символа, где он вставляется в use
Обсуждают сегодня