Конфигурация приложений JavaScript (Node.js): лучшие библиотеки и практики
Конфигурация — неотъемлемая часть любого современного приложения. В экосистеме Node.js существует множество подходов и библиотек, которые помогают гибко управлять настройками, параметрами окружения и секретными данными. В этой статье мы рассмотрим наиболее популярные инструменты для конфигурации приложений на JavaScript (Node.js), их особенности и примеры использования.
Зачем нужна отдельная конфигурация?
Хранение настроек непосредственно в коде — плохая практика. Причины:
- Безопасность: пароли, ключи API и токены не должны попадать в репозиторий;
- Гибкость: разные среды (development, staging, production) требуют разных параметров;
- Удобство: централизованное управление упрощает поддержку и масштабирование.
1. dotenv — простота и популярность
dotenv — самая распространённая библиотека для работы с переменными окружения. Она загружает настройки из файла .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();
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
Плюсы: минималистичность, огромное сообщество, поддержка TypeScript через типизацию.
Минусы: нет валидации, все значения — строки, сложно управлять сложными структурами.
2. convict — строгая валидация и схема
convict позволяет задавать схему конфигурации с типами, значениями по умолчанию и правилами валидации.
Установка:
npm install convict
Пример:
// config.js
const convict = require('convict');
const config = convict({
env: {
doc: 'Окружение приложения',
format: ['production', 'development', 'test'],
default: 'development',
env: 'NODE_ENV'
},
port: {
doc: 'Порт сервера',
format: 'port',
default: 3000,
env: 'PORT'
},
db: {
host: {
doc: 'Хост базы данных',
format: String,
default: 'localhost',
env: 'DB_HOST'
},
password: {
doc: 'Пароль БД',
format: String,
default: '',
env: 'DB_PASS',
sensitive: true
}
}
});
config.validate({ allowed: 'strict' });
module.exports = config;
Использование в приложении:
const config = require('./config');
console.log(config.get('db.host')); // localhost
console.log(config.get('port')); // 3000
Плюсы: строгая типизация, встроенная валидация, поддержка чувствительных данных.
Минусы: требует больше кода для схемы, менее гибкий в динамических сценариях.
3. nconf — иерархический подход
nconf позволяет комбинировать несколько источников конфигурации с приоритетами: аргументы командной строки, переменные окружения, файлы, объекты.
Установка:
npm install nconf
Пример:
const nconf = require('nconf');
// Определяем порядок источников (приоритет сверху вниз)
nconf
.argv() // 1. Аргументы командной строки
.env({ separator: '__' }) // 2. Переменные окружения (DB__HOST → db:host)
.file({ file: 'config.json' }); // 3. Файл конфигурации
// Значение по умолчанию
nconf.defaults({
app: {
port: 8080
}
});
console.log(nconf.get('app:port')); // 8080 или из env/argv
Плюсы: гибкость, поддержка вложенных ключей, работа с любыми источниками.
Минусы: сложная документация, избыточен для простых проектов.
4. config — модульная конфигурация для больших проектов
Пакет config (от lorenwest) автоматически загружает настройки из папки config/ в зависимости от NODE_ENV.
Установка:
npm install config