Метафайл в Esbuild представляет собой статический отчёт о сборке,
который описывает зависимость между исходными файлами и итоговыми
бандлами. Он генерируется при включении опции --metafile и
сохраняется в формате JSON.
Ключевая идея структуры — отображение полного графа сборки в двух направлениях:
Эти две секции дополняют друг друга, позволяя анализировать сборку как с точки входа (source-centric), так и с точки результата (bundle-centric).
inputsinputs описывает все исходные модули, которые были
задействованы в процессе сборки, независимо от того, являются ли они
точками входа или транзитивными зависимостями.
Каждый ключ в inputs — это путь к исходному файлу.
Значение — объект с метаданными о его участии в сборке.
inputsТипичный элемент выглядит следующим образом:
{
"src/utils/math.ts": {
"bytesInOutput": 234,
"imports": [
{
"path": "src/constants.ts",
"kind": "import-statement"
},
{
"path": "node_modules/lodash/lodash.js",
"kind": "require-call"
}
]
}
}
bytesInOutputbytesInOutput показывает, сколько байт
итогового бандла пришлось на данный исходный файл.
Ключевые особенности:
Это поле используется для:
importsimports описывает зависимости
конкретного исходного файла.
Каждый элемент массива содержит:
path — путь к импортируемому
модулюkind — тип импортаkindEsbuild различает несколько типов импортов:
import-statement — ES Module importrequire-call — CommonJS requiredynamic-import — динамический import()entry-point — входная точка (в некоторых
контекстах)inputs в
графе зависимостейinputs формирует обратную сторону dependency graph:
Это особенно важно при анализе больших проектов, где один файл может участвовать сразу в нескольких output-бандлах.
outputsoutputs описывает результат работы сборщика: все файлы,
которые были сгенерированы Esbuild.
Каждый ключ — это путь к итоговому файлу (например,
dist/app.js), а значение содержит информацию о том, из
каких исходников он был собран.
outputsПример:
{
"dist/app.js": {
"bytes": 84231,
"inputs": {
"src/index.ts": {
"bytesInOutput": 1200
},
"src/utils/math.ts": {
"bytesInOutput": 2300
}
},
"imports": [
{
"path": "react",
"kind": "import-statement"
}
]
}
}
bytesbytes — общий размер итогового файла
после сборки.
Особенности:
inputs внутри
outputsЭто одна из ключевых частей метафайла.
Она представляет обратное отображение: какие исходные файлы и в каком объёме попали в конкретный output-файл.
"inputs": {
"src/index.ts": {
"bytesInOutput": 1200
}
}
bytesInOutput в этом контекстеЗдесь оно означает:
imports в
outputsЭто список внешних или внутренних зависимостей, которые участвуют в итоговом бандле.
Обычно сюда попадают:
react, lodash)inputs и
outputsМетафайл Esbuild строится как двусторонний граф:
inputs → показывает “что входит в файл”outputs → показывает “из чего состоит бандл”Эта симметрия позволяет выполнять два типа анализа:
{
"inputs": {
"src/index.ts": {
"bytesInOutput": 1500,
"imports": [
{ "path": "src/app.ts", "kind": "import-statement" }
]
},
"src/app.ts": {
"bytesInOutput": 3200,
"imports": [
{ "path": "react", "kind": "import-statement" }
]
}
},
"outputs": {
"dist/app.js": {
"bytes": 12000,
"inputs": {
"src/index.ts": { "bytesInOutput": 1500 },
"src/app.ts": { "bytesInOutput": 3200 }
},
"imports": [
{ "path": "react", "kind": "import-statement" }
]
}
}
}
Одна и та же зависимость может присутствовать:
inputs (как исходный модуль)outputs.inputs (как часть конкретного бандла)Это не ошибка, а отражение разных уровней анализа.
При code splitting или multiple entry points:
bytesInOutput будет различаться для каждого случаяПри активном tree-shaking:
bytesInOutput уменьшаетсяinputs могут отсутствовать в
outputsНа основе inputs.bytesInOutput:
Через outputs:
Использование imports.kind позволяет:
require на importimports в обоих разделах помогает:
node_modulesМетафайл можно рассматривать как ориентированный граф:
inputs и outputs)importsbytesInOutput и bytesВ этом графе:
inputs задаёт структуру исходного графа
зависимостейoutputs задаёт проекцию этого графа на итоговые
артефактыТакое представление позволяет использовать метафайл как основу для: