В экосистеме esbuild конфигурация TypeScript играет вспомогательную
роль и используется не как полноценный компиляторный контракт, а как
источник сведений для трансформации и разрешения модулей. Опции
tsconfig и tsconfigRaw управляют тем, каким
образом esbuild получает и интерпретирует настройки
TypeScript-проекта.
Опция tsconfig указывает путь к файлу конфигурации
TypeScript, который обычно называется tsconfig.json. Этот
файл содержит набор параметров, влияющих на поведение компилятора
TypeScript: целевую версию ECMAScript, стратегию разрешения модулей,
алиасы путей, JSX-настройки и другие опции.
В esbuild этот файл используется ограниченно. Основная цель — извлечение информации, необходимой для:
paths и
baseUrl;Важно учитывать, что esbuild не реализует полноценную семантику
TypeScript. Он не выполняет типизацию и не интерпретирует сложные
конструкции конфигурации так же глубоко, как tsc.
Опция tsconfig в JavaScript API esbuild принимает
строку, указывающую путь к файлу:
import * as esbuild from 'esbuild';
esbuild.build({
entryPoints: ['src/index.ts'],
bundle: true,
outfile: 'dist/bundle.js',
tsconfig: './tsconfig.json'
});
При использовании CLI поведение аналогично автоматическому поиску
tsconfig.json, однако явное указание пути позволяет задать
альтернативный конфигурационный файл:
esbuild src/index.ts --bundle --outfile=dist/bundle.js --tsconfig=./tsconfig.build.json
При загрузке конфигурации esbuild выполняет следующие шаги:
tsconfig.compilerOptions.noEmit, declaration,
incremental и др.).Поддерживаемые ключевые области:
baseUrl — базовый путь для относительного разрешения
модулей;paths — алиасы импортов;jsx и jsxFactory — правила трансформации
JSX;target — влияет на уровень генерации JavaScript;module — определяет модульную систему;moduleResolution — стратегия поиска модулей.Механизм paths в TypeScript позволяет создавать
псевдонимы для путей импортов:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@app/*": ["src/app/*"]
}
}
}
В esbuild эти настройки используются для преобразования импортов на этапе бандлинга:
import { helper } from '@app/utils/helper';
Такая запись будет резолвиться в:
src/app/utils/helper
Однако поведение отличается от tsc в деталях:
paths.Несмотря на интеграцию, поддержка tsconfig остаётся частичной. Не учитываются:
strict-режим и типовые проверки;noUnusedLocals, noUnusedParameters;declaration и генерация .d.ts;composite проекты;Таким образом, tsconfig в esbuild выступает как конфигурация резолвинга и трансформации, а не как полноценный компиляционный контракт.
tsconfigRaw представляет собой альтернативный способ
задания конфигурации TypeScript без использования внешнего файла. Вместо
чтения tsconfig.json esbuild получает объект конфигурации
напрямую.
Это позволяет:
Опция передаётся как объект:
import * as esbuild from 'esbuild';
esbuild.build({
entryPoints: ['src/index.ts'],
bundle: true,
outfile: 'dist/bundle.js',
tsconfigRaw: {
compilerOptions: {
baseUrl: '.',
paths: {
'@lib/*': ['src/lib/*']
},
target: 'es2020',
module: 'esnext',
jsx: 'automatic'
}
}
});
В отличие от tsconfig, файл на диске не требуется, и
конфигурация полностью инлайновая.
При одновременном использовании обеих опций поведение определяется приоритетом:
tsconfigRaw имеет более высокий приоритет;tsconfig, может использоваться как
базовая конфигурация;tsconfigRaw перекрывают соответствующие
поля.Пример комбинированного подхода:
esbuild.build({
entryPoints: ['src/index.ts'],
bundle: true,
outfile: 'dist/bundle.js',
tsconfig: './tsconfig.json',
tsconfigRaw: {
compilerOptions: {
target: 'es2022'
}
}
});
В данном случае базовая конфигурация берётся из файла, но
target заменяется на es2022.
Использование tsconfigRaw оправдано в нескольких типах
задач:
При генерации конфигурации на основе окружения:
const isProd = process.env.NODE_ENV === 'production';
esbuild.build({
entryPoints: ['src/index.ts'],
bundle: true,
outfile: 'dist/bundle.js',
tsconfigRaw: {
compilerOptions: {
target: isProd ? 'es2022' : 'es2019'
}
}
});
При создании кастомных сборочных систем, где конфигурация не хранится в отдельных файлах.
Когда необходимо исключить зависимость от внешнего
tsconfig.json, например в контейнеризированных окружениях
или CI-пайплайнах.
Сравнение подходов:
| Характеристика | tsconfig | tsconfigRaw |
|---|---|---|
| Источник | файл | объект |
| Гибкость | средняя | высокая |
| Динамичность | отсутствует | поддерживается |
| Файловая зависимость | требуется | не требуется |
| Кэшируемость | стабильная | зависит от реализации |
И tsconfig, и tsconfigRaw влияют на процесс
module resolution. Esbuild использует упрощённую модель:
baseUrl;paths;.ts, .tsx, .js
подбираются автоматически.При этом нестандартные сценарии TypeScript resolution могут работать
иначе, чем в tsc.
Конфигурации jsx, jsxFactory и
jsxFragmentFactory определяют способ преобразования
JSX-кода.
Пример:
{
"compilerOptions": {
"jsx": "react",
"jsxFactory": "h",
"jsxFragmentFactory": "Fragment"
}
}
В esbuild это приводит к трансформации:
const el = <div>Text</div>;
в вызовы:
const el = h("div", null, "Text");
Использование tsconfig или tsconfigRaw
практически не влияет на скорость сборки, поскольку:
Однако динамическое использование tsconfigRaw может
снижать эффективность кэширования между запусками, если объект
конфигурации постоянно изменяется.
При работе с tsconfig в esbuild часто возникают следующие проблемы:
paths с фактической структурой проекта;moduleResolution и поведения
Node.js;tsc и esbuild при
резолвинге.В режиме наблюдения (watch) конфигурация
tsconfig и tsconfigRaw считывается при старте
процесса. Изменения в tsconfig.json не всегда приводят к
автоматическому пересчёту конфигурации, что связано с оптимизацией
сборочного процесса. Для применения изменений требуется перезапуск
сборки.
Плагины могут частично переопределять поведение, связанное с tsconfig:
При этом базовые настройки tsconfig остаются источником
конфигурации, если плагин явно их не игнорирует или не заменяет.