sourceRoot — это параметр конфигурации esbuild, который
влияет на формирование source map и определяет базовый путь (корневую
директорию) для исходных файлов при отладке. Он используется совместно с
sourceMap и позволяет управлять тем, как инструменты
разработчика браузера интерпретируют пути к исходному коду.
Source map представляет собой структуру сопоставления между
минифицированным или транспилированным кодом и оригинальными исходными
файлами. Внутри этой структуры хранятся пути к исходникам, и именно
здесь sourceRoot играет ключевую роль, задавая общий
префикс для этих путей.
sourceRootПри включённой генерации source map:
esbuild app.js --bundle --sourcemap
esbuild формирует .map файл, в котором пути к исходным
файлам записываются относительно текущей структуры проекта или входных
точек.
Пример содержимого source map:
{
"version": 3,
"sources": [
"src/utils/math.js",
"src/index.js"
],
"mappings": "..."
}
В таком виде браузер пытается интерпретировать пути напрямую, что может приводить к:
sourceRootsourceRoot задаёт базовый путь, который добавляется к
каждому элементу массива sources внутри source map.
Пример:
esbuild app.js --bundle --sourcemap --source-root=/static/src
Результирующий source map:
{
"version": 3,
"sources": [
"utils/math.js",
"index.js"
],
"sourceRoot": "/static/src",
"mappings": "..."
}
Логика интерпретации в браузере:
/static/src + utils/math.js → /static/src/utils/math.js
/static/src + index.js → /static/src/index.js
При сборке проекта часто исходные файлы перемещаются или обслуживаются с другого пути (CDN, сервер статических файлов).
Пример ситуации:
/Users/dev/project/src/...https://cdn.example.com/assets/src/...Использование sourceRoot позволяет нормализовать
отображение путей:
esbuild src/index.js --bundle --sourcemap --source-root=https://cdn.example.com/assets
Без sourceRoot DevTools могут отображать длинные или
нерелевантные пути:
../. ./. ./. ./project/src/components/Button.js
С sourceRoot структура становится логической и
читаемой:
components/Button.js
В монорепозиториях часто присутствует вложенная структура:
repo/
packages/
ui/
src/
app/
src/
При сборке одного пакета пути могут терять контекст.
sourceRoot позволяет зафиксировать базовую точку:
esbuild packages/ui/src/index.js --bundle --sourcemap --source-root=/packages/ui/src
В Node.js API esbuild параметр задаётся через объект конфигурации:
import * as esbuild from 'esbuild';
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
sourcemap: true,
sourceRoot: '/static/src'
});
sourcesContentSource map может содержать не только пути, но и сами исходные тексты
файлов (sourcesContent).
Структура:
{
"sources": ["utils/math.js"],
"sourcesContent": ["export const sum = (a, b) => a + b;"]
}
sourceRoot в этом случае влияет только на интерпретацию
путей, но не изменяет содержимое sourcesContent. Это
означает:
sourceRoot не влияет на фактический код
выполнения.sources содержат относительные пути,
sourceRoot добавляется как префикс.sourceRoot игнорируется или не
применяется.Пример:
"sourceRoot": "/app",
"sources": ["src/a.js"]
→ /app/src/a.js
Некоторые инструменты (Webpack DevTools, Chrome DevTools, VS Code Debugger) используют следующую логику:
sourceRootsources[i]Ошибки в sourceRoot приводят к:
В отличие от некоторых сборщиков, где sourceRoot
автоматически вычисляется, esbuild требует явного указания при
необходимости корректировки путей.
Например:
devtoolModuleFilenameTemplateoutput.sourcemapPathTransformsourceRoot
как базовый механизмesbuild src/index.js --bundle --sourcemap
sourceRoot не требуется.
esbuild src/index.js \
--bundle \
--minify \
--sourcemap \
--source-root=https://cdn.example.com/app
esbuild.build({
entryPoints: ['src/server.js'],
bundle: true,
sourcemap: true,
sourceRoot: '/assets/server'
});
sourceRoot не переписывает физическое расположение
файлов.sourcesContent.sourceRoot: "/static/src"
sources: ["app.js"]
Если файл фактически находится в /static/app.js,
DevTools не найдёт его.
--source-root=/project/src/src
Приводит к дублированию путей:
/project/src/src/utils.js
--source-root=/src
--sourcemap=false
В этом случае параметр полностью игнорируется, так как отсутствует карта источников.
sourceRoot часто становится частью стратегии управления
отладочными артефактами:
В связке с --sourcemap=external позволяет хранить карты
отдельно:
esbuild src/index.js \
--bundle \
--sourcemap=external \
--source-root=/src
Chrome DevTools интерпретирует sourceRoot следующим
образом:
sources напрямую.В результате дерево исходников может выглядеть как:
static/
src/
components/
utils/
или без структуры вовсе, если sourceRoot не задан.