Процесс сборки в Rollup представляет собой строго организованный
конвейер, в котором плагины получают доступ к различным этапам
трансформации модулей и формирования итогового бандла. Среди ключевых
точек расширения находятся хуки buildStart и
buildEnd, которые охватывают начало и завершение процесса
сборки и позволяют вмешиваться в глобальную фазу жизненного цикла
сборщика, а не в обработку отдельных модулей.
Эти хуки относятся к этапу bundle lifecycle hooks, то есть они не привязаны к конкретному модулю, а работают на уровне всей сборки.
Хук buildStart вызывается один раз перед тем, как Rollup
начинает разрешение входных точек и построение графа зависимостей. На
этом этапе еще отсутствует информация о модулях, и сборка фактически
находится в состоянии инициализации.
Хук может быть синхронным или асинхронным:
buildStart(options)
Параметр options содержит конфигурацию Rollup, включая
входные точки, плагины, режимы кэширования и другие параметры
сборки.
Внутри buildStart доступен контекст плагина
(this), который позволяет:
this.warn и
this.errorthis.cacheОднако доступ к модульному графу отсутствует, так как он еще не построен.
Хук используется для подготовки окружения перед началом анализа зависимостей.
Типичные сценарии применения:
Если buildStart возвращает Promise, Rollup
приостанавливает дальнейшую сборку до его завершения. Это важно для
плагинов, которым требуется загрузка внешних данных до начала построения
графа модулей.
Пример:
export default function examplePlugin() {
return {
async buildStart(options) {
this.data = await fetchConfigFromRemoteService();
}
};
}
Асинхронные операции в buildStart влияют на весь процесс
сборки, так как блокируют переход к резолвингу модулей.
На этапе выполнения хука:
this.getModuleInfo
недоступен)Фактически buildStart работает только с глобальным
состоянием сборки, а не с содержимым проекта.
Хук buildEnd вызывается после завершения всех этапов
построения бандла, но до полного завершения процесса Rollup. Он
выполняется независимо от того, завершилась ли сборка успешно или
произошла ошибка.
buildEnd(error)
Параметр error содержит объект ошибки, если процесс
сборки завершился неудачно. В случае успешной сборки значение будет
null или undefined.
Одной из ключевых особенностей buildEnd является его
выполнение даже при наличии ошибки в процессе сборки. Это делает его
удобным для:
Важно учитывать, что после критических ошибок часть данных может быть неполной или отсутствовать.
Хук используется для финализации процесса сборки и выполнения завершающих операций:
buildEnd также поддерживает асинхронность. Если
возвращается Promise, Rollup дождется его завершения перед окончательным
завершением процесса.
export default function plugin() {
return {
async buildEnd(error) {
await writeBuildReport({
success: !error,
error: error?.message
});
}
};
}
Это позволяет гарантировать, что финальные операции, такие как запись отчетов или отправка аналитики, будут завершены.
Внутри buildEnd доступен тот же плагин-контекст, что и в
других hook-функциях:
this.emitFile может быть недоступен или не имеет смысла
на финальной стадииthis.meta для получения информации о
сборкеЭти два хука формируют логическую пару, ограничивающую жизненный цикл сборки:
buildStart — точка входа в процесс сборкиbuildEnd — точка выхода из процесса сборкиОни не влияют напрямую на трансформацию модулей, но задают рамки, внутри которых происходит вся работа Rollup.
Часто используется для открытия и закрытия внешних соединений:
export default function plugin() {
let connection;
return {
async buildStart() {
connection = await createConnection();
},
async buildEnd() {
await connection.close();
}
};
}
export default function metricsPlugin() {
const startTime = Date.now();
return {
buildStart() {
this.startTime = startTime;
},
buildEnd(error) {
const duration = Date.now() - this.startTime;
report({
duration,
success: !error
});
}
};
}
buildStart часто используется для ранней проверки
конфигурации, чтобы не запускать дорогостоящую сборку при некорректных
параметрах.
buildStart(options) {
if (!options.input) {
this.error('Отсутствует входная точка');
}
}
Хуки buildStart и buildEnd располагаются
вне основного потока обработки модулей:
buildStart выполняется до resolveId,
load, transformbuildEnd выполняется после генерации бандла
(generateBundle, writeBundle) и завершения
всех операций сборкиОни служат внешними границами всего pipeline.
buildStart вызывается один раз на каждую сборкуbuildEnd вызывается один раз независимо от
результатаbuildStart могут прервать сборку до начала
построения графаbuildEnd гарантированно выполняется даже при ошибке
сборкиИспользование этих хуков требует учета того, что:
buildStartbuildEnd при
ошибкахbuildStart увеличивают время
старта сборкиbuildEnd увеличивают общее время
завершения процесса