Rollup изначально ориентирован на JavaScript-модули и не предоставляет встроенной полноценной системы обработки бинарных ассетов. Работа с изображениями, шрифтами и другими статическими файлами реализуется через плагины, каждый из которых решает конкретный сценарий: инлайнинг, копирование, преобразование в строки или генерацию отдельных файлов в выходной сборке.
При подключении изображений и шрифтов в коде встречаются следующие варианты:
Ключевой механизм — обработка import нестандартных
расширений через плагины.
Типичный импорт:
import logo fr om './assets/logo.png';
Без дополнительных плагинов Rollup не сможет обработать такой импорт. Для этого используется плагин:
@rollup/plugin-urlОсновная задача — конвертация файлов в URL или base64.
npm install @rollup/plugin-url -D
import url from '@rollup/plugin-url';
export default {
input: 'src/index.js',
output: {
dir: 'dist',
format: 'esm'
},
plugins: [
url({
lim it: 10 * 1024,
include: ['**/*.png', '**/*.jpg', '**/*.jpeg', '**/*.svg', '**/*.gif'],
emitFiles: true,
fileName: '[name]-[hash][extname]'
})
]
};
limit преобразуются в base64limit копируются в output directoryМеханизм инлайнинга уменьшает количество HTTP-запросов, но увеличивает размер JS-бандла.
Пример результата:
const logo = "data:image/png;base64,iVBORw0KGgoAAAANS...";
При отключённом инлайнинге или превышении лимита происходит генерация файлов:
dist/
assets/
logo-a1b2c3.png
Импорт становится строкой:
const logo = "/assets/logo-a1b2c3.png";
Rollup не выполняет оптимизацию изображений сам по себе. Используются дополнительные плагины:
rollup-plugin-imagemin — сжатие PNG/JPEG/SVGПример подключения:
import { imagemin } fr om 'rollup-plugin-imagemin';
imagemin({
plugins: [
require('imagemin-pngquant')(),
require('imagemin-mozjpeg')({ quality: 75 })
]
});
SVG может обрабатываться тремя способами:
import icon from './icon.svg';
Результат — строка URL.
При отключении emitFiles:
url({
include: ['**/*.svg'],
lim it: Infinity
});
SVG становится строкой:
const icon = "<svg xmlns=...>...</svg>";
Используется плагин:
@svgr/rollupimport svgr fr om '@svgr/rollup';
export default {
plugins: [svgr()]
};
Использование:
import Icon from './icon.svg';
export default () => <Icon />;
Шрифты требуют особого подхода из-за CSS-интеграции.
.woff.woff2.ttf.otfШрифты обрабатываются аналогично изображениям:
url({
include: ['**/*.woff', '**/*.woff2', '**/*.ttf'],
lim it: 0,
fileName: 'fonts/[name]-[hash][extname]'
});
Наиболее распространённый сценарий:
@font-face {
font-family: "Inter";
src: url("./fonts/Inter-Regular.woff2") format("woff2"),
url("./fonts/Inter-Regular.woff") format("woff");
font-weight: 400;
font-style: normal;
}
Далее CSS подключается через:
rollup-plugin-postcssnpm install rollup-plugin-postcss -D
Конфигурация:
import postcss from 'rollup-plugin-postcss';
postcss({
extract: true,
minimize: true
});
Особенности:
Рекомендуемая структура:
src/
assets/
images/
fonts/
icons/
Сборка:
dist/
assets/
images/
fonts/
Для предотвращения кеширования используется [hash]:
fileName: '[name]-[hash][extname]'
Результат:
logo-8f3a91.png
Inter-4c9d2b.woff2
При размещении сборки на CDN или подкаталоге важно корректно задать базовый путь:
output: {
dir: 'dist',
format: 'esm',
assetFileNames: 'assets/[name]-[hash][extname]',
entryFileNames: 'js/[name]-[hash].js',
chunkFileNames: 'js/[name]-[hash].js'
}
Дополнительно может использоваться:
url({
publicPath: 'https://cdn.example.com/'
});
Для статических файлов применяется:
rollup-plugin-copynpm install rollup-plugin-copy -D
import copy from 'rollup-plugin-copy';
copy({
targets: [
{ src: 'public/fonts/*', dest: 'dist/fonts' }
]
});
Некоторые плагины позволяют импортировать ассеты как строки:
import template from './template.html';
Аналогично можно обрабатывать изображения как текстовые ресурсы при кастомных загрузчиках.
Причина — отсутствие fileName или
publicPath.
Возникает при:
Причины:
images/fonts/Ассеты выносятся на отдельный домен:
publicPath: 'https://cdn.site.com/assets/'
woff2Rollup часто используется как часть более сложных систем:
В таких сценариях изображения и шрифты:
Для корректного импорта ассетов используются декларации:
declare module '*.png' {
const src: string;
export default src;
}
declare module '*.woff2' {
const src: string;
export default src;
}
import logo from './logo.png';
Возвращает строку URL.
const logo = require('./logo.png');
Поведение зависит от плагина и транспиляции.
Ассеты обычно инлайнуются или копируются в отдельную директорию с относительными ссылками.