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, библиотека шаблонизации, используемая Express.js, компилируется в режиме отладки, если NODE_ENV
не установлен в production
. Представления Express компилируются при каждом запросе в режиме разработки, а в режиме production они кэшируются. Существует множество других примеров.
Эта переменная среды является соглашением, широко используемым во внешних библиотеках, но не в самом Node.js.
Почему NODE_ENV считается антипаттерном?
Среда — это цифровая платформа или система, где инженеры могут создавать, тестировать, развертывать и управлять программными продуктами. Условно существует четыре этапа или типа сред, в которых запускается наше приложение:
- Разработка
- Предварительное производство (Staging)
- Производство
- Тестирование
Фундаментальная проблема 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
, считается антипаттерном.