Glob-импорты представляют собой механизм массового подключения модулей по шаблону пути, основанному на правилах glob. Вместо явного перечисления файлов используется маска, которая описывает группу файлов, подходящих под определённый паттерн.
Основная идея заключается в том, чтобы упростить работу с коллекциями модулей, которые логически относятся к одной области приложения: плагины, роуты, обработчики событий, компоненты интерфейса, конфигурации.
Parcel интерпретирует glob-выражения на этапе сборки и формирует из них единый граф зависимостей, автоматически включая все совпадающие файлы.
В Parcel glob-импорты выглядят как расширение стандартного импорта:
const modules = import.meta.glob('./modules/*.js');
или в более явной форме через динамический импорт:
const modules = import('./modules/*.js');
В результате сборщик анализирует шаблон и находит все файлы,
соответствующие маске ./modules/*.js.
Поддерживаются стандартные glob-символы:
* — любое количество символов в пределах одного
сегмента пути** — рекурсивное совпадение по подкаталогам? — один произвольный символ{a,b} — выбор из нескольких вариантовПример:
import modules from './features/**/index.js';
Такой шаблон захватывает все index.js внутри любых
поддиректорий каталога features.
При сборке Parcel выполняет несколько этапов трансформации glob-выражений:
Разбор выражения импорта
Поиск файлов
Построение графа зависимостей
Генерация кода загрузки
Результат на выходе — обычный JavaScript-код, где glob-импорт заменяется на структуру данных, содержащую ссылки на модули.
Parcel поддерживает два основных режима загрузки glob-модулей.
В ленивом режиме модули не загружаются сразу. Вместо этого создаётся функция, возвращающая динамический импорт:
const modules = import('./pages/*.js');
Использование:
modules['Home.js']().then(m => {
m.render();
});
Каждый модуль загружается только при обращении к нему.
В жадном режиме все модули импортируются сразу и становятся частью итогового бандла:
const modules = import('./pages/*.js?eager');
Результат представляет собой объект:
{
"Home.js": Module,
"About.js": Module
}
Такой подход уменьшает задержки во время выполнения, но увеличивает размер начальной загрузки.
Особое значение имеет рекурсивный glob, позволяющий захватывать целые деревья каталогов:
const modules = import('./components/**/*.js');
Такая запись включает:
components.js модулиParcel строит плоскую карту модулей, где ключами выступают относительные пути.
Результат glob-импорта представляет собой объект, где:
Пример структуры:
{
"./Header.js": Module,
"./Footer.js": Module,
"./ui/Button.js": Module
}
При ленивой загрузке:
{
"./Header.js": () => import('./Header.js'),
"./Footer.js": () => import('./Footer.js')
}
Часто используется для регистрации плагинов:
const plugins = import('./plugins/*.js');
for (const path in plugins) {
plugins[path].init?.();
}
Parcel автоматически включает все новые плагины без изменения кода.
В системах маршрутизации glob-импорт позволяет автоматически строить карту страниц:
const pages = import('./pages/*.js');
export const routes = Object.keys(pages).map(path => ({
path: path.replace('.js', '').toLowerCase(),
component: pages[path]
}));
При построении дизайн-систем:
const components = import('./components/**/*.js');
export function getComponent(name) {
return components[`./${name}.js`];
}
Несмотря на удобство, glob-импорты имеют ряд особенностей:
Parcel решает часть проблем через кеширование и оптимизацию графа зависимостей, но фундаментальная модель остаётся статической.
Использование glob-выражений влияет на работу bundler следующим образом:
При этом Parcel оптимизирует итоговый бандл:
Ручные импорты:
import a from './a.js';
import b from './b.js';
import c from './c.js';
Glob-импорт:
const modules = import('./*.js');
Разница заключается в следующих аспектах:
Glob-импорты корректно работают в проектах с TypeScript, при этом типизация результата может потребовать явного описания:
const modules: Record<string, () => Promise<any>> =
import('./services/*.ts');
В проектах ES Modules структура сохраняется без изменений, так как Parcel транслирует glob-выражение в стандартные динамические импорты.
При работе с сотнями или тысячами файлов glob-импорты становятся инструментом управления сложностью.
Рекомендуется:
**/*Parcel эффективно распределяет нагрузку, но стоимость анализа файловой системы остаётся значимой при чрезмерно широких масках.
При добавлении нового файла, подходящего под glob-маску:
При удалении файла:
Такой подход снижает необходимость ручного сопровождения импортов и уменьшает вероятность ошибок синхронизации структуры проекта.