В процессе сборки Rollup финальный бандл проходит стадию генерации
выходного кода, где подключаются специальные плагины и формируется
итоговая строка/модули. На этом этапе ключевую роль играют хуки,
позволяющие вмешаться в структуру результирующего файла:
intro, banner, footer,
outro.
Эти хуки относятся к категории output generation hooks и выполняются при создании финального чанка или бандла. Их основная задача — модифицировать текстовое содержимое результата без изменения графа модулей.
При генерации бандла Rollup формирует итоговую структуру примерно в таком порядке:
bannerintrooutrofooterКаждый из этих слоёв представляет собой строковую вставку, которая может быть добавлена в начало или конец итогового файла.
Важно учитывать, что все эти хуки работают на уровне строкового представления чанка и не влияют на структуру модулей, импортов или зависимостей.
banner добавляет текст в самое начало выходного файла,
перед любым сгенерированным кодом Rollup.
Чаще всего используется для:
banner: string | (() => string | Promise<string>)
introexport default {
output: {
banner: '/* Built with Rollup */'
}
};
Функциональный вариант:
export default {
output: {
banner() {
return `/* Build time: ${new Date().toISOString()} */`;
}
}
};
intro вставляет код сразу после banner, но
до основного содержимого бандла.
Используется для:
intro: string | (() => string | Promise<string>)
export default {
output: {
intro: 'const __ENV__ = "production";'
}
};
Функция:
export default {
output: {
intro() {
return 'const start = Date.now();';
}
}
};
banneroutro добавляет код после основного содержимого бандла,
но до footer.
Применяется для:
outro: string | (() => string | Promise<string>)
export default {
output: {
outro: 'console.log("bundle loaded");'
}
};
Функциональный вариант:
export default {
output: {
outro() {
return 'console.log("end of execution");';
}
}
};
introintro для симметричных
конструкцийfooter добавляет код в самый конец выходного файла.
Используется для:
footer: string | (() => string | Promise<string>)
export default {
output: {
footer: '/* End of bundle */'
}
};
Функция:
export default {
output: {
footer() {
return `/* Generated at ${new Date().toISOString()} */`;
}
}
};
Полная структура итогового файла с использованием всех хуков выглядит так:
banner
intro
[сгенерированный Rollup код]
outro
footer
banner и footer — внешние мета-слоиintro и outro — внутренние слои вокруг
логикиВсе четыре хука поддерживают одинаковую модель:
Это позволяет динамически формировать содержимое в зависимости от состояния сборки.
export default {
output: {
banner: async () => {
const version = await fetchVersion();
return `/* version: ${version} */`;
}
}
};
banner — начало файлаfooter — конец файлаintro — подготовка окруженияoutro — завершение выполненияexport default {
output: {
intro: '(function(){',
outro: '})();'
}
};
export default {
output: {
intro: `
const __DEV__ = false;
const __VERSION__ = "1.0.0";
`
}
};
export default {
output: {
banner: '/* library build */',
footer: '/* eof */'
}
};
export default {
output: {
intro: 'console.log("start");',
outro: 'console.log("finish");'
}
};
При использовании минификаторов (Terser, SWC и др.):
Важно учитывать, что строки из banner и
footer могут сохраняться даже в сильно оптимизированных
сборках.
Каждый чанк получает собственные значения этих хуков. Это означает:
banner для разных output
chunksintro и outro могут различаться по логике
для каждого файлаНа уровне плагинов эти хуки могут быть определены через plugin API:
export default function myPlugin() {
return {
name: 'my-plugin',
banner() {
return '/* plugin banner */';
},
intro() {
return 'console.log("intro");';
},
outro() {
return 'console.log("outro");';
},
footer() {
return '/* plugin footer */';
}
};
}
Если несколько плагинов определяют один и тот же хук:
Хуки banner, intro, outro,
footer фактически формируют каркас итогового
JavaScript-файла. Они позволяют: