Конфигурация приложений TypeScript: библиотеки и подходы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Конфигурация приложений TypeScript: обзор инструментов и подходов

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

Почему важна правильная конфигурация?

Конфигурация включает в себя:

  • Переменные окружения (API-ключи, URL базы данных)
  • Параметры среды (development, staging, production)
  • Настройки фреймворков и библиотек
  • Секретные данные (пароли, токены)

Использование TypeScript добавляет преимущества строгой типизации, что позволяет избежать ошибок на этапе компиляции. Рассмотрим лучшие инструменты для работы с конфигурацией.

1. dotenv — базовый инструмент для переменных окружения

Библиотека dotenv загружает переменные из файла .env в process.env. В TypeScript её часто используют с дополнительными типами.

Установка

npm install dotenv
npm install -D @types/node   # для типов process.env

Пример использования

// .env
PORT=3000
DATABASE_URL=mongodb://localhost:27017/mydb
SECRET_KEY=mysecretkey

// config.ts
import dotenv from 'dotenv';
dotenv.config();

interface AppConfig {
    port: number;
    databaseUrl: string;
    secretKey: string;
}

export const config: AppConfig = {
    port: parseInt(process.env.PORT || '3000', 10),
    databaseUrl: process.env.DATABASE_URL || '',
    secretKey: process.env.SECRET_KEY || '',
};

Плюсы: простота, легковесность, стандарт де-факто.
Минусы: нет валидации, все значения — строки.

2. config — иерархическая конфигурация для Node.js

Библиотека config позволяет организовать конфигурационные файлы по средам (default.json, production.json, development.json).

Установка

npm install config
npm install -D @types/config

Пример структуры

// config/default.json
{
    "server": {
        "port": 3000
    },
    "db": {
        "host": "localhost",
        "port": 27017
    }
}

// config/production.json
{
    "server": {
        "port": 8080
    },
    "db": {
        "host": "production-db.example.com"
    }
}

// app.ts
import config from 'config';

interface ServerConfig {
    port: number;
}

const serverConfig = config.get<ServerConfig>('server');
console.log(serverConfig.port); // 3000 в dev, 8080 в production

Плюсы: иерархия, автоматический выбор среды, поддержка TypeScript.
Минусы: требует файловой системы, не подходит для serverless.

3. convict — конфигурация со схемой и валидацией

convict позволяет задавать строгую схему конфигурации с типами, значениями по умолчанию и валидацией.

Установка

npm install convict
npm install -D @types/convict

Пример

import convict from 'convict';

const config = convict({
    env: {
        doc: 'Application environment',
        format: ['production', 'development', 'test'],
        default: 'development',
        env: 'NODE_ENV'
    },
    port: {
        doc: 'Port to bind',
        format: 'port',
        default: 3000,
        env: 'PORT'
    },
    db: {
        host: {
            doc: 'Database host',
            format: String,
            default: 'localhost',
            env: 'DB_HOST'
        },
        port: {
            doc: 'Database port',
            format: 'port',
            default: 5432,
            env: 'DB_PORT'
        }
    }
});

config.validate({ allowed: 'strict' });

export default config.getProperties();

Плюсы: строгая типизация, валидация, документация на лету.
Минусы: более сложная настройка, избыточна для простых проектов.

4. env-var — простой и типобезопасный доступ к переменным окружения

Библиотека env-var предоставляет удобный API для чтения переменных окружения с автоматическим приведением типов.

Установка

npm install env-var

Пример

import { from } from 'env-var';

const env = from(process.env);

export const config = {
    port: env.get('PORT').required().asPortNumber                    

Рекомендаций