Плагин @rollup/plugin-url предназначен для работы с
файловыми ресурсами внутри сборки Rollup, позволяя импортировать
изображения, шрифты, медиафайлы и другие бинарные данные напрямую в
JavaScript-код. Основная идея заключается в том, чтобы либо инлайнить
файл в виде data URL, либо вынести его в отдельный файл с генерацией
корректного URL для доступа в итоговой сборке.
Подход особенно полезен в современных фронтенд-проектах, где статические ресурсы становятся частью графа зависимостей, а не отдельной системой загрузки через HTML или внешние конфигурации сервера.
Плагин перехватывает import-запросы к файловым ресурсам
и преобразует их в один из двух форматов:
Пример поведения:
import logo fr om './logo.png';
В зависимости от настроек результат может быть:
const logo = "data:image/png;base64,iVBORw0KGgoAAA...";
или
const logo = "/assets/logo.hash.png";
npm install @rollup/plugin-url --save-dev
или
yarn add @rollup/plugin-url -D
import url fr om '@rollup/plugin-url';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
plugins: [
url()
]
};
Без дополнительных настроек плагин будет использовать дефолтное поведение: часть файлов инлайнится, часть копируется в выходной каталог.
Ключевой параметр, определяющий порог инлайнинга.
url({
lim it: 8192
});
Логика:
Если установить limit: 0, инлайнинг отключается
полностью. Если limit: Infinity, все файлы будут
встроены.
Позволяют ограничить набор обрабатываемых файлов.
url({
include: ['**/*.png', '**/*.svg'],
exclude: ['**/icons/*.svg']
});
Используется glob-логика, что делает фильтрацию гибкой и предсказуемой.
Определяет шаблон имени выходного файла.
url({
fileName: 'assets/[name]-[hash][extname]'
});
Поддерживаются плейсхолдеры:
[name] — имя исходного файла[hash] — хеш содержимого[extname] — расширение с точкойЭто важно для кеширования и предотвращения конфликтов имен.
Указывает базовую директорию для относительных путей.
url({
sourceDir: path.join(__dirname, 'src/assets')
});
Позволяет корректно сохранять структуру каталогов в выходной сборке.
Контролирует базовый URL для файлов, вынесенных в сборку.
url({
publicPath: '/static/'
});
В результате:
"/static/logo.png"
Используется при деплое на CDN или отдельный static server.
import img fr om './image.png';
SVG может быть обработан двумя способами:
import icon from './icon.svg';
При инлайне:
const icon = "data:image/svg+xml;base64,...";
import font from './font.woff2';
Чаще всего шрифты выносятся в отдельные файлы, так как их размер превышает лимиты инлайна.
При инлайнинге происходит:
data:[mime];base64,[data]
Этот механизм делает ресурс независимым от файловой системы.
При работе с TypeScript необходимо объявить модули ресурсов:
declare module '*.png' {
const src: string;
export default src;
}
declare module '*.svg' {
const src: string;
export default src;
}
Это позволяет избежать ошибок компиляции при импортировании файлов.
Иконки, логотипы, небольшие изображения:
import icon from './icon.svg';
При маленьком размере инлайнинг уменьшает количество HTTP-запросов.
Изображения, нужные на первом экране, могут быть встроены:
Чаще выносятся в файлы, но иногда инлайнятся для уменьшения задержек FOIT.
Если используются плагины вроде @rollup/plugin-image,
важно учитывать порядок:
url может перехватить импорт раньше@rollup/plugin-url работает до минификации, так как:
При использовании @rollup/plugin-typescript:
url обрабатывает импорт ресурсовПри использовании [hash] важно понимать:
Пример:
url({
fileName: '[name].[hash][extname]'
});
Результат:
logo.a8f3c2.png
Чрезмерный инлайнинг увеличивает размер JS-бандла, что может ухудшить:
Инлайнинг больших файлов:
Автоматическое определение MIME не всегда идеально:
Типичная конфигурация для продакшена:
url({
lim it: 4096,
fileName: 'assets/[name].[hash][extname]',
publicPath: '/static/',
include: ['**/*.{png,jpg,jpeg,svg,woff2}']
});
Такой подход:
@rollup/plugin-url эффективно работает там, где ресурсы
становятся частью графа модулей, а не внешней системой загрузки. Он
позволяет унифицировать работу с файлами, но требует контроля за
балансом между инлайнингом и файловым выводом, поскольку это напрямую
влияет на производительность конечного приложения и структуру
бандла.