Функция esbuild.analyzeMetafile() предназначена для
преобразования метафайла сборки в человекочитаемый отчёт о структуре
бандла. Метафайл, формируемый при сборке с опцией
metafile: true, содержит детализированное описание входных
модулей, зависимостей, выходных файлов и распределения кода по чанкам.
Однако в исходном виде этот JSON сложно интерпретировать без
специализированной обработки. analyzeMetafile() решает эту
задачу, превращая структурированные данные в аналитический текстовый
отчёт.
Метафайл генерируется при выполнении сборки:
import * as esbuild from 'esbuild';
const result = await esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outfile: 'dist/app.js',
metafile: true
});
console.log(result.metafile);
Структура метафайла включает:
inputs)outputs)В сыром виде это дерево зависимостей, ориентированное на машинную обработку, а не на чтение человеком.
esbuild.analyzeMetafile()esbuild.analyzeMetafile(metafile, options?)
Возвращает Promise<string> с текстовым
отчётом.
Параметры:
metafile — объект метаданных, полученный из
esbuild.build() или
esbuild.context().rebuild()options — необязательный объект конфигурации
анализаПоддерживаемые опции:
verbose: boolean — расширенный режим детализацииcolor: boolean — включение цветового оформления (в
CLI-окружениях)import * as esbuild from 'esbuild';
const result = await esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
metafile: true,
write: false
});
const analysis = await esbuild.analyzeMetafile(result.metafile);
console.log(analysis);
Результат представляет собой структурированный текстовый отчёт, где отображается распределение модулей по выходным файлам и вклад каждого файла в общий размер сборки.
Выход analyzeMetafile() обычно включает несколько
логических блоков.
В начале отчёта перечисляются выходные артефакты:
dist/app.js 245.3kb
dist/vendor.js 812.7kb
Каждый файл сопровождается суммарным размером, включая зависимости.
Далее следует дерево импортов:
src/index.js
└── react-dom/client
└── scheduler
└── ...
Эта часть позволяет определить:
Одна из ключевых секций — распределение веса:
react-dom/client 120.4kb
react 89.1kb
scheduler 32.7kb
Здесь отображается реальный вклад каждого пакета в итоговый бандл, включая транзитивные зависимости.
При наличии динамических импортов (import()), отчёт
показывает чанки:
chunk-A.js
└── src/lazy-module.js
└── lodash-es
Это позволяет анализировать:
verboseПри включении verbose: true отчёт становится значительно
более детализированным.
const analysis = await esbuild.analyzeMetafile(result.metafile, {
verbose: true
});
Дополнительно отображается:
analyzeMetafile() позволяет быстро выявить библиотеки,
увеличивающие размер сборки непропорционально функциональности. Часто
это:
Отчёт показывает, какие части библиотек действительно попали в сборку. Это позволяет оценить эффективность:
package.jsonЕсли модуль целиком включается, несмотря на частичный импорт, это сигнал к пересмотру структуры импортов.
При наличии нескольких чанков можно обнаружить повторное включение одних и тех же зависимостей. В отчёте это проявляется как повторяющиеся блоки с одинаковыми модулями в разных выходных файлах.
На основе анализа корректируются:
При крупных проектах метафайл может содержать тысячи модулей. В таких случаях:
import fs from 'fs';
import * as esbuild from 'esbuild';
const result = await esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
metafile: true,
outfile: 'dist/app.js'
});
const report = await esbuild.analyzeMetafile(result.metafile);
fs.writeFileSync('analysis.txt', report);
metafile
и build contextanalyzeMetafile() не выполняет сборку и не изменяет граф
зависимостей. Она работает исключительно с уже готовым метафайлом.
В сценариях с watch-режимом или контекстной сборкой:
context.rebuild() генерирует новый метафайлФункция ориентирована на структурный анализ, поэтому:
Размеры в отчёте отражают итоговый вклад модулей после:
Таким образом, цифры соответствуют именно финальному артефакту, а не исходным исходникам.
Используется для проверки влияния изменений:
После включения:
tree shakingsplittingminifyанализ показывает реальный эффект, а не декларативные настройки.
В монорепозиториях метафайл помогает определить:
Выход analyzeMetafile() представляет собой текстовый
отчёт, пригодный для:
При необходимости он может быть дополнительно обработан для построения графов зависимостей или интеграции с системами мониторинга размера бандлов.