← Назад к вопросам

Что такое переменная окружения?

1.0 Junior🔥 122 комментариев
#JavaScript Core

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое переменная окружения?

Переменная окружения (environment variable) — это именованная динамическая величина, которая хранит данные, влияющие на поведение запущенных процессов (программ, скриптов) в операционной системе или среде выполнения. Это ключевой механизм конфигурации и управления приложениями без изменения их исходного кода.

Основные характеристики и назначение

  • Динамические значения: Позволяют изменять поведение программы без её перекомпиляции или модификации кода.
  • Глобальная или локальная область видимости: Могут быть определены на уровне:
    *   **Системы** (доступны всем пользователям и процессам).
    *   **Пользователя** (доступны только конкретному пользователю).
    *   **Сессии/процесса** (существуют только во время текущего сеанса командной оболочки или передаются конкретному дочернему процессу).
  • Ключ-значение: Простая структура данных в формате ИМЯ=значение.

Типичные сценарии использования в разработке:

  1. Управление конфигурацией для разных сред (Dev, Stage, Prod).
    *   URL базы данных, логины и пароли.
    *   Ключи API внешних сервисов (платежных систем, почтовых серверов, CDN).
    *   Флаги функциональности (например, включение режима отладки).

  1. Хранение чувствительной информации (секретов).
    *   **Никогда не хранятся в системе контроля версий (Git).** Для этого используют файлы `.env` (которые добавлены в `.gitignore`) или специальные сервисы управления секретами (HashiCorp Vault, AWS Secrets Manager).

  1. Определение путей и настроек системы.
    *   `PATH` — самый известный пример, содержит список директорий, где ОС ищет исполняемые файлы.
    *   `HOME` / `USERPROFILE` — путь к домашней директории пользователя.
    *   `NODE_ENV` — широко используется в Node.js-экосистеме для определения текущего окружения (`development`, `production`, `test`).

Практический пример: Node.js приложение

Представьте простое приложение, которое подключается к базе данных и внешнему API.

Без переменных окружения (ЖЕСТКОЕ ЗАДАНИЕ В КОДЕ — ПЛОХАЯ ПРАКТИКА):

// app.js (НЕПРАВИЛЬНЫЙ ПОДХОД)
const dbHost = 'localhost';
const dbPassword = 'super_secret_123';
const apiKey = 'live_abc123def456';

connectToDatabase(dbHost, dbPassword);
fetchDataFromExternalAPI(apiKey);

Такой код опасен: секреты попадут в репозиторий, а для смены окружения придется редактировать код.

С переменными окружения (ПРАВИЛЬНЫЙ ПОДХОД):

// app.js
const dbHost = process.env.DB_HOST;
const dbPassword = process.env.DB_PASSWORD;
const apiKey = process.env.EXTERNAL_API_KEY;

connectToDatabase(dbHost, dbPassword);
fetchDataFromExternalAPI(apiKey);

Теперь значения задаются вне кода:

  1. В командной строке (для текущей сессии):

    export DB_HOST="prod-db.example.com"
    export DB_PASSWORD="actual_prod_password"
    node app.js
    
  2. Через файл .env (используя пакет dotenv):

    # .env файл (ДОБАВЛЕН В .gitignore!)
    DB_HOST=localhost
    DB_PASSWORD=dev_password
    EXTERNAL_API_KEY=test_key_789
    NODE_ENV=development
    
    // В начале файла приложения (обычно в index.js/app.js)
    require('dotenv').config();
    // Теперь process.env загрузил значения из .env файла
    
  3. В настройках хостинга (Heroku, Vercel, Netlify) или CI/CD (GitHub Actions, GitLab CI):

    *   Это графические интерфейсы или конфигурационные файлы, где задаются пары ключ-значение для production-сборок.

Работа с переменными окружения в разных оболочках

  • Linux/macOS (Bash/Zsh):

    # Установить переменную для текущей сессии
    export MY_VAR="value"
    # Просмотреть все переменные
    env
    # Просмотреть конкретную переменную
    echo $MY_VAR
    # Добавить переменную для текущей сессии и сразу запустить команду
    MY_VAR="value" node script.js
    
  • Windows (Command Prompt):

    set MY_VAR=value
    echo %MY_VAR%
    
  • Windows (PowerShell):

    $env:MY_VAR="value"
    echo $env:MY_VAR
    

Важные принципы безопасности и best practices

  • .env в .gitignore: Всегда исключайте файлы с переменными из контроля версий.
  • Пример .env файла: Создавайте в репозитории файл .env.example, который содержит имена необходимых переменных (без реальных значений), чтобы новый разработчик понимал, что ему нужно настроить.
  • Валидация на старте: При запуске приложения полезно проверять наличие критически важных переменных окружения.
    const requiredEnvVars = ['DB_HOST', 'API_KEY'];
    requiredEnvVars.forEach(varName => {
      if (!process.env[varName]) {
        throw new Error(`Необходимо задать переменную окружения: ${varName}`);
      }
    });
    
  • Типизация (для TypeScript): Используйте декларации или библиотеки для получения строго типизированных значений.
    // Можете объявить типы
    declare global {
      namespace NodeJS {
        interface ProcessEnv {
          NODE_ENV: 'development' | 'production' | 'test';
          PORT?: string;
          DB_HOST: string;
        }
      }
    }
    // Или использовать проверку и преобразование
    const port = parseInt(process.env.PORT || '3000');
    

Таким образом, переменные окружения — это фундаментальный инструмент для создания гибких, безопасных и легко настраиваемых приложений, позволяющий отделить конфигурацию от кода и адаптировать программу к любому окружению выполнения.