В системе плагинов esbuild обработка модулей строится вокруг двух
ключевых механизмов: регулярного фильтра filter и
пространств имён namespace. Эти параметры используются в
хуках onResolve и onLoad и позволяют точно
управлять тем, какие модули перехватываются, как они интерпретируются и
на каком этапе сборки обрабатываются.
filter в
onResolve и onLoadfilter представляет собой регулярное выражение, которое
применяется для предварительного отбора модулей. Оно определяет, какие
пути или идентификаторы будут переданы в конкретный обработчик
плагина.
filter в
onResolveХук onResolve отвечает за обработку путей импортов до их
загрузки. filter здесь используется для сопоставления
импортируемых строк.
Пример базовой структуры:
const plugin = {
name: 'example',
setup(build) {
build.onResolve({ filter: /\.txt$/ }, (args) => {
return {
path: args.path,
namespace: 'text-ns'
};
});
}
};
В данном случае:
.txtfilter в onResolveonResolve могут работать параллельно, если их
фильтры пересекаются.filter в onLoadВ onLoad фильтрация применяется уже после резолва пути и
выбора пространства имён. Здесь filter чаще используется
для ограничения обработки по расширению или шаблону пути.
build.onLoad({ filter: /\.txt$/, namespace: 'text-ns' }, (args) => {
return {
contents: 'hello world',
loader: 'text'
};
});
В этом случае обработка происходит только если:
namespacenamespace)namespace — это логическая метка, которая определяет
контекст происхождения модуля. Она позволяет разделять обычные файловые
модули, виртуальные модули, удалённые ресурсы и пользовательские
источники данных.
По умолчанию все файлы находятся в пространстве имён:
file
Любой модуль, загруженный с диска, получает это значение автоматически, если не переопределяется плагином.
Плагины часто создают собственные пространства имён для разделения логики обработки:
build.onResolve({ filter: /^virtual:/ }, (args) => {
return {
path: args.path,
namespace: 'virtual-ns'
};
});
Здесь:
virtual:module перенаправляется в
пространство virtual-nsnamespace между onResolve и
onLoadОсновной механизм работы строится на передаче namespace
между этапами:
onResolve определяет, в каком пространстве будет
находиться модульonLoad перехватывает модуль уже внутри этого
пространстваbuild.onResolve({ filter: /^virtual:/ }, (args) => {
return {
path: args.path,
namespace: 'virtual-ns'
};
});
build.onLoad({ filter: /.*/, namespace: 'virtual-ns' }, (args) => {
return {
contents: 'export const value = 42;',
loader: 'js'
};
});
Такой подход позволяет:
filter и namespacefilter и namespace выполняют разные функции
и используются совместно:
filter ограничивает совпадение по строковому
шаблонуnamespace ограничивает область действия по контексту
модуляПри совместном использовании формируется строгий двухуровневый контроль:
build.onLoad(
{ filter: /\.txt$/, namespace: 'text-ns' },
(args) => {
return {
contents: 'processed text',
loader: 'text'
};
}
);
Логика обработки:
namespace используется для модулей, которые не
существуют в файловой системе:
filter позволяет ограничивать обработку по расширениям
или паттернам:
\.png$, \.svg$)\.css$)\.graphql$,
\.md$)Комбинация filter и namespace позволяет
строить многоуровневую систему загрузчиков:
file — стандартные файлыhttp-ns — удалённые ресурсыvirtual-ns — сгенерированный кодasset-ns — бинарные ресурсыesbuild обрабатывает плагины последовательно, но filter
влияет на ранний этап маршрутизации.
При совпадении нескольких плагинов:
onResolveonLoad с уже установленным
namespaceКонфликтов между filter и namespace не
происходит напрямую, но некорректная настройка может привести к пропуску
обработчиков.
filter: /.*/
Приводит к перехвату всех модулей и снижению предсказуемости сборки.
onResolve -> namespace: 'custom'
onLoad -> namespace: 'custom-ns'
Результат: onLoad не срабатывает.
Без filter обработчик может срабатывать на неожиданные
пути внутри одного namespace, что усложняет отладку.
filter и namespace формируют основу
маршрутизации модулей внутри системы сборки. Они позволяют превращать
линейный процесс обработки файлов в многоуровневый конвейер, где каждый
модуль может быть:
Такой подход делает систему плагинов esbuild компактной, но достаточно гибкой для реализации сложных сценариев трансформации кода.