metafile в esbuild включает генерацию структурированного
описания результата бандлинга. Это JSON-объект, содержащий
детализированную информацию о входных файлах, промежуточных модулях,
выходных чанках и связях между ними.
Включение выполняется через API:
import * as esbuild from 'esbuild';
const result = await esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outfile: 'dist/bundle.js',
metafile: true
});
В CLI:
esbuild src/index.js --bundle --outfile=dist/bundle.js --metafile=meta.json
Во втором случае метафайл записывается сразу в файл
meta.json. В API-режиме он возвращается в объекте
результата как result.metafile.
metafile представляет собой JSON с фиксированной схемой
верхнего уровня:
inputs — все входные файлы и информация об их
использованииoutputs — все сгенерированные файлы сборкиПример общей структуры:
{
"inputs": {
"src/index.js": {
"bytes": 120,
"imports": ["react", "./app.js"]
}
},
"outputs": {
"dist/bundle.js": {
"bytes": 24500,
"inputs": ["src/index.js", "react/index.js"]
}
}
}
На практике структура значительно глубже и включает транзитивные зависимости, метаданные о переэкспортах и цепочках импортов.
inputs: анализ входных модулейinputs описывает каждый модуль, который участвовал в
сборке.
Каждый входной файл содержит:
bytes — размер исходного файлаimports — список импортируемых модулейformat — формат модуля (ESM/CommonJS)dependsOn — косвенные зависимости через цепочку
импортовПример:
{
"src/app.js": {
"bytes": 842,
"imports": [
{
"path": "react",
"kind": "import-statement"
},
{
"path": "./utils.js",
"kind": "require-call"
}
]
}
}
Ключевой момент: esbuild фиксирует не только факт импорта, но и его тип, что позволяет различать статические и динамические зависимости.
outputs:
результат сборкиoutputs содержит информацию о финальных артефактах
сборки.
Каждый выходной файл включает:
inputs — все исходные модули, вошедшие в бандлimports — внешние зависимости (external packages)bytesInOutput — размер итогового файлаentryPoint — является ли файл точкой входаcssBundle — если включена обработка CSSПример:
{
"dist/bundle.js": {
"entryPoint": "src/index.js",
"inputs": [
"src/index.js",
"src/app.js",
"node_modules/react/index.js"
],
"bytes": 54321
}
}
Эта информация позволяет точно определить, какие зависимости попали в конкретный бандл.
metafile фактически представляет собой сериализованный
граф зависимостей.
Каждый узел — модуль, каждая связь — импорт. Это позволяет:
Пример анализа:
outputs.inputs, она была
исключена tree-shaking-омОсновные сценарии применения:
1. Поиск тяжёлых зависимостей
bytes в inputs и вклад в
outputs позволяют определить модули, увеличивающие размер
бандла.
2. Контроль tree-shaking
Если модуль присутствует в inputs, но его экспортов нет
в outputs, значит он был полностью удалён.
3. Анализ дублирования
Одинаковые библиотеки могут попадать в разные чанки при неправильной конфигурации code splitting.
4. Проверка эффекта external-зависимостей
external модули отображаются в
outputs.imports, но отсутствуют в inputs.
metafile является стандартным источником данных для
внешних визуализаторов.
Типичные сценарии:
Пример передачи в анализатор:
esbuild src/index.js --bundle --metafile=meta.json
npx esbuild-visualizer meta.json
metafile особенно полезен в связке с кешированием.
При сравнении двух файлов можно:
Пример логики сравнения:
old.metafile.inputs vs new.metafile.inputs
→ разница в bytes
→ новые зависимости
→ удалённые модули
Содержимое metafile зависит от конфигурации esbuild:
bundle: true — включает граф зависимостейsplitting: true — добавляет чанки в
outputsminify: true — меняет итоговые bytesexternal — исключает зависимости из
inputsformat — влияет на структуру импортовОсобенно сильно изменяется структура при включении code splitting:
появляется несколько outputs, связанных общими
inputs.
metafile не предназначен для runtime-использования. Это
исключительно артефакт сборки.
Особенности:
При анализе крупных проектов ключевым становится не сам JSON, а выводимые из него метрики:
На основе этих данных строятся решения о: