Плагин @rollup/plugin-image предназначен для импорта
изображений напрямую в JavaScript-модули с преобразованием файлов в
строки формата Data URL (base64). Основная цель —
упростить работу с небольшими изображениями, исключив необходимость
отдельной загрузки файлов в runtime и дополнительных HTTP-запросов.
Ключевая особенность заключается в том, что изображения становятся частью бандла и могут использоваться как обычные переменные:
import logo fr om './logo.png'logo превращается в строку
data:image/png;base64,...Плагин устанавливается через npm:
npm install @rollup/plugin-image --save-dev
Подключение в конфигурации Rollup:
import image from '@rollup/plugin-image';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
plugins: [
image()
]
};
После подключения Rollup начинает обрабатывать импортируемые изображения как модули.
При встрече импорта изображения плагин выполняет следующие шаги:
png,
jpg, gif, svg,
webp)data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...
Таким образом изображение становится строковым значением внутри JavaScript-кода.
Плагин поддерживает основные форматы изображений:
SVG обрабатывается как текст и также может быть преобразован в Data URL.
import icon from './icon.png';
const img = document.createElement('img');
img.src = icon;
document.body.appendChild(img);
В результате icon содержит base64-строку.
import bg from './background.jpg';
const style = document.createElement('style');
style.textContent = `
.hero {
background-image: url(${bg});
}
`;
document.head.appendChild(style);
import logo from './logo.svg';
document.querySelector('#logo').src = logo;
SVG остаётся строкой и может быть встроен без дополнительных преобразований.
Плагин имеет минимальное количество настроек, но ключевым параметром является ограничение на встроенные файлы.
import image from '@rollup/plugin-image';
export default {
plugins: [
image({
lim it: 10000
})
]
};
Параметр limit задаёт максимальный размер файла (в
байтах), который будет преобразован в base64.
При увеличении размера изображений использование base64 становится неэффективным:
Поэтому изображения большого размера обычно выносятся в отдельные ассеты или обрабатываются другими плагинами (например, asset/resource подходом).
@rollup/plugin-image часто используется вместе с:
@rollup/plugin-url — для более гибкой обработки
ассетов@rollup/plugin-commonjs — при работе с
CommonJS-модулями@rollup/plugin-node-resolve — для корректного резолва
импортовПорядок подключения влияет на результат. Обычно image ставится ближе к началу цепочки обработки ассетов.
plugins: [
image(),
nodeResolve(),
commonjs()
]
Ключевое различие заключается в стратегии обработки:
plugin-image всегда возвращает base64 строку (при
попадании под обработку)
plugin-url может:
Таким образом plugin-image ориентирован на простоту и
встроенные ресурсы, а plugin-url — на гибридный подход.
Плагин поддерживает использование в TypeScript-проектах без дополнительных типов.
Пример декларации импорта:
declare module '*.png' {
const value: string;
export default value;
}
После этого изображения можно импортировать как строки:
import avatar from './avatar.png';
const img: HTMLImageElement = new Image();
img.src = avatar;
SVG-файлы могут вести себя иначе, чем растровые изображения:
Пример:
import icon from './icon.svg';
document.body.innerHTML = icon;
В этом случае SVG становится частью DOM без использования
<img>.
Base64 увеличивает размер данных примерно на 33%, что критично для больших изображений.
Изображения загружаются вместе с JavaScript-бандлом, без отдельной отложенной загрузки.
Изображения, встроенные в JS, не кэшируются отдельно браузером, так как являются частью скрипта.
Использование оправдано в следующих случаях:
Не рекомендуется использовать для:
В серверных сборках plugin-image не выполняет рендеринг DOM, а возвращает строковые значения. Это делает его безопасным для использования в SSR-конфигурациях Rollup.
Пример:
import logo from './logo.png';
export function render() {
return `<img src="${logo}" />`;
}
На этапе сборки плагин выполняет операции:
При большом количестве изображений возможны:
Оптимизация достигается через фильтрацию по limit и
использование альтернативных плагинов для ассетов.
Типичная схема применения:
plugin-image для мелких ассетовplugin-url для средних файловТакой подход позволяет балансировать между скоростью загрузки и размером бандла.
Пример использования в компонентной архитектуре:
import checkIcon from './check.png';
export function Button() {
const btn = document.createElement('button');
btn.innerHTML = `<img src="${checkIcon}" /> OK`;
return btn;
}
Изображение становится частью компонента без внешних зависимостей.
Так как импорт изображения преобразуется в строку, Rollup может учитывать его как статический ресурс. Однако само изображение уже включено в итоговый код, поэтому tree-shaking влияет только на факт использования переменной, но не на размер base64-данных, если импорт сохранён.
limitПлагин остаётся нишевым инструментом для простых сценариев работы с изображениями. Его основная ценность — минимальная конфигурация и мгновенное получение Data URL без дополнительной инфраструктуры обработки ассетов.