options hook в плагинной системе Rollup является одним из самых ранних этапов жизненного цикла сборки, через который проходит конфигурация до начала фактического анализа модулей и построения графа зависимостей. На этом этапе Rollup уже сформировал базовую структуру параметров сборки, но ещё не приступил к разрешению входных модулей и не начал обработку плагинов, работающих с кодом.
Хук options вызывается самым первым среди всех плагинных хуков. Он срабатывает до:
Это делает его ключевым местом для вмешательства в конфигурацию сборки до того, как она станет фиксированной.
Важно учитывать, что на этом этапе:
options работает исключительно с конфигурационным объектом.
Хук получает объект настроек сборки, который уже объединяет пользовательскую конфигурацию и предобработанные значения Rollup.
Типичная форма:
export default function myPlugin() {
return {
name: 'my-plugin',
options(inputOptions) {
return inputOptions;
}
};
}
Аргумент inputOptions содержит:
Хук может вернуть:
Основная задача options — вмешательство в конфигурацию до её фиксации. Это может включать:
options(inputOptions) {
return {
...inputOptions,
input: {
main: 'src/index.js',
admin: 'src/admin.js'
}
};
}
В этом случае сборка становится мульти-энтри, даже если пользователь указал один вход.
options(inputOptions) {
return {
...inputOptions,
plugins: [
...inputOptions.plugins,
myInjectedPlugin()
]
};
}
Это позволяет динамически расширять pipeline обработки.
options(inputOptions) {
return {
...inputOptions,
treeshake: {
moduleSideEffects: false,
propertyReadSideEffects: false
}
};
}
На этом уровне изменения ещё не влияют на граф, но определяют стратегию оптимизации.
options может быть асинхронным:
options: async (inputOptions) => {
const config = await loadExternalConfig();
return {
...inputOptions,
external: config.external
};
}
Это делает возможным:
Однако любое замедление здесь напрямую увеличивает время старта сборки, поскольку дальнейшие этапы блокируются.
Если несколько плагинов реализуют options, они выполняются последовательно в порядке подключения.
Пример цепочки:
plugins: [
pluginA(),
pluginB(),
pluginC()
]
Порядок выполнения:
Каждый следующий плагин получает результат предыдущего.
options(inputOptions) {
const modified = pluginA(inputOptions);
return pluginB(modified);
}
Это означает, что порядок подключения плагинов критически влияет на итоговую конфигурацию.
options влияет на всю дальнейшую сборку, поскольку изменяет базовые параметры, используемые Rollup при инициализации:
Ошибки на этом этапе часто проявляются позже, в виде:
Хотя Rollup допускает возврат модифицированного объекта, прямое изменение входного аргумента может привести к трудноотлаживаемым эффектам.
Непредсказуемый вариант:
options(inputOptions) {
inputOptions.input = 'src/new-entry.js';
return inputOptions;
}
Более стабильный подход:
options(inputOptions) {
return {
...inputOptions,
input: 'src/new-entry.js'
};
}
Иммутабельный стиль снижает риск конфликтов между плагинами.
options(inputOptions) {
if (process.env.BUILD_TARGET === 'legacy') {
return {
...inputOptions,
treeshake: false
};
}
return inputOptions;
}
options(inputOptions) {
const entries = Array.isArray(inputOptions.input)
? inputOptions.input
: [inputOptions.input];
return {
...inputOptions,
input: [
...entries,
'src/polyfills.js'
]
};
}
options(inputOptions) {
return {
...inputOptions,
external: (id) => {
return id.startsWith('node:') || id === 'fs';
}
};
}
На этапе options граф ещё не существует, поэтому любые попытки анализа зависимостей невозможны.
Любые операции с файловой системой или сетью увеличивают время старта сборки и могут приводить к нестабильности CI.
Если плагины добавляются без учёта порядка, возможны конфликты lifecycle-хуков.
Полная замена объекта без spread-оператора приводит к потере важных параметров:
options() {
return {
input: 'src/index.js'
};
}
Такой код уничтожает остальные настройки сборки.
Хотя options и buildStart часто используются вместе, их роли различаются:
options влияет на структуру сборки, buildStart — на поведение внутри неё.
Если хук не возвращает значение, Rollup продолжает использовать текущую конфигурацию без изменений. Это позволяет реализовывать плагины, которые лишь наблюдают за конфигурацией без её модификации.
options(inputOptions) {
console.log('input:', inputOptions);
}
Такой подход безопасен, если не требуется вмешательство в сборку.
В крупных системах options часто используется как точка агрегации конфигурации:
В таких случаях options становится центральным механизмом нормализации конфигурации перед запуском сборки.