В системах сборки на основе Rollup имена выходных файлов ресурсов формируются с учётом стратегии кэширования, разбиения ассетов и предсказуемости сборки. Хеширование имён файлов используется для решения задачи инвалидации кэша в браузере: при изменении содержимого файла его имя меняется, что гарантирует загрузку новой версии ресурса без ручного обновления ссылок и очистки кэша.
Ключевой механизм, который управляет формированием имён файлов в
Rollup, задаётся через параметр output.assetFileNames и
связанные с ним шаблоны. Эти шаблоны позволяют внедрять метаданные о
ресурсе непосредственно в имя файла, включая хеш содержимого.
Хеширование имени файла основано на вычислении контрольной суммы содержимого ресурса. При любом изменении байтов файла хеш меняется, что приводит к изменению итогового имени. Такой подход решает сразу несколько задач:
В контексте фронтенд-сборки это особенно важно для JavaScript-бандлов, CSS, изображений, шрифтов и других ассетов, которые подключаются по URL.
Rollup предоставляет систему токенов для формирования имён выходных файлов. Основные из них:
[name] — исходное имя модуля или файла[extname] — расширение файла[hash] — хеш содержимого[format] — формат вывода (es, cjs и т.д.)Пример конфигурации:
export default {
input: 'src/index.js',
output: {
dir: 'dist',
format: 'es',
assetFileNames: 'assets/[name]-[hash][extname]'
}
};
В этом случае любой ассет (например, изображение или шрифт), импортированный в проект, получит имя вида:
assets/logo-a1b2c3d4.png
Хеш по умолчанию может иметь фиксированную длину, но в Rollup допускается её ограничение:
[name]-[hash:8][extname]
Это позволяет уменьшить длину имени файла без потери уникальности в пределах проекта.
Стабильность хеша зависит от алгоритма, применяемого внутренне Rollup или плагином. Обычно используется контентный хеш, что означает отсутствие изменений имени при пересборке без изменения содержимого.
Помимо ассетов, Rollup формирует чанки JavaScript-кода, и их имена также могут содержать хеш:
output: {
dir: 'dist',
format: 'es',
entryFileNames: 'assets/[name]-[hash].js',
chunkFileNames: 'assets/[name]-[hash].js'
}
Разделение на entryFileNames и
chunkFileNames позволяет независимо управлять именованием
входных точек и динамически загружаемых модулей.
Динамические импорты:
import('./module.js');
приводят к созданию отдельных чанков, которые также получают хешированные имена.
Rollup сам по себе не всегда обрабатывает бинарные ресурсы, поэтому хеширование часто реализуется через плагины.
Плагин инлайнит или копирует файлы в выходную директорию:
import url fr om '@rollup/plugin-url';
export default {
plugins: [
url({
lim it: 0,
fileName: 'assets/[name]-[hash][extname]'
})
]
};
При этом файлы сохраняются с учётом хеша содержимого, что обеспечивает корректную инвалидацию кеша.
В современных конфигурациях Rollup ассеты могут экспортироваться напрямую:
import logo from './logo.png';
console.log(logo);
Значение logo становится строкой URL, содержащей имя
файла с хешем.
Хешированные имена позволяют применять стратегию:
HTTP-заголовки при этом обычно выставляются как:
Cache-Control: public, max-age=31536000, immutable
Такая комбинация делает возможным хранение ресурсов в браузере до одного года без повторных запросов, при условии неизменности имени файла.
В некоторых конфигурациях важно учитывать, что одинаковые имена файлов не должны приводить к коллизиям. Rollup решает это через:
Таким образом, изменение даже одного импортируемого модуля может привести к изменению хеша чанка.
Для повышения эффективности кеширования используется разделение кода:
output: {
manualChunks: {
vendor: ['react', 'react-dom']
}
}
В этом случае vendor-чанк изменяется реже, чем
бизнес-логика приложения, а его хеш остаётся стабильным до изменения
зависимостей.
При использовании rollup-plugin-postcss или аналогичных
решений CSS также может получать хешированные имена:
import postcss from 'rollup-plugin-postcss';
export default {
plugins: [
postcss({
extract: true,
extract: 'assets/styles-[hash].css'
})
]
};
Это позволяет синхронизировать обновления стилей с обновлениями JavaScript-бандла.
Хеш вычисляется на финальном этапе генерации выходных файлов. Это означает, что:
Любое вмешательство в граф модулей меняет итоговые хеши, даже если исходные файлы частично неизменны.
Некоторые факторы могут влиять на стабильность хешей:
Для устранения подобных проблем используется фиксирование версий и минимизация побочных эффектов в плагинах.
При использовании CDN структура:
/assets/app-8f3a91c2.js
/assets/logo-1c9d7b0e.png
позволяет безопасно обновлять ресурсы без риска кеш-конфликтов между версиями приложения. Старые файлы остаются валидными до истечения срока кеша, новые распространяются независимо.
При этом HTML-файл обычно остаётся единственной точкой, которая не хешируется, чтобы сохранять стабильный вход в приложение.
Для автоматической подстановки хешированных имён используется генерация HTML через плагины, например:
rollup-plugin-htmlВ результате ссылки на ресурсы автоматически обновляются:
<script src="/assets/app-8f3a91c2.js"></script>
<link rel="stylesheet" href="/assets/styles-7bd21a9c.css">
Это устраняет необходимость ручного сопровождения путей.