В системе плагинов Rollup стадия рендеринга отделена от стадии
построения графа модулей и разрешения зависимостей. После того как
сформирован module graph, выполнены все трансформации и оптимизации,
Rollup переходит к этапу генерации выходного кода. Именно здесь начинают
работать хуки renderStart и renderChunk,
которые относятся к финальной фазе сборки и ориентированы на управление
процессом генерации итогового бандла.
Эти хуки не участвуют в анализе модулей и не влияют на структуру графа зависимостей. Их задача — вмешательство в процесс вывода кода, когда все исходные данные уже зафиксированы.
renderStart:
инициализация этапа генерации чанковХук renderStart вызывается один раз перед началом
генерации чанков. Это точка входа в фазу рендеринга, когда Rollup уже
определил структуру выходных файлов, но еще не начал формировать их
содержимое.
renderStart(outputOptions, inputOptions)
На этом этапе доступны:
outputOptions)inputOptions)Однако отсутствует доступ к конкретным чанкам — они еще не сгенерированы.
renderStartrenderStart часто используется для инициализации
внутренних структур плагина, которые зависят от итоговой конфигурации
сборки:
outputOptionsПлагин может проверять корректность конфигурации вывода:
Если в этот момент выбрасывается ошибка, генерация бандла прекращается до создания файлов.
export default function myPlugin() {
return {
name: 'my-plugin',
renderStart(outputOptions, inputOptions) {
if (outputOptions.format === 'iife' && outputOptions.sourcemap === true) {
throw new Error('Sourcemaps не поддерживаются в данном формате');
}
this.state = {
chunkCount: 0
};
}
};
}
renderStartthisrenderChunk:
трансформация каждого чанкаХук renderChunk вызывается для каждого генерируемого
чанка отдельно. В отличие от renderStart, он работает уже с
конкретным текстом кода и может изменять его перед записью в выходной
файл.
renderChunk(code, chunk, outputOptions)
code — строка с уже сгенерированным кодом чанкаchunk — объект с метаданными чанка (имя, зависимости,
экспортируемые символы)outputOptions — конфигурация выводаrenderChunkRollup вызывает этот хук после:
После выполнения всех плагинов результат может быть:
null (удаление чанка){ code, map } (если изменяется source map)renderChunkХотя обычно минификация делегируется специализированным плагинам,
renderChunk может использоваться для легких
преобразований:
Часто используется для внедрения измерений производительности:
Плагин может изменять экспортируемое поведение модуля на уровне чанка:
renderChunkexport default function debugPlugin() {
return {
name: 'debug-plugin',
renderChunk(code, chunk) {
const wrapped = `
(function() {
console.log('Chunk loaded:', '${chunk.name}');
${code}
})();
`;
return {
code: wrapped,
map: null
};
}
};
}
renderChunkЕсли вернуть null, чанк не попадет в итоговую
сборку:
renderChunk(code, chunk) {
if (chunk.name === 'debug-only') {
return null;
}
}
Это используется для условной генерации кода, например:
renderChunk может возвращать объект с source map:
renderChunk(code) {
const transformed = code.replace('DEBUG', '');
return {
code: transformed,
map: null
};
}
При необходимости плагин может:
renderStart и renderChunkrenderStart — один раз на фазу рендерингаrenderChunk — многократно, для каждого чанкаrenderStart — глобальная конфигурацияrenderChunk — конкретный код и метаданные чанкаrenderStart — только подготовка и валидацияrenderChunk — изменение итогового кодаrenderChunk напрямую влияет на скорость сборки:
По этой причине:
transformТипичный порядок выполнения на этапе генерации:
renderStartrenderChunk (для каждого чанка)generateBundle (если используется)writeBundle (если используется)renderStart и renderChunk часто
используются совместно:
renderStart подготавливает состояниеrenderChunk применяет его к каждому чанкуПример связки:
export default function trackingPlugin() {
return {
name: 'tracking-plugin',
renderStart() {
this.startTime = Date.now();
},
renderChunk(code, chunk) {
const time = Date.now() - this.startTime;
return {
code: `// chunk processed in ${time}ms\n${code}`,
map: null
};
}
};
}
Если несколько плагинов реализуют renderChunk, они
выполняются цепочкой:
nullrenderStart и renderChunk закрывают
pipeline Rollup:
buildStart / resolveId / load
/ transform — подготовка и сборка графаrenderStart — вход в генерациюrenderChunk — постобработка каждого файлаЭта модель делает Rollup предсказуемым на финальной стадии, где важна стабильность результата и контроль над выходным кодом без изменения структуры зависимостей.