Переменные окружения в процессе сборки JavaScript-приложений выступают механизмом конфигурации, позволяющим изменять поведение кода и инструмента сборки без изменения исходного кода. В системе сборки esbuild они используются не как самостоятельный API, а как источник данных, который может быть встроен в результат бандлинга через механизмы подстановки и плагинов.
Важное различие заключается в том, что переменные окружения в сборщике существуют на двух уровнях: во время выполнения сборки и внутри собранного кода после компиляции.
На этапе запуска esbuild доступен стандартный механизм окружения операционной системы и среды Node.js:
process.env.env файлы (через внешние инструменты)На этом уровне переменные используются для настройки самого процесса сборки: выбора режима, включения плагинов, изменения входных точек.
После компиляции переменные окружения не сохраняются автоматически.
Вместо этого используется подстановка значений в код через механизм
define.
Пример:
define: {
"process.env.NODE_ENV": '"production"'
}
После сборки выражение:
if (process.env.NODE_ENV === "production") {
console.log("prod mode");
}
превращается в:
if ("production" === "production") {
console.log("prod mode");
}
и затем упрощается до:
console.log("prod mode");
define является ключевым инструментом эмуляции
переменных окружения в esbuild.
Он работает как статическая замена текста в AST на этапе сборки.
Поддерживаемые формы:
define: {
"process.env.API_URL": '"https://api.example.com"',
"global.IS_BROWSER": "true"
}
Особенности:
process.envПодстановка значений через define напрямую влияет на
удаление мёртвого кода.
Пример:
if (process.env.DEBUG) {
console.log("debug");
}
При конфигурации:
define: {
"process.env.DEBUG": "false"
}
код превращается в:
if (false) {
console.log("debug");
}
и затем полностью удаляется.
Это позволяет использовать переменные окружения как механизм управления включением функциональности на этапе сборки.
| Механизм | Когда применяется | Где существует | Итог |
|---|---|---|---|
| process.env | runtime Node.js | сервер/среда выполнения | динамическое значение |
| define | build time | внутри esbuild | статическая подстановка |
Важно, что esbuild не эмулирует process.env
автоматически. Без define обращение к нему в браузерном
коде приведёт к ошибке выполнения.
Частая практика — использование переменной NODE_ENV.
Конфигурация:
define: {
"process.env.NODE_ENV": '"development"'
}
или:
define: {
"process.env.NODE_ENV": '"production"'
}
Влияние:
В связке с minify: true и treeShaking
значение production позволяет агрессивно удалять код.
Файлы .env не поддерживаются напрямую esbuild. Обычно
используется промежуточная загрузка через сторонние библиотеки:
import dotenv from "dotenv";
dotenv.config();
Далее значения передаются в define:
define: {
"process.env.API_URL": JSON.stringify(process.env.API_URL)
}
Такой подход обеспечивает:
Плагины esbuild часто используют переменные окружения для изменения поведения:
Пример плагина:
const envPlugin = {
name: "env-plugin",
setup(build) {
const isProd = process.env.NODE_ENV === "production";
build.initialOptions.define = {
...build.initialOptions.define,
"process.env.IS_PROD": JSON.stringify(isProd)
};
}
};
esbuild использует кэширование для ускорения пересборки.
Изменение переменных окружения влияет на:
define-заменЕсли значение переменной меняется, но входные файлы не изменяются, esbuild всё равно пересобирает бандл, поскольку результат компиляции зависит от конфигурации.
Переменные окружения часто содержат секреты, однако при использовании
define они попадают в клиентский бандл.
Ключевое ограничение:
define, становится частью
публичного JavaScript-кодаСледствия:
define, доступны в
браузереМеханизм define используется для имитации условной
компиляции:
if (process.env.FEATURE_X === "enabled") {
enableFeatureX();
}
Сборка:
define: {
"process.env.FEATURE_X": '"enabled"'
}
Результат:
enableFeatureX();
При этом альтернативная ветка удаляется полностью.
Переменные окружения часто применяются для разделения платформ:
define: {
"process.env.PLATFORM": '"browser"'
}
или
define: {
"process.env.PLATFORM": '"node"'
}
Это влияет на:
В системах непрерывной интеграции переменные окружения становятся источником конфигурации сборки:
CI=trueBUILD_IDBRANCH_NAMEОни часто транслируются в define:
define: {
"process.env.BUILD_ID": JSON.stringify(process.env.BUILD_ID)
}
Это позволяет:
При формировании конфигурации esbuild действует правило последнего значения:
define: {
"process.env.NODE_ENV": '"development"',
"process.env.NODE_ENV": '"production"'
}
Итоговое значение будет production.
При использовании плагинов порядок их выполнения влияет на финальную карту переменных.
отсутствие кавычек в строках:
"production"'"production"'ожидание runtime-значений от define
смешивание process.env без подстановки
утечка секретов в клиентский код
дублирование переменных в нескольких плагинах
Использование переменных окружения через define
позволяет:
В связке с возможностями esbuild это становится одним из основных механизмов конфигурации сборки без runtime-накладных расходов.