169 похожих чатов

В webpack работало так: <inline-svg :src="require(@assets/img/flags/${$i18n.locale}.svg)" /> Перенес проект на Vite и

там нет поддержки require, добавил ее с помощью vite-plugin-require-transform но он не умеет решать такие пути (ему нужно точное значение переменной заранее иначе получается import из пустоты и вылетает ошибкой).

Есть еще много способ но все они ебола какая то... отдельно импортировать картинки, картинки превратить в компоненты и пр... самый идеальный способ думаю 1й как в вебпаке делал, как его починить ?

14 ответов

23 просмотра

в доке вита есть готовые примеры, зачем какие-то дополнительные плагины еще ставить для этого

!src

Artyom Tuchkov
!src

Почему такой код не работает? Картинка точно есть по этому, и без переменной работает! image = '@/assets/images/cat.png' <img :src="image" /> 1. При использовании сборщиков модулей (Webpack, Vite), с файлами и картинками тоже работают, как с модулями. '@/assets/images/cat.png' - это путь до картинки в исходном коде. После импорта файла через сборщик в результате импорта будет путь до файла в собранном приложении. Он будет в другой директории, с хэшем в имени для кэширования, а может даже преобразован или inline-ссылкой (data url). import Cat from '@/assets/images/cat.png' console.log(Cat); // /img/Cat.45df63.png v-bind в :src работает в рантайме (в браузере), а путь должен определяться ещё при сборке приложения. <img :src="Cat" /> - Работает <img :src="require('@/assets/images/cat.png')" /> - Тоже работает в сборщиках с require 2. Но почему тогда вот так работает? <img src="@/assets/images/cat.png" /> Сборщик с @vue/sfc-compiler знает, что в src="" в HTML и url() в CSS указывается путь. Если он относительный (не с /), то он автоматически работает с ним, как с модулем. Но это должен быть статический путь именно в таком атрибуте. :src или data-src - не сработают <img src="@/assets/images/cat.png" data-src="@/assets/images/cat.png" /> работает как <img :src="require('@/assets/images/cat.png')" data-src="@/assets/images/cat.png" /> превращаясь в <img src="/img/Cat.45df63.png" data-src="@/assets/images/cat.png" /> 3. Что же тогда делать, если надо хранить путь в данных? Используйте импорт модуля: Webpack / Vue CLI: image = require('@/assets/images/cat.png') Vite: import image from '@/assets/images/cat.png' (работает всегда, но на верхнем уровне) image = new URL('../assets/images/cat.png', import.meta.url).href не работает на SSR и только без алиасов 4. Но что если мне нужно динамически определять картинку по имени, например, иконку? Я заранее не знаю, какая именно картинка нужна. В require и new Url можно передавать шаблонную строку или сложение строк для вычисления пути. Тогда сборщик разберёт эту строку и будет считать, что вы можете импортировать в рантайме ЛЮБОЙ файл, подходящий под шаблон. Например, здесь сборщик включит в сборку ВСЕ-ВСЕ файлы из директории icons именем icon-*.png Webpack image = require(`@/assets/icons/icon-${iconName}.png`) Vite image = new URL(../assets/icons/icon-${iconName}.png`, import.meta.url).href` Но это должен быть именно путь до файла в вычислении строки, которую можно распарсить. Не другие JS выражение и не шаблон под любые потенциальные файлы. Не будут работать: require(`${icon}`) require(getIconByName(icon)) Подробности: - https://webpack.js.org/guides/asset-management/#loading-images - https://vitejs.dev/guide/assets.html - https://cli.vuejs.org/guide/html-and-static-assets.html#relative-path-imports - https://github.com/vitejs/vite/issues/10597

Нимай-Олейник Автор вопроса
Artyom Tuchkov
в доке вита есть готовые примеры, зачем какие-то д...

inline-svg требует уже строку в src, require заменяется на строку, плагин ставил для поддержки require (путем добавления импорта выше). + нужна поддержка alias и ssr (не все варианты это поддерживают). А если уходить в импорты то всякая большая ебола с асинхронкой начинается по типу создания отдельных компонентов под картинки.

Четвертый пункт в лонгриде выше подходит и почти аналогичен require из вебпака

Нимай Олейник
URL не работает в ssr

Сделай импорт на каждую иконку (можно сгенерировать)

Нимай-Олейник Автор вопроса
Grigorii K. Shartsev
Сделай импорт на каждую иконку (можно сгенерироват...

Это сработает но плохой вариант, так лет 100 уже не делаю. Хочу починить <inline-svg :src="require(@assets/img/flags/${$i18n.locale}.svg)" /> и не париться.

Нимай Олейник
inline-svg требует уже строку в src, require замен...

сделай глоб импорт своих картинок и доставай по ключу нужную, если не хочется с промисами возиться, то есть eager: true, он тебе зарезолвит сразу строку

Нимай-Олейник Автор вопроса
Artyom Tuchkov
сделай глоб импорт своих картинок и доставай по кл...

Можно где то алиасы взять внутри приложения ? Он в ключах уже разресолвеные пути возвращает.

Нимай Олейник
Можно где то алиасы взять внутри приложения ? Он в...

так проверяй просто через .endsWith, необязательно целый путь указывать в ключе

Нимай-Олейник Автор вопроса
Artyom Tuchkov
так проверяй просто через .endsWith, необязательно...

Уже. В идеале точное совпадение знать.

Нимай Олейник
Уже. В идеале точное совпадение знать.

для чего именно? даже если большая вложенность, то можно указать путь от /assets, там уж точно проблем не будет

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта