Parcel поддерживает механизм подстановки переменных окружения на этапе сборки, позволяя встраивать конфигурационные значения напрямую в HTML без дополнительного JavaScript-кода. Такой подход применяется для настройки API-адресов, флагов окружения, ключей интеграций и прочих параметров, которые должны различаться между dev и production-сборками.
В HTML-файлах Parcel использует специальный шаблонный формат:
%VARIABLE_NAME%
Любая строка, обёрнутая в символы %, рассматривается как
ссылка на переменную окружения. На этапе сборки Parcel заменяет её на
фактическое значение.
Пример:
<script src="%API_BASE_URL%/client.js"></script>
Если в окружении определено:
API_BASE_URL=https://cdn.example.com
результирующий HTML после сборки:
<script src="https://cdn.example.com/client.js"></script>
Parcel получает значения из нескольких источников, объединяя их в единый слой конфигурации:
.env файлы в корне проекта.env.local, .env.development,
.env.productionПриоритет обычно определяется от более специфичных файлов к общим,
при этом локальные .env файлы перекрывают глобальные
значения.
.env файловParcel автоматически подхватывает файлы .env без
необходимости подключения дополнительных библиотек.
Пример .env:
API_BASE_URL=https://api.example.com
APP_NAME=MyApplication
Использование в HTML:
<title>%APP_NAME%</title>
<link rel="stylesheet" href="%API_BASE_URL%/styles/main.css">
Если переменная окружения не определена, Parcel не выполняет магического восстановления значения. Вместо этого поведение зависит от конфигурации сборки:
%NAME%Практика продакшена предполагает явное определение всех используемых переменных.
Подстановка переменных происходит на этапе HTML-трансформации, до финальной сборки ассетов. Внутренний пайплайн Parcel включает:
%...%Этот процесс отличается от JavaScript-замены
process.env, которая происходит в рамках бандлинга
модулей.
Parcel обрабатывает переменные окружения в разных контекстах по-разному.
<meta name="api" content="%API_BASE_URL%">
console.log(process.env.API_BASE_URL);
В JavaScript Parcel выполняет статическую замену:
console.log("https://api.example.com");
HTML же использует строковый шаблонный механизм %VAR%,
независимый от process.env.
Подстановка работает не только в содержимом тегов, но и в атрибутах:
<img src="%CDN_URL%/images/logo.png">
<a href="%DOCS_URL%/guide.html">Документация</a>
После сборки:
<img src="https://cdn.example.com/images/logo.png">
<a href="https://docs.example.com/guide.html">Документация</a>
Часто используется разделение конфигураций по средам:
.env.development
API_BASE_URL=http://localhost:3000
.env.production
API_BASE_URL=https://api.production.com
Parcel автоматически выбирает нужный файл в зависимости от режима сборки:
parcel build index.html --mode production
Механизм подстановки в HTML имеет ряд технических ограничений:
%...%Пример неподдерживаемого варианта:
<!-- не работает -->
%API_%VERSION%_URL%
Переменные окружения, используемые в HTML, попадают в финальный бандл и становятся публичными. Это означает:
Подстановка переменных окружения часто используется для управления путями к CDN и версиям ресурсов:
<script src="%CDN_URL%/app.%BUILD_HASH%.js"></script>
Такая схема позволяет:
Parcel анализирует HTML после подстановки и продолжает строить граф зависимостей. Например:
<link rel="stylesheet" href="%STYLE_PATH%">
Если значение:
STYLE_PATH=./styles/main.css
Parcel интерпретирует итоговый путь как зависимость и добавляет файл в бандл.
HTML-подстановка часто используется совместно с JS-конфигурацией:
<script>
window.__CONFIG__ = {
apiBase: "%API_BASE_URL%"
};
</script>
В JavaScript далее используется уже готовая конфигурация без
обращения к process.env.
В режиме разработки Parcel выполняет подстановку аналогично
production-сборке, но с возможностью быстрого обновления значений при
изменении .env файлов. При этом dev-server отслеживает
изменения и пересобирает HTML без полной пересборки проекта.
При некорректной конфигурации переменных окружения Parcel может:
%VAR%Диагностика обычно связана с:
.env файлаHTML-трансформер Parcel, отвечающий за подстановку, может взаимодействовать с другими плагинами:
@parcel/transformer-html)Порядок обработки влияет на итоговый результат, поскольку подстановка выполняется до финальной оптимизации DOM-структуры.