Node.js, разница между разработкой и продакшеном
В Node.js нет разницы между разработкой и продакшеном
, то есть нет никаких специальных настроек, которые нужно применить, чтобы заставить Node.js работать в продакшн-конфигурации. Однако, некоторые библиотеки в реестре npm распознают использование переменной NODE_ENV
и по умолчанию устанавливают ее в значение development
. Всегда запускайте свой Node.js с установленным NODE_ENV=production
.
Популярным способом конфигурации вашего приложения является использование методологии двенадцати факторов.
NODE_ENV в Express
Во всемирно популярном фреймворке express установка NODE_ENV в production обычно гарантирует, что:
- ведение журнала сведено к минимуму, до необходимого уровня
- используется больше уровней кэширования для оптимизации производительности
Обычно это делается путем выполнения команды
export NODE_ENV=production
в оболочке, но лучше поместить ее в файл конфигурации вашей оболочки (например, .bash_profile
с оболочкой Bash), потому что в противном случае настройка не сохраняется в случае перезагрузки системы.
Вы также можете применить переменную окружения, добавив ее перед командой инициализации вашего приложения:
NODE_ENV=production node app.js
Например, в приложении Express вы можете использовать это для установки различных обработчиков ошибок для каждой среды:
if (process.env.NODE_ENV === 'development') {
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
}
if (process.env.NODE_ENV === 'production') {
app.use(express.errorHandler());
}
Например, [Pug](https://pugjs.org], библиотека шаблонов, используемая [Express.js](https://expressjs.com], компилируется в режиме отладки, если NODE_ENV
не установлено в production
. Представления Express компилируются при каждом запросе в режиме разработки, а в продакшене они кэшируются. Есть много других примеров.
Эта переменная окружения является соглашением, широко используемым во внешних библиотеках, но не в самом Node.js.
Почему NODE_ENV считается антипаттерном?
Среда — это цифровая платформа или система, где инженеры могут создавать, тестировать, развертывать и управлять программными продуктами. Обычно существует четыре этапа или типа сред, в которых запускается наше приложение:
- Разработка
- Промежуточное тестирование
- Продакшен
- Тестирование
Основная проблема NODE_ENV
проистекает из того, что разработчики объединяют оптимизации и поведение программного обеспечения со средой, в которой работает их программное обеспечение. В результате получается код, подобный следующему:
if (process.env.NODE_ENV === 'development') {
// ...
}
if (process.env.NODE_ENV === 'staging') {
// ...
}
if (process.env.NODE_ENV === 'production') {
// ...
}
if (process.env.NODE_ENV === 'testing') {
// ...
}
Хотя это может выглядеть безобидно, это делает среды продакшена и промежуточного тестирования разными, что делает надежное тестирование невозможным. Например, тест и, следовательно, функциональность вашего продукта могут пройти, когда NODE_ENV
установлено в development
, но потерпят неудачу при установке NODE_ENV
в production
. Поэтому установка NODE_ENV
в любое значение, кроме production
, считается антипаттерном.