Ошибки и предупреждения в Rollup формируют отдельный слой API, через который система сборки сообщает о проблемах разного уровня критичности: от фатальных ошибок компиляции до некритичных, но потенциально опасных предупреждений о неоднозначностях в графе модулей, отсутствии экспортов или неиспользуемом коде. Корректная обработка этих сообщений критична для стабильных CI/CD процессов, автоматических сборок и кастомных плагинов.
Внутри Rollup различаются два основных класса проблем:
Фатальные ошибки (Errors) Прерывают процесс сборки и приводят к выбросу исключения. Обычно возникают при:
Предупреждения (Warnings) Не останавливают сборку, но сигнализируют о потенциальных проблемах:
Разделение на эти категории является фундаментом API обработки ошибок.
При программном использовании Rollup API (rollup.rollup,
bundle.generate, bundle.write) фатальные
ошибки перехватываются стандартным механизмом исключений:
import { rollup } from 'rollup';
try {
const bundle = await rollup({
input: 'src/index.js'
});
await bundle.write({
file: 'dist/bundle.js',
format: 'esm'
});
await bundle.close();
} catch (err) {
console.error('Ошибка сборки:', err);
}
Объект ошибки обычно имеет расширенную структуру:
code — машинный идентификатор типа ошибкиmessage — человекочитаемое описаниеplugin — имя плагина, если ошибка возникла в нёмloc — позиция в коде (если применимо)frame — контекст кода вокруг ошибкиstack — стек вызововRollup использует расширенный тип ошибок, совместимый с
Error, но дополненный полями диагностики:
code: string — стабильный идентификатор (например
UNRESOLVED_IMPORT)id: string | null — модуль, в котором возникла
ошибкаpos: number — позиция в файлеplugin: string | undefined — источник ошибкиwatchFiles: string[] — файлы, влияющие на ошибку в
watch-режимеТакая структура позволяет интегрировать Rollup с системами логирования и IDE-подсветкой.
Предупреждения обрабатываются через опцию onwarn,
которая принимает функцию-обработчик:
import { rollup } from 'rollup';
const bundle = await rollup({
input: 'src/index.js',
onwarn(warning, warn) {
console.log('WARNING:', warning.code, warning.message);
warn(warning);
}
});
Параметр warning имеет структуру:
code — тип предупрежденияmessage — текстloc — позиция в исходникеframe — контекстid — файлplugin — источникФункция warn() — стандартный обработчик Rollup, который
выводит предупреждение в консоль или передаёт его дальше в систему
логирования.
Одно из распространённых применений onwarn — подавление
шумных предупреждений:
onwarn(warning, warn) {
if (warning.code === 'CIRCULAR_DEPENDENCY') return;
if (warning.code === 'UNUSED_EXTERNAL_IMPORT') return;
warn(warning);
}
Такой подход используется в крупных проектах, где часть предупреждений считается допустимой особенностью архитектуры.
В некоторых сборочных пайплайнах предупреждения переводятся в ошибки:
onwarn(warning) {
throw new Error(`${warning.code}: ${warning.message}`);
}
Это часто применяется в строгих CI-сборках, где требуется нулевой уровень предупреждений.
Плагины Rollup могут самостоятельно генерировать предупреждения через
this.warn:
export default function myPlugin() {
return {
name: 'my-plugin',
transform(code, id) {
if (code.includes('eval(')) {
this.warn({
code: 'EVAL_USAGE',
message: 'Использование eval нежелательно',
id
});
}
return null;
}
};
}
Это позволяет плагинам интегрироваться в общий механизм диагностики без прерывания сборки.
Если плагин выбрасывает исключение, Rollup оборачивает его в структурированную ошибку:
export default function plugin() {
return {
name: 'broken-plugin',
resolveId() {
throw new Error('resolveId failure');
}
};
}
Такие ошибки становятся частью графа сборки и могут содержать
plugin и hook:
hook — имя жизненного цикла (resolveId,
load, transform)plugin — источникRollup полностью поддерживает async/await в хуках, и ошибки внутри async-кода автоматически прокидываются:
async transform(code) {
const data = await fetchSomething();
if (!data) {
throw new Error('No data');
}
return code;
}
Любое исключение превращается в RollupError и передаётся в систему обработки.
При использовании rollup.watch ошибки не останавливают
процесс, а передаются через события:
import { watch } from 'rollup';
const watcher = watch({
input: 'src/index.js',
output: {
dir: 'dist',
format: 'esm'
}
});
watcher.on('event', event => {
if (event.code === 'ERROR') {
console.error('WATCH ERROR:', event.error);
}
});
Основные события:
START — запускBUNDLE_START — начало сборкиBUNDLE_END — завершениеERROR — ошибкаEND — завершение циклаВ watch-режиме ошибки дополнительно содержат контекст сборки:
watchFiles — список отслеживаемых файловcode — тип ошибкиmessage — текстstack — стекЭто позволяет реализовать устойчивые dev-серверы с горячей перезагрузкой.
Rollup использует стабильные warning.code, которые не
зависят от текста сообщения. Это позволяет писать устойчивые
фильтры:
CIRCULAR_DEPENDENCYTHIS_IS_UNDEFINEDUNRESOLVED_IMPORTEMPTY_BUNDLEMISSING_EXPORTИспользование кодов вместо строковых сравнений критично для поддержки разных версий Rollup.
На практике обработка ошибок часто интегрируется с внешними системами:
onwarn(warning) {
logger.log({
level: 'warn',
code: warning.code,
message: warning.message,
module: warning.id
});
}
Такой подход позволяет централизовать диагностику сборки и связывать её с системой мониторинга.
Плагин может явно остановить сборку:
this.error({
code: 'INVALID_CONFIG',
message: 'Некорректная конфигурация модуля',
id
});
this.error всегда прерывает процесс и не может быть
проигнорирован через onwarn.
this.warn — сигнал, не влияющий на поток сборкиthis.error — немедленное прерываниеthrow new Error — низкоуровневое исключение,
преобразуемое Rollup в структурированную ошибкуЭти механизмы формируют единый слой диагностики.
При ошибках разрешения модулей Rollup частично сохраняет граф, что позволяет:
Ошибки становятся частью состояния графа, а не просто выбросом исключения.
Rollup старается максимально точно локализовать проблему:
loc содержит строку и колонкуframe показывает контекст кода с подсветкой строкиЭто используется для интеграции с терминалами и IDE.
В современных версиях Rollup вводится расширенная логика логирования
через единый канал событий, где warnings и errors могут
маршрутизироваться в пользовательские обработчики, объединяя ранее
разрозненные механизмы onwarn и plugin logging hooks в
единую систему трассировки сборки.