В контексте работы с esbuild одна из ключевых деталей конфигурации,
влияющих на разрешение путей и поведение входных/выходных файлов, — это
параметр absWorkingDir. Несмотря на свою лаконичность, он
определяет фундаментальный контекст выполнения сборки и напрямую влияет
на интерпретацию всех относительных путей внутри конфигурации.
absWorkingDirabsWorkingDir задаёт абсолютную рабочую
директорию, относительно которой esbuild интерпретирует все
пути, указанные в конфигурации сборки:
entryPoints)outdir и outfileКлючевая идея: esbuild перестаёт полагаться на текущую
рабочую директорию процесса (process.cwd()), заменяя её
явно заданной базой.
Если absWorkingDir не указан, esbuild использует:
process.cwd() в Node.js-окруженииЭто поведение кажется простым, но в реальных проектах приводит к неоднозначностям:
interface BuildOptions {
absWorkingDir?: string;
}
Значение должно быть:
При установке absWorkingDir все относительные пути
начинают интерпретироваться так, как будто процесс всегда запущен из
этой директории.
Пример:
import { build } from 'esbuild';
build({
absWorkingDir: '/project',
entryPoints: ['src/index.js'],
outdir: 'dist'
});
Здесь:
src/index.js трактуется как
/project/src/index.jsdist трактуется как /project/distДаже если команда запускается из /home/user или
/tmp, поведение останется одинаковым.
entryPoints — один из наиболее чувствительных параметров
к рабочей директории.
Без absWorkingDir:
entryPoints: ['src/index.js']
может означать разные файлы в зависимости от:
С absWorkingDir:
absWorkingDir: '/project',
entryPoints: ['src/index.js']
всегда приводит к:
/project/src/index.js
Для выходных параметров правило аналогичное:
outdir: 'dist'
интерпретируется как:
/project/dist
при установленном:
absWorkingDir: '/project'
Это особенно важно в следующих сценариях:
Хотя absWorkingDir напрямую не участвует в резолвинге
import, он задаёт базу, от которой строится разрешение
относительных путей файловой системы.
Пример:
// /project/src/index.js
import './utils/math.js';
При:
absWorkingDir: '/project'
esbuild интерпретирует:
/project/src/utils/math.js
Это особенно важно для:
В монорепозиториях структура часто выглядит так:
repo/
packages/
app/
lib/
Без фиксации absWorkingDir сборка может зависеть от:
cwd пакетаС absWorkingDir:
absWorkingDir: '/repo/packages/app'
вся сборка становится изолированной и повторяемой.
В CLI-режиме esbuild:
esbuild src/index.js --outdir=dist
по умолчанию использует текущую директорию терминала.
А эквивалент с фиксацией:
esbuild src/index.js --outdir=dist --abs-working-dir=/project
Позволяет запускать команду из любого места без изменения результата.
В контейнерных окружениях absWorkingDir часто становится
критически важным.
Типичная проблема:
WORKDIR /appБез фиксации:
С установкой:
absWorkingDir: '/app'
сборка становится независимой от Docker-слоя запуска.
Многие плагины esbuild работают с путями напрямую:
onResolve({ filter: /.*/ }, args => {
return {
path: path.resolve(args.resolveDir, args.path)
};
});
Здесь resolveDir вычисляется на основе текущего
контекста сборки, который опирается на absWorkingDir.
Таким образом:
absWorkingDir плагины получают нестабильный
контекстabsWorkingDir поведение становится
детерминированнымabsWorkingDir: './project'
Это некорректно в общем случае, потому что esbuild ожидает абсолютный путь. Такое значение может привести к:
Если одновременно используются:
process.cwd()absWorkingDirи логика проекта зависит от обеих величин, возникает рассинхронизация:
esbuild активно оптимизирован под повторяемые сборки.
absWorkingDir усиливает эту характеристику:
Особенно важно для:
При генерации sourcemap:
sourcemap: true
пути источников могут включать:
absWorkingDir влияет на базовую точку отсчёта, от
которой формируются относительные пути в source map.
Результат:
absWorkingDir определяет:
Его использование превращает сборку из «зависящей от запуска» в «детерминированную относительно проекта».