Конфигурация приложений 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