Динамические импорты в формате import() позволяют
загружать модули на лету, разделяя приложение на чанки. В стандартной
сборке Rollup подобные выражения требуют статического анализа, поскольку
сборщик должен заранее понимать структуру графа зависимостей. Однако на
практике часто встречаются конструкции, где путь к модулю формируется
динамически — через шаблонные строки, переменные или параметры
функций.
Проблема возникает в момент, когда Rollup не может определить конкретный файл на этапе анализа:
const module = await import(`./modules/${name}.js`);
Без дополнительной обработки такой код считается недетерминированным, и Rollup не способен построить корректное разбиение на чанки.
Плагин @rollup/plugin-dynamic-import-vars расширяет
возможности Rollup по анализу динамических импортов, где путь к модулю
содержит переменные части. Основная задача — преобразование шаблонных
выражений в набор потенциально возможных импортов, чтобы сборщик мог
включить их в граф зависимостей.
Ключевая идея заключается в том, что динамический импорт перестаёт быть полностью произвольным и ограничивается предсказуемым множеством файлов, вычисляемым на этапе сборки.
Плагин анализирует вызовы import() и ищет конструкции
вида:
${}Пример исходного кода:
const page = await import(`./pages/${pageName}.js`);
После обработки Rollup получает набор возможных модулей:
./pages/home.js
./pages/about.js
./pages/contact.js
и формирует соответствующие чанки заранее.
Поддерживаются только предсказуемые шаблоны. Следующие случаи считаются некорректными для статического анализа:
Пример неподдерживаемого кода:
const module = await import(`./${getPath()}.js`);
или
const module = await import(`./${a + b + c}.js`);
В таких случаях Rollup не может построить карту зависимостей, и поведение становится неопределённым.
Подключение осуществляется через конфигурационный файл Rollup:
import dynamicImportVars from '@rollup/plugin-dynamic-import-vars';
export default {
input: 'src/index.js',
output: {
format: 'esm',
dir: 'dist'
},
plugins: [
dynamicImportVars()
]
};
Плагин не требует обязательных параметров, однако может быть настроен через опции для уточнения поведения анализа.
warnOnError — управление поведением при невозможности
разрешить импортinclude — ограничение файлов, к которым применяется
трансформацияexclude — исключение отдельных модулей из
обработкиПример:
dynamicImportVars({
warnOnError: true,
include: 'src/**',
exclude: 'src/vendor/**'
});
Наиболее распространённый сценарий использования — маршрутизация модулей по имени файла.
export async function loadView(view) {
return import(`./views/${view}.js`);
}
Плагин преобразует подобные выражения в набор статически известных импортов. Это позволяет Rollup:
Допускается ограниченная форма условных выражений, если они не нарушают статическую природу анализа.
const module = await import(
condition
? `./features/featureA.js`
: `./features/featureB.js`
);
В этом случае Rollup строит две ветки зависимостей и включает оба модуля в сборку, несмотря на то, что на этапе выполнения используется только один из них.
Плагин напрямую влияет на механизм разделения кода. Rollup использует результат анализа для формирования отдельных чанков:
Это позволяет строить более предсказуемую архитектуру загрузки приложения.
Часто используется паттерн с модульной структурой папок:
/features
auth.js
profile.js
dashboard.js
Код:
export async function loadFeature(name) {
return import(`./features/${name}.js`);
}
Плагин интерпретирует папку как ограниченное пространство возможных значений и формирует список доступных модулей на этапе анализа файловой системы проекта.
Если выражение импорта невозможно разрешить, возможны два сценария:
Выбор зависит от конфигурации и строгих режимов Rollup. В режиме предупреждений сборка продолжается, но потенциально отсутствующие модули могут привести к ошибкам выполнения.
@rollup/plugin-dynamic-import-vars часто используется
совместно с:
При этом важно учитывать порядок применения: анализ динамических импортов должен происходить после трансформаций синтаксиса, но до финального резолва зависимостей.
В итоговой сборке динамические импорты остаются асинхронными точками разделения:
import("./chunk.js").then(...)
или
const mod = await import("./chunk.js");
Rollup гарантирует, что каждый потенциальный модуль будет включён в итоговую структуру чанков и доступен во время выполнения.
Tree-shaking внутри динамически загружаемых модулей работает независимо от основного графа. Однако сам факт наличия динамического импорта означает:
Использование анализа динамических импортов увеличивает нагрузку на этап построения графа зависимостей:
При больших проектах с множеством динамических маршрутов это может заметно увеличивать время сборки.
Чаще всего плагин применяется в следующих структурах:
Во всех случаях ключевая цель — сохранить динамику загрузки при сохранении статической сборочной модели Rollup.