Skip to content

Node.js, разница между разработкой и продакшеном

В Node.js нет разницы между разработкой и продакшеном, то есть нет никаких специальных настроек, которые нужно применить, чтобы заставить Node.js работать в продакшн-конфигурации. Однако, некоторые библиотеки в реестре npm распознают использование переменной NODE_ENV и по умолчанию устанавливают ее в значение development. Всегда запускайте свой Node.js с установленным NODE_ENV=production.

Популярным способом конфигурации вашего приложения является использование методологии двенадцати факторов.

NODE_ENV в Express

Во всемирно популярном фреймворке express установка NODE_ENV в production обычно гарантирует, что:

  • ведение журнала сведено к минимуму, до необходимого уровня
  • используется больше уровней кэширования для оптимизации производительности

Обычно это делается путем выполнения команды

bash
export NODE_ENV=production

в оболочке, но лучше поместить ее в файл конфигурации вашей оболочки (например, .bash_profile с оболочкой Bash), потому что в противном случае настройка не сохраняется в случае перезагрузки системы.

Вы также можете применить переменную окружения, добавив ее перед командой инициализации вашего приложения:

bash
NODE_ENV=production node app.js

Например, в приложении Express вы можете использовать это для установки различных обработчиков ошибок для каждой среды:

javascript
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 проистекает из того, что разработчики объединяют оптимизации и поведение программного обеспечения со средой, в которой работает их программное обеспечение. В результате получается код, подобный следующему:

javascript
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, считается антипаттерном.