Поле conditions управляет тем, какие экспортируемые
варианты модулей выбираются при сборке зависимостей. Оно напрямую
связано с полем exports в package.json, где
пакеты описывают различные точки входа в зависимости от окружения
выполнения.
В основе механизма лежит стандарт Conditional Exports из Node.js и
экосистемы ESM, где один и тот же пакет может предоставлять разные файлы
для разных сценариев: браузер, Node.js, require,
import и другие пользовательские условия.
В package.json зависимость может описывать несколько
вариантов одного и того же модуля:
{
"exports": {
".": {
"browser": "./dist/browser.js",
"import": "./dist/esm.js",
"require": "./dist/cjs.js",
"default": "./dist/default.js"
}
}
}
Каждый ключ внутри exports — это условие. Оно выбирается
в зависимости от окружения и инструментов сборки.
esbuild использует поле conditions для
управления тем, какие из этих ключей считать активными.
В конфигурации сборщика conditions представляет собой
массив строк:
{
conditions: ["browser", "import", "require"]
}
Каждая строка — это имя условия, которое участвует в выборе
соответствующего поля в exports.
При разрешении импорта esbuild:
exports из package.jsonЕсли совпадений нет, используется default.
importУсловие import применяется при использовании ES
Modules:
import x from 'package'import()Если включено:
conditions: ["import"]
то при наличии:
"exports": {
".": {
"import": "./esm.js",
"require": "./cjs.js"
}
}
будет выбран esm.js.
requireУсловие require применяется при
CommonJS-совместимости:
require('package')При конфигурации:
conditions: ["require"]
и exports:
{
".": {
"import": "./esm.js",
"require": "./cjs.js"
}
}
будет выбран CommonJS-файл.
browserУсловие browser предназначено для замены модулей при
сборке под браузер.
conditions: ["browser", "import", "require"]
и:
{
".": {
"browser": "./browser.js",
"import": "./esm.js",
"require": "./cjs.js"
}
}
Приоритет:
browserimportrequiredefaultУсловие browser может:
defaultdefault — резервный вариант, используемый, если ни одно
условие не совпало.
{
".": {
"browser": "./browser.js",
"import": "./esm.js",
"default": "./fallback.js"
}
}
Если conditions не содержит совпадающих ключей,
выбирается fallback.js.
esbuild обрабатывает условия последовательно, в порядке
массива conditions.
Пример:
conditions: ["browser", "require", "import"]
При таком порядке:
browserrequireimportdefaultПриоритет не фиксирован внутри esbuild — он определяется
конфигурацией сборки.
Поле conditions тесно связано с
platform:
{
platform: "browser",
conditions: ["browser", "import", "require"]
}
или:
{
platform: "node",
conditions: ["require", "import"]
}
platform: browser усиливает роль
browserplatform: node чаще приводит к выбору
require или importЕсли conditions не указаны, используется стандартный
набор:
importrequiredefaultНо без явного browser поведение может не учитывать
браузерные замены.
{
"name": "lib",
"exports": {
".": {
"browser": "./browser.js",
"import": "./esm.js",
"require": "./cjs.js",
"default": "./fallback.js"
}
}
}
{
platform: "browser",
conditions: ["browser", "import", "default"]
}
browser.jsesm.jsfallback.jsПомимо стандартных значений:
browserimportrequiredefaultмогут использоваться кастомные условия:
{
".": {
"production": "./prod.js",
"development": "./dev.js"
}
}
И конфигурация:
conditions: ["production"]
esbuild не интерпретирует смысл условий — он только сопоставляет строки.
Node.js поддерживает аналогичную систему условий через:
exportsimports--conditionsРазница:
Это приводит к тому, что conditions в esbuild фактически
фиксируют выбор модулей заранее.
conditions: ["require", "browser"]
В результате браузерный код может быть проигнорирован.
Без browser:
Если пакет не строго разделяет ESM и CJS, выбор может стать непредсказуемым при неправильной конфигурации условий.
Выбор через conditions влияет на:
Особенно критично при наличии:
Часто используемая стратегия:
conditions: ["browser", "import", "require", "default"]
или для Node.js:
conditions: ["import", "require", "default"]
или строгая ESM:
conditions: ["import", "default"]
Алгоритм выбора:
exportsconditions по порядкуdefaultЭтот механизм делает esbuild предсказуемым инструментом для построения разных таргетных сборок из одного набора зависимостей.