Механизм import.meta.glob в Vite предоставляет способ
пакетного импорта файлов по шаблону пути с последующей обработкой на
этапе сборки. Поведение по умолчанию ориентировано на ленивую загрузку:
каждый найденный модуль представляется функцией, возвращающей
динамический import(). Однако в ряде сценариев требуется
противоположная модель — немедленная (eager) загрузка всех модулей в
момент сборки.
Eager-загрузка включается через опцию eager: true,
которая изменяет семантику результата glob-импорта и переводит его из
ленивого режима в статически проинлайненный набор импортов.
Конструкция import.meta.glob принимает строку-шаблон и
возвращает объект соответствий:
const modules = import.meta.glob('./modules/*.js');
В стандартном режиме значение modules имеет следующий
вид:
{
'./modules/a.js': () => import('./modules/a.js'),
'./modules/b.js': () => import('./modules/b.js')
}
Каждое значение — функция, инициирующая динамический импорт при вызове.
При включении eager: true Vite заменяет динамические
функции на уже загруженные модули:
const modules = import.meta.glob('./modules/*.js', { eager: true });
Результирующая структура:
{
'./modules/a.js': ModuleA,
'./modules/b.js': ModuleB
}
Каждый модуль импортируется на этапе сборки и сразу включается в бандл, без отложенного выполнения.
Поведение glob-импорта принципиально зависит от режима:
() => import(...)Eager-режим фактически трансформирует glob-выражение в набор статических импортов:
import * as A from './modules/a.js';
import * as B from './modules/b.js';
const modules = {
'./modules/a.js': A,
'./modules/b.js': B
};
Таким образом устраняется необходимость асинхронного разрешения модулей в рантайме.
import: 'default' вместе с eagerVite позволяет комбинировать eager-загрузку с извлечением конкретного экспорта:
const modules = import.meta.glob('./modules/*.js', {
eager: true,
import: 'default'
});
Результат:
{
'./modules/a.js': ADefaultExport,
'./modules/b.js': BDefaultExport
}
Каждый модуль возвращает только указанный экспорт, что уменьшает объем обрабатываемых данных.
Glob-паттерны могут ограничивать набор импортируемых файлов, а eager-режим распространяется только на выбранные результаты:
const pages = import.meta.glob('./pages/**/*.js', {
eager: true
});
В результате в память загружаются все модули, соответствующие глубокой структуре каталогов.
Eager-загрузка применяется не только к JavaScript-модулям, но и к поддерживаемым Vite типам ресурсов:
const data = import.meta.glob('./data/*.json', {
eager: true,
import: 'default'
});
Каждый JSON-файл преобразуется в объект на этапе сборки, исключая необходимость асинхронного парсинга через динамический импорт.
Eager-режим напрямую влияет на стратегию бандлинга:
Vite при этом выполняет предобработку glob-выражения во время билда, инлайнит импорты и формирует статическую графовую структуру зависимостей.
Eager-загрузка используется в случаях, где структура модулей заранее известна и не требует ленивой подгрузки:
При использовании eager-режима Vite сохраняет ключи объекта как строковые пути:
{
'./modules/a.js': ...
}
Это позволяет сохранять связь между исходным файлом и импортированным содержимым, что удобно для построения индексных структур и систем регистрации.
В SSR-среде eager-загрузка приводит к немедленному выполнению всех импортов на сервере. Это может быть критично при большом количестве модулей, так как увеличивает время инициализации запроса.
При этом структура данных остаётся синхронной, что упрощает доступ к зависимостям без ожидания асинхронных операций.
Эквивалент eager-glob можно выразить вручную:
import A from './modules/a.js';
import B from './modules/b.js';
const modules = { A, B };
Однако glob-импорт устраняет необходимость поддерживать список импортов вручную и автоматически масштабируется при добавлении файлов.
Эти свойства делают eager-режим специализированным инструментом, а не универсальной стратегией загрузки.