Конфигурация приложений JavaScript (Node.js)
Любое современное Node.js-приложение требует гибкого управления настройками: параметры базы данных, API-ключи, порты, уровни логирования. Правильная конфигурация — это не просто чтение файлов, а целая культура безопасности, тестируемости и портабельности. В этой статье мы разберём ключевые библиотеки и подходы, которые помогут вам организовать конфигурацию в проектах на JavaScript (Node.js).
Зачем нужны отдельные инструменты для конфигурации?
Ручное управление через process.env или JSON-файлы быстро приводит к хаосу. Среди основных проблем:
- Смешивание секретов (паролей) с кодом — угроза безопасности при попадании в репозиторий.
- Отсутствие валидации — опечатка в имени переменной может вызвать трудноотловимую ошибку.
- Сложность поддержки разных окружений (dev, staging, production).
1. dotenv — стандарт для переменных окружения
Самая популярная библиотека (более 25 млн загрузок в неделю). Загружает переменные из файла .env в process.env. Идеально для локальной разработки.
Установка и базовая настройка
npm install dotenv
Создайте файл .env в корне проекта:
PORT=3000
DB_HOST=localhost
DB_USER=admin
DB_PASS=secret123
Подключите в самом начале вашего главного файла (например, app.js):
require('dotenv').config();
const express = require('express');
const app = express();
app.listen(process.env.PORT, () => {
console.log(`Server running on port ${process.env.PORT}`);
});
Важно: никогда не коммитьте .env в Git! Добавьте его в .gitignore. Вместо этого создайте .env.example с шаблоном.
Кастомный путь и несколько файлов
// Загрузка из конкретного пути
require('dotenv').config({ path: '/custom/path/.env' });
// Поддержка нескольких окружений
if (process.env.NODE_ENV === 'production') {
require('dotenv').config({ path: '.env.production' });
} else {
require('dotenv').config({ path: '.env.development' });
}
2. config — иерархическая конфигурация
Библиотека config (от создателей node-config) предлагает мощную систему с дефолтными настройками, переопределением для окружений и поддержкой разных форматов (JSON, YAML, JS).
Структура папок
config/
default.json # Базовые настройки
production.json # Продакшн-переопределения
development.json # Локальные переопределения
custom-environment-variables.json # Маппинг на process.env
Пример default.json:
{
"server": {
"port": 3000,
"host": "localhost"
},
"db": {
"host": "localhost",
"port": 5432,
"name": "myapp"
}
}
Использование в коде:
const config = require('config');
const dbConfig = config.get('db');
console.log(`Connecting to ${dbConfig.host}:${dbConfig.port}/${dbConfig.name}`);
Фишка: автоматически выбирает файл в зависимости от NODE_ENV. Если NODE_ENV=production, то мержит default.json + production.json.
3. nconf — гибкая иерархия источников
nconf позволяет комбинировать несколько источников настроек с приоритетами: аргументы командной строки → переменные окружения → файлы → значения по умолчанию.
const nconf = require('nconf');
// Определяем иерархию (сверху — наивысший приоритет)
nconf
.argv() // Аргументы командной строки
.env('__') // Переменные окружения (разделитель __ для вложенности)
.file({ file: 'config.json' }) // Файл конфигурации
.defaults({
'app': {
'port': 8080,
'host': '0.0.0.0'
}
});
// Использование
const port = nconf.get('app:port');
console.log(`App will run on port ${port}`);
// Запуск: node app.js --app:port=9090 (переопределит файл и env)
Плюс: идеально для CLI-утилит и микросервисов, где конфигура
Также в библиотеке
Миграции баз данных в TypeScript: TypeORM, Prisma и Drizzle
Prisma для TypeScript: полное руководство с примерами
Rate Limiting в Node.js: Полное руководство по защите API и управлению нагрузкой
inversify для TypeScript: полное руководство с примерами