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, библиотека шаблонизации, используемая Express.js, компилируется в режиме отладки, если NODE_ENV не установлен в production. Представления Express компилируются при каждом запросе в режиме разработки, а в режиме production они кэшируются. Существует множество других примеров.

Эта переменная среды является соглашением, широко используемым во внешних библиотеках, но не в самом Node.js.

Почему NODE_ENV считается антипаттерном?

Среда — это цифровая платформа или система, где инженеры могут создавать, тестировать, развертывать и управлять программными продуктами. Условно существует четыре этапа или типа сред, в которых запускается наше приложение:

  • Разработка
  • Предварительное производство (Staging)
  • Производство
  • Тестирование

Фундаментальная проблема 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, считается антипаттерном.