Первоначально опубликовано rossta.net
WebPack не только для JavaScript. Вы можете установить изображения с ним тоже. WebPacker Делает его относительно легко работать с изображениями, но это по общему признанию, сбивая с толку: Изображения в JavaScript?
В этом посте мы продемонстрируем, как ссылаться на изображения WebPacker из вашего JavaScript, CSS и Rails Views. Следующие примеры были созданы с помощью рельсов 6 и WebPacker 4, но могут работать с другими версиями. Предварительные реквизиты для работы с WebPacker в проекте Rails также включают пряжа Отказ
Структура папок
Во-первых, где вы должны поместить ваши изображения? Это не имеет значения. Самое простое место для начала находится под вашим Приложение/JavaScript
Папка, путь источника по умолчанию для WebPacker, например Приложение/JavaScript/Images
Отказ
Для остальной части этого руководства мы предполагаем следующую структуру каталогов и файлы:
app/javascript ├── components │ └── Taco.js ├── css │ ├── main.css ├── images │ ├── burritos.jpg │ ├── guacamole.jpg │ └── tacos.jpg └── packs └── application.js
Не странно ставить изображения и CSS в папку под названием «JavaScript»? Зависит от. Если вы рассматриваете, с точки зрения WebPack, все является модулем JavaScript, это может быть не так странно. В противном случае можно переименовать Приложение/JavaScript
или поместите ваши изображения в другом месте. Больше на этом ниже.
Изображения в js.
Чтобы ссылаться на изображение из JavaScript в вашем сборке WebPacker, просто импортируйте его как любой другой модуль. Реагировать не требуется для этого для работы;)
// app/javascripts/components/Taco.js import TacoImage from '../images/tacos.jpg' export default function({ title }) { return `` }${title}
В приведенном выше примере WebPack импортирует Tacoimage
как URL к файлу. Другими словами, «модуль изображения» в WebPack экспортирует одно значение по умолчанию, строку, представляющее местоположение файла. Исходя из конфигурации WebPacker по умолчанию, имя файла будет выглядеть что-то вроде /packs/media/images/tacos-abcd1234.jpg
Отказ
Импорт изображения также работает, если вы используете «CSS в JS», чтобы стиль реактивный компонент.
import React from 'react' import TacoImage from '../images/tacos.jpg' const styles = { backgroundImage: `url(${TacoImage})`, } export default function ({ title }) { return ({title}!) }
Заинтересованы узнать больше о WebPack на Rails? Я создаю курс.
Подписаться на Rossta.net, чтобы получить обновления.
Изображения в CSS.
В сосредоточении, при обращении к изображениям в CSS, вы бы использовали специальные Image-URL ()
помощник. В WebPack просто используйте стандарт URL ()
Выражение в CSS с относительным путем.
/* app/javascript/css/main.css */ .burritos { background-image: url("../images/burritos.jpg"); }
Вывод для правила стиля будет, опять же, выглядит что-то вроде Фоновое изображение: URL (/packs/media/images/burritos-efgh5678.jpg);
Отказ Эта техника также будет работать на пути изображения в модулях CSS.
Изображения в CSS в модулях NPM
Один хитрый пакет, который стоит упомянуть, является объединение изображения, упомянутые в SCSS в рамках импортированного NPM модуля. Например, многие плагины JQuery Bundle их собственные активы SCSS и изображения. Когда WebPack обрабатывает эту поставку CSS, вы можете увидеть ошибку, как следующее, как в Этот вопрос на Stackoverflow :
Module not found: Error: Can't resolve '../img/controls.png'
Проблема в том, что путь не разрешается должным образом относительно вывода для этой поставной SCS. От WebPacker Docs :
Поскольку Sass/libsass не предоставляет перезаписи URL, все связанные активы должны быть относительно вывода. Добавьте отсутствующее переписывание URL, используя Resolve-URL-погрузчик. Поместите его непосредственно после погрузчика SASS в цепочке погрузчика.
Чтобы исправить это, вам может воспользоваться своими руками с помощью конфигурации WebPacker. Добавьте Решитель-URL-погрузчик
и настроить в config/webpack/enducial.js
:
yarn add resolve-url-loader
// config/webpack/environment.js const { environment } = require('@rails/webpacker') // resolve-url-loader must be used before sass-loader environment.loaders.get('sass').use.splice(-1, 0, { loader: 'resolve-url-loader' })
Это правило погрузчика, вставленное в трубопровод погрузчика для файлов SASS/SCSS, убедитесь, что правильный URL записан на вывод CSS с помощью WebPack.
Изображения в Rails Views
Вы можете быть привыкся к <% = image_tag 'tacos.jpg'%>
Для ссылки изображения в комплекте на трубопроводе активов Rails. У WebPack есть похожий тег:
<%= image_pack_tag 'media/images/guacamole.jpg' %>
Примечание, поскольку WebPacker 4, префикс СМИ/
Нужно, и оставшийся путь представляет местоположение от вашего исходного пути WebPack.
Там улов. Это изменение может привести к следующей ошибке:
Webpacker::Manifest::MissingEntryError in Lunches#index Showing /path/to/project/app/views/lunches/index.html.erb where line #4 raised: Webpacker can't find media/images/guacamole.jpg in /path/to/project/public/packs/manifest.json.
guacamole.jpg
Изображение не было найдено рельсами, но, если бы мы пытались рендеринг Tacos.jpg
Изображение в нашем шаблоне, то есть <% = Image_pack_tag media/Images/tacos.jpg%>
Изображение Taco с радостью визуализирует. Что дает?
Ваше приложение Rails не является избирательным в кухне. Разница в том, мы ранее импортировали Tacos.jpg
Изображение в WebPack, но не guacamole.jpg
Отказ
Один из способов исправить эту проблему – импортировать guacamole.jpg
Изображение где-то в вашем графике зависимости WebPack. Нет необходимости снимать ссылку на импортированную переменную, потому что мы заботимся о побочной эффекте излучающего файла для рельсов на ссылку на вид.
import '../images/guacamole.jpg'
Еще один способ исправить эту проблему – импортировать все Изображения в Приложение/JavaScript/Images
каталог. WebPack предоставляет специальную функцию для импорта многих файлов в каталоге в одном выражении: потребовать .Контекст
Отказ Вы можете добавить это на ваш application.js
пакет:
// app/javascript/packs/application.js require.context('../images', true)
Это выражение рекурсивно требует всех файлов в Изображения
каталог. В результате мы можем теперь сделать guacamole.jpg
на рельсе вид.
Примечание: я рекомендую только использовать потребовать .Контекст
Для ваших изображений, если вам нужно сделать их в ваших видах Rails; потребовать .Контекст
Не нужно импортировать изображения в файлы JS, как ваши компоненты реагирования, как показано ранее.
Перенастройка
Если вы не чувствуете себя комфортно с Приложение/JavaScript
Как исходный каталог для Изображения
, вы можете либо переименовать исходный путь или добавить к набору разрешенных путей.
Переименовать Приложение/JavaScript
, переименуйте каталог и скажите рельсам об этом в config/webpacker.yml.yml.
default: &default source_path: app/frontend
Чтобы добавить в набор разрешенных путей, где WebPack должен искать активы, кроме того, в Приложение/JavaScript
:
default: &default resolved_paths: - app/assets
Дайвинг глубже
Я должен признать, что несколько лет назад я впервые услышал о WebPack, я был супер-запутанным. Я понял, что это модуль JavaScript Bundler. Как на земле это обрабатывает изображения?
Краткий ответ, конечно, это Это зависит от Отказ Как правило, WebPack будет относиться всем, что он может понять как модуль JavaScript. Чтобы помочь WebPack понять изображения, проекты добавляют «загрузчик» (или погрузчики) в конфигурацию WebPack. Подходящий погрузчик будет знать, как обрабатывать файл изображения и выводить представление чего-либо, как встроенная строка Base64, которую можно манипулировать в JavaScript.
Чтобы помочь WebPack понять изображения, файлы SVG и шрифты в проекте Rails, WebPacker добавляет файловой погрузчик
упаковка. Этот пакет изменит импортированный файл в качестве побочного эффекта сборки и возвращает путь к файлу в виде содержимого модуля.
Для получения дополнительной информации о том, как WebPack работает с изображениями, проверьте Документы управления активами Отказ
Я также собрал демонстрацию образца Rails 6 WebPacker Demo Project на Github для более контекста:
Оригинал: “https://dev.to/rossta/importing-images-with-webpacker-2302”