

Michael
02.11.2017
14:36:53
привет, коллеги!
думаю, как бы прикрутить svg-иконки. у нас SPA без 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: ...}, - вроде работает, но прежде чем начать его активно юзать, хочу посоветоваться с умными людьми =)
я первое юзаю, доволен как слон. Код красивый.


Ilya
02.11.2017
14:37:20

Michael
02.11.2017
14:37:33
насчёт нафига, ответ простой: вртуалдом
надо тебе через д3 точку поправить. одну из 47 тысяч

Google

Michael
02.11.2017
14:37:57
и... вот так.

Илья
02.11.2017
14:38:36


Stanislav
02.11.2017
14:39:13
привет, коллеги!
думаю, как бы прикрутить svg-иконки. у нас SPA без 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


Michael
02.11.2017
14:39:36

Илья
02.11.2017
14:40:19

Michael
02.11.2017
14:40:37

Stanislav
02.11.2017
14:41:11

Николай
02.11.2017
14:41:26
Решение

Илья
02.11.2017
14:41:33
а, но у вас он физически инлайнится в HTML?

Stanislav
02.11.2017
14:41:40

Michael
02.11.2017
14:41:48

Stanislav
02.11.2017
14:41:48
При сборке

Николай
02.11.2017
14:42:24
Nuxt.config.js добавил render: {resourceHints: False }

Google

Илья
02.11.2017
14:42:42
ясно, но это вроде значит, что спрайт не попадет в кеш (а у svg-sprite-loader попадет, потому что он физически сидит в js-бандле и вставляется в дом уже при загрузке)

Николай
02.11.2017
14:43:03
И теперь имею чистенький html с загрузкой пары файлов

Stanislav
02.11.2017
14:43:29

Илья
02.11.2017
14:43:44
ну типа если юзер часто ходит на сайт

Stanislav
02.11.2017
14:44:19
Да оно там фигню будет весить. Отдельного запроса нет. Рендеринг страницы не тормозит

Sasha
02.11.2017
14:44:20

Michael
02.11.2017
14:44:35
гы.

Илья
02.11.2017
14:45:33
ок, ну не суть +)
короче, если я не хочу юзать svg в качестве фона из css, на спрайты можно забить и вставлять тупо в хтмл целиковый svg?
я вообще хотел это с автором svg-sprite-loader обсудить, он русский, но чет пока на связь не вышел, так что пристаю к вам )

Michael
02.11.2017
14:46:39
на самом деле, в качестве компонента вью это будет немного менее ошибко-генерящее
(error-prone)
в большом приложении скажется на поддержке
с другой стороны, если у тебя верстак есть огненный, можно ему отдать в ксске)

Илья
02.11.2017
14:48:28
не понял )
я сам довольно огненный ?

Michael
02.11.2017
14:49:00
не понял )
<my-svg /> куда глазастей, чем бэкграунды в отдельном ксс

Stanislav
02.11.2017
14:49:10
+

Michael
02.11.2017
14:49:28
значит, проще. значит, меньше вероятности запутаться и оставить багу рано или поздно.

Google

Michael
02.11.2017
14:49:54
другое дело, если ты угараешь по ксс и для тебя он приятнее кода. Тогда всё наоборот)

Илья
02.11.2017
14:49:59
а, ну это да, но я как бы сразу решил, что расставлять иконки из css мы не хотим )

Taras
02.11.2017
14:50:33

Michael
02.11.2017
14:50:37
тогда не заморачивайся и грузи компонентом)
вот будут они слишком жирные, будешь складывать в отдельные подсборки и всё такое
в конце концов, вебпак плагин напишешь

Dmitry
02.11.2017
14:51:20
Подскажите, что делать
<component :is="view"></component>
изменяя view - меняю отображаемый компонент.
Если внутри одного компонента делаю операции, изменяю переменные - при возвращении к нему - данные теряются. Как быть?

Michael
02.11.2017
14:51:22
там доки получше стали, кстати
мало инфы.
кого одного? другого?
возвращении куда? в маза рашу?

Илья
02.11.2017
14:54:52
ок, тогда последний вопрос =)
у svg vue loader есть вот такая строчка: https://github.com/visualfanatic/vue-svg-loader/blob/4921cf1069f59db5a0a30b169ee001db72bd1755/index.js#L22
это типа содержимое svg подается на вход vue-компайлеру, а он возвращает render-функцию.
меня почему-то этот момент смутил - оно точно затормозит сборку, и, скорее всего, затормозит рантайм (потому что при рендере компонента весь svg будет собираться обратно из vnode-ов)
мне захотелось тупо зафигачить содержимое через innerHTML, что я на коленке и сделал =)
вопрос: есть ли у моего решения недостатки?

Michael
02.11.2017
14:54:55
и какие переменные? в переменной view? каким образом?

Dmitry
02.11.2017
14:55:43

Ilya
02.11.2017
14:55:59
не будет никакого href
props

Dmitry
02.11.2017
14:56:22
Я, кажется, разобрался. Keep-alive может сохранять состояние компонента. запоминает все свойства

Ilya
02.11.2017
14:56:25
почитай про vue-router

Michael
02.11.2017
14:57:05

Google

Илья
02.11.2017
15:02:22

Michael
02.11.2017
15:02:42
тогда у тебя велосипет с:
потому что у него по внутренней сути на первый взгляд то же самое, но немного более vue-way.

Илья
02.11.2017
15:04:08
ну смотри, у меня по сути ровно тот же код, что и у vue-svg-loader, но разница в том, как устроена рендер-функция
моя не собирает svg из vnode-ов, а вставляет его в innerhtml

Michael
02.11.2017
15:04:42
ааааа
ну если код свгшки не будет меняться
сам хтмл свгшки
но твой выигрышный

Admin
ERROR: S client not available

Илья
02.11.2017
15:05:13
ну вроде не должен

Michael
02.11.2017
15:05:28
ибо разница только в виртуалдоме

Илья
02.11.2017
15:06:11
ну и меня еще пугает мысль, что мы заставляем компайлер ву-шаблонов парсить что-то, что, во-первых, шаблоном не является, а во-вторых даже не нами написано

Michael
02.11.2017
15:06:12
может, есть, правда, подводные камни в кеше виртуалдома

Илья
02.11.2017
15:06:30
у меня свгшки экспортируются из фигмы, есть такой стремный сервис

Michael
02.11.2017
15:06:34
там где внодный вариант закешится и будет обновляться хитро, твой может перерисоваться целиком
но тут больше хз чем нет
думать немного уже надо
)))

Илья
02.11.2017
15:07:05
ну короче надо потестить, ок +) про кеш понял мысль, да

Google

Илья
02.11.2017
15:07:19
собсно надо почитать исходники и понять, как оно перерисовывается

Michael
02.11.2017
15:07:29
так что если свг не срака, то всё ок
если что найдёшь интересное, напиши, указав меня где-нибудь чтобы уведомление вылезло) интересно

Илья
02.11.2017
15:08:17
свг как минимум валидный xml, потому что он предварительно через svgo прогоняется, но все равно
окей =)

Michael
02.11.2017
15:08:36
ну хмл имеет неограниченный набор тегов
как минимум
на хмл вю может заругаться
и будет прав
а вот на хтмл нет

Илья
02.11.2017
15:09:24
ну там теоретически может возникнуть конфликт, если в спецуху свг добавят теги <component> и <template> ?
или например если где-то в проекте кто-то добрый зарегает глобально компонент <g> или <path> ?

Michael
02.11.2017
15:10:05
или мухобойку для джунов
палочку из бамбука

Илья
02.11.2017
15:11:30
ну у себя я это могу контроллировать, а если делать какое-то отчуждаемое решение, то уже хз
вообще глобальная регистрация компонентов - это типа считается бэд пректис, или норм?
я все импортирую руками, но иногда подбешивает )

Michael
02.11.2017
15:12:26
это классическая тема про глобальные переменные. Слать такие решения куда подальше. А авторам пособие для чайников.
https://stackoverflow.com/questions/484635/are-global-variables-bad