В архитектуре Rollup плагины работают через единый объект контекста,
который передаётся в хуки и предоставляет набор служебных методов. Среди
них особое значение имеют механизмы диагностики — this.warn
и this.error, через которые формируется обратная связь о
проблемах во время сборки. Эти методы не просто выводят сообщения, а
интегрируются в систему логирования и управления процессом
бандлинга.
thisВ хуках Rollup (например, resolveId, load,
transform, generateBundle) значение
this указывает на PluginContext. Именно этот
объект предоставляет доступ к:
warn, error,
info)emitFile)getModuleInfo,
getModuleIds)Важно, что this.warn и this.error доступны
только в контексте выполнения плагина. Вне хуков они недоступны и не
могут быть вызваны.
this.warn:
предупреждения без остановки сборкиМетод this.warn используется для сигнализации о
потенциальной проблеме, которая не препятствует продолжению сборки.
onLogonwarnthis.warn(messageOrWarning);
Где messageOrWarning может быть:
export default function myPlugin() {
return {
name: 'my-plugin',
transform(code, id) {
if (code.includes('eval(')) {
this.warn(`Использование eval в модуле ${id} нежелательно`);
}
return code;
}
};
}
В этом случае сборка продолжится, но разработчик получит сигнал о потенциально опасной конструкции.
Rollup позволяет передавать структурированные предупреждения:
this.warn({
message: 'Неиспользуемая переменная',
code: 'UNUSED_VARIABLE',
id,
frame: code.slice(0, 100),
loc: {
file: id,
line: 10,
column: 5
}
});
Такой формат используется для более точной диагностики, особенно в плагинах, которые анализируют AST или выполняют статический анализ кода.
onwarnRollup позволяет централизованно обрабатывать предупреждения:
export default {
onwarn(warning, warn) {
if (warning.code === 'CIRCULAR_DEPENDENCY') return;
warn(warning);
}
};
Таким образом this.warn становится частью общей системы
контроля качества сборки, а не просто выводом сообщений.
this.warneval,
new Function)this.error:
остановка сборки с исключениемВ отличие от предупреждений, this.error предназначен для
критических ситуаций, при которых продолжение сборки невозможно или
недопустимо.
this.error(messageOrError);
export default function myPlugin() {
return {
name: 'my-plugin',
load(id) {
if (id.includes('forbidden')) {
this.error(`Импорт запрещён: ${id}`);
}
}
};
}
При попадании в условие сборка немедленно остановится.
this.error({
message: 'Синтаксическая ошибка в конфигурации',
id,
frame: code,
loc: {
line: 22,
column: 8
}
});
Такой формат полезен для интеграции с редакторами и инструментами анализа кода.
throw и this.errorВнутри плагина можно использовать обычный throw, однако
this.error предпочтительнее:
throw new Error()this.error()id, plugin и позициюПосле вызова this.error выполнение текущего хука
прекращается:
transform(code, id) {
this.error('Ошибка');
return code; // этот код никогда не выполнится
}
Это важно учитывать при проектировании логики плагина.
Rollup старается обогащать ошибки информацией о модуле:
id — путь к файлуplugin — имя плагинаframe — фрагмент исходного кодаloc — позиция в файлеЭто делает this.error ключевым инструментом диагностики
в сложных сборках.
warn и
errorНа практике оба метода используются совместно:
transform(code, id) {
if (code.includes('console.log')) {
this.warn({
message: 'Найден console.log',
id
});
}
if (!code.includes('export')) {
this.error({
message: 'Модуль должен содержать export',
id
});
}
return code;
}
Здесь предупреждение сигнализирует о стиле кода, а ошибка блокирует некорректный модуль.
this.warn и this.error могут использоваться
практически во всех этапах:
buildStartresolveIdloadtransformgenerateBundlewriteBundleОднако в фазе генерации бандла ошибки становятся особенно критичными, так как сборка уже почти завершена.
В архитектуре плагинов принято разделять:
Такое разделение позволяет:
В асинхронных функциях:
async transform(code, id) {
const data = await check(code);
if (!data.valid) {
this.error('Некорректный модуль');
}
}
this.error корректно прерывает асинхронный pipeline,
Rollup обрабатывает это как отказ от продолжения текущего модуля.
Важно учитывать:
this.warn и this.error недоступны вне
плагинаthis и использовать позжеRollup агрегирует все предупреждения и ошибки:
--silent,
--watch)Таким образом, вызовы this.warn и
this.error напрямую формируют пользовательский опыт
диагностики сборки.