Skip to content

Node.js, la diferencia entre desarrollo y producción

No hay diferencia entre desarrollo y producción en Node.js, es decir, no hay configuraciones específicas que deba aplicar para que Node.js funcione en una configuración de producción. Sin embargo, algunas bibliotecas en el registro npm reconocen el uso de la variable NODE_ENV y la establecen por defecto en development. Ejecute siempre su Node.js con NODE_ENV=production establecido.

Una forma popular de configurar su aplicación es utilizando la metodología de los doce factores.

NODE_ENV en Express

En el popular framework express, configurar NODE_ENV en producción generalmente asegura que:

  • El registro se mantiene al mínimo, nivel esencial.
  • Se producen más niveles de almacenamiento en caché para optimizar el rendimiento.

Esto generalmente se hace ejecutando el comando

bash
export NODE_ENV=production

en la shell, pero es mejor colocarlo en su archivo de configuración de shell (por ejemplo, .bash_profile con la shell Bash) porque de lo contrario, la configuración no persiste en caso de un reinicio del sistema.

También puede aplicar la variable de entorno anteponiéndola a su comando de inicialización de la aplicación:

bash
NODE_ENV=production node app.js

Por ejemplo, en una aplicación Express, puede usar esto para establecer diferentes manejadores de errores por entorno:

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());
}

Por ejemplo, Pug, la biblioteca de plantillas utilizada por Express.js, compila en modo depuración si NODE_ENV no está configurado en production. Las vistas de Express se compilan en cada solicitud en modo desarrollo, mientras que en producción se almacenan en caché. Hay muchos más ejemplos.

Esta variable de entorno es una convención ampliamente utilizada en bibliotecas externas, pero no dentro de Node.js mismo.

¿Por qué NODE_ENV se considera un antipatrón?

Un entorno es una plataforma digital o un sistema donde los ingenieros pueden construir, probar, implementar y gestionar productos de software. Convencionalmente, hay cuatro etapas o tipos de entornos donde se ejecuta nuestra aplicación:

  • Desarrollo
  • Staging
  • Producción
  • Pruebas

El problema fundamental de NODE_ENV proviene de que los desarrolladores combinan optimizaciones y comportamiento del software con el entorno en el que se ejecuta su software. El resultado es código como el siguiente:

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') {
  // ...
}

Si bien esto puede parecer inofensivo, hace que los entornos de producción y staging sean diferentes, lo que hace que las pruebas confiables sean imposibles. Por ejemplo, una prueba y, por lo tanto, una funcionalidad de su producto podría pasar cuando NODE_ENV se establece en development, pero fallar al establecer NODE_ENV en production. Por lo tanto, establecer NODE_ENV en algo que no sea production se considera un antipatrón.