Система разрешения модулей в Rollup определяет, каким образом строки
импорта преобразуются в реальные файлы и модули, участвующие в графе
зависимостей. На этом этапе формируется структура всего бандла, и именно
здесь задаётся, как интерпретируются пути, алиасы, пакеты из
node_modules и виртуальные модули плагинов. Поля
resolve и context относятся к базовой
конфигурации механизма загрузки модулей и влияют на стабильность и
предсказуемость сборки.
contextПоле context задаёт значение this для всех
модулей, обрабатываемых Rollup в рамках бандла. Оно определяет
глобальный контекст исполнения, который используется при оборачивании
модулей в функцию.
По умолчанию Rollup использует значение:
this === undefined
в строгом режиме (strict mode), что соответствует
поведению ES-модулей.
contextИзменение context требуется в случаях, когда код
рассчитан на определённую среду выполнения и использует неявный
this.
Пример конфигурации:
export default {
context: 'window'
};
В этом случае каждый модуль будет обёрнут так, что this
указывает на глобальный объект браузера.
Некоторые старые библиотеки, особенно написанные до широкого
распространения ES-модулей, полагаются на глобальный this.
Например:
this вместо windowthisПри стандартном поведении Rollup такие конструкции могут ломаться,
поэтому изменение context становится способом обеспечить
совместимость без переписывания исходного кода.
Значение context применяется на этапе генерации кода, а
не на этапе анализа. Это означает:
При этом context не влияет на:
resolveВ конфигурации Rollup напрямую отсутствует базовое поле
resolve, однако термин используется для описания всей
подсистемы разрешения модулей, которая формируется через плагины, прежде
всего через @rollup/plugin-node-resolve.
Фактически resolve в контексте Rollup — это
концептуальный слой, определяющий стратегию поиска модулей по строкам
импортов.
Каждый импорт проходит через несколько этапов:
@rollup/plugin-node-resolveОсновной инструмент, реализующий поведение resolve, —
плагин Node Resolve:
import resolve from '@rollup/plugin-node-resolve';
export default {
plugins: [
resolve()
]
};
Он добавляет поддержку:
node_modulesexports в package.json.js, .json,
.tsПри обработке импорта Rollup и плагины следуют строгой иерархии:
Если плагин возвращает модуль как виртуальный (id с
собственным содержимым), он имеет приоритет над файловой системой.
Если используется плагин alias, например:
import alias from '@rollup/plugin-alias';
alias({
entries: [
{ find: '@', replacement: './src' }
]
});
строка импорта преобразуется до этапа файлового поиска.
node_modulesПлагин node-resolve ищет:
package.jsonmodulemainexports (если включено)Обрабатываются напрямую через файловую систему:
import x from './utils.js';
context
и влияние на resolutionХотя context напрямую не связан с разрешением модулей,
он косвенно влияет на runtime-ожидания кода.
В частности:
this, могут ожидать
наличие глобальных объектовОднако сам процесс resolve остаётся неизменным.
Плагины могут полностью переопределять механизм разрешения через
resolveId.
Пример:
export default function myResolver() {
return {
resolveId(source) {
if (source === 'virtual-module') {
return source;
}
return null;
}
};
}
Возвращаемое значение resolveId определяет:
null, если нужно передать управление следующему
плагинуRollup активно кеширует результаты resolution:
idОшибки в resolution часто связаны с:
resolveIdnode-resolveПлагин поддерживает несколько режимов:
browserИспользуется для фронтенда:
browser field в package.jsonmoduleПриоритет ES модулей:
modulemainFallback:
maincontext в связке с форматами выводаРазные форматы бандла могут по-разному интерпретировать
this:
esm — this всегда
undefinedcjs — зависит от обёрткиiife — может указывать на window или
globalПри этом context задаёт начальную точку поведения, но
итог зависит от формата вывода.
Возникает при:
При использовании нескольких node_modules уровней
exportsСовременные пакеты могут ограничивать доступ к внутренним путям через
exports, что ломает старые схемы resolution
Resolution напрямую влияет на tree-shaking:
resolveId позволяет точно сопоставить
зависимостиid считаются разными модулями даже при
одинаковом содержимомХотя context выглядит как второстепенная настройка, он
формирует фундамент модели исполнения:
this внутри модулейВ связке с resolution он участвует в формировании финальной среды, в которой будет работать собранный код.