Stencil предоставляет мощный и гибкий механизм работы с переменными окружения, который позволяет настраивать сборку и поведение компонентов в зависимости от среды — разработки, тестирования или продакшена. Переменные окружения используются для конфигурации проекта, управления флагами функциональности и передачи чувствительных данных без их жесткого кодирования в исходный код.
В Stencil переменные окружения определяются через объект
process.env, аналогично Node.js. На этапе сборки значения
этих переменных могут быть внедрены в код, что позволяет создавать
условные блоки и конфигурации.
Пример использования:
const apiUrl = process.env.API_URL || 'http://localhost:3000';
В этом примере API_URL — переменная окружения, значение
которой подставляется в код. Если переменная не задана, используется
значение по умолчанию.
.env файлыStencil поддерживает использование .env файлов для
упрощения работы с переменными окружения. Обычно создаются файлы:
.env — базовые значения для всех сред;.env.development — значения для разработки;.env.production — значения для продакшена.Для их использования необходимо установить пакет dotenv
и подключить его в конфигурации Stencil:
import { Config } from '@stencil/core';
import * as dotenv from 'dotenv';
dotenv.config();
export const config: Config = {
namespace: 'my-app',
globalScript: 'src/global/app.ts',
devServer: {
port: Number(process.env.PORT) || 3333
}
};
При этом все переменные из .env становятся доступными
через process.env.
Для TypeScript-проектов важно обеспечить корректную типизацию
переменных окружения. Создается файл env.d.ts с
определением интерфейса:
interface ImportMetaEnv {
readonly API_URL: string;
readonly NODE_ENV: 'development' | 'production';
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}
После этого переменные можно использовать безопасно, с поддержкой автодополнения и проверки типов:
const apiUrl: string = import.meta.env.API_URL;
Stencil позволяет внедрять значения переменных окружения непосредственно в компоненты через глобальные скрипты или напрямую:
import { Component, h, State } from '@stencil/core';
@Component({
tag: 'app-config-demo',
styleUrl: 'app-config-demo.css',
shadow: true
})
export class AppConfigDemo {
@State() apiUrl: string;
componentWillLoad() {
this.apiUrl = process.env.API_URL || 'http://localhost:3000';
}
render() {
return (
<div>
<p>API URL: {this.apiUrl}</p>
</div>
);
}
}
Использование @State обеспечивает реактивное обновление
интерфейса при изменении значения.
Stencil поддерживает оптимизацию кода на основе переменных окружения. Например, можно включать или отключать функциональность для разных сред:
if (process.env.NODE_ENV === 'production') {
console.log('Production mode: отключаем debug-логи');
} else {
console.log('Development mode: включены debug-логи');
}
На этапе сборки такие блоки могут быть автоматически удалены с помощью tree-shaking и terser, что снижает размер финального бандла.
Для проектов с несколькими средами полезно создавать конфигурационные файлы, которые динамически выбираются на основе переменных окружения:
const config = {
apiUrl: process.env.API_URL || 'http://localhost:3000',
analyticsKey: process.env.ANALYTICS_KEY || ''
};
export default config;
Доступ к конфигурации можно получать в любом компоненте или сервисе, что упрощает управление настройками приложения.
.env файлы и секреты CI/CD.Stencil легко интегрируется с системами непрерывной интеграции. На этапе сборки в CI/CD можно передавать переменные окружения, которые будут использоваться для генерации финальных бандлов:
API_URL=https://api.example.com NODE_ENV=production npm run build
Это позволяет создавать разные сборки без изменения исходного кода и поддерживать единый процесс деплоя для всех сред.
Переменные окружения в Stencil обеспечивают гибкость конфигурации, безопасное управление данными и возможность условной сборки, что делает их важным инструментом при разработке масштабных и многослойных приложений.