Cómo configurar NODE_ENV para producción / desarrollo en OS X

Respuestas:

664

Antes de ejecutar su aplicación, puede hacerlo en la consola,

export NODE_ENV=production

O si estás en Windows, puedes probar esto:

SET NODE_ENV=production

o puedes ejecutar tu aplicación así:

NODE_ENV=production node app.js

También puede configurarlo en su archivo js:

process.env.NODE_ENV = 'production';

Pero no sugiero hacerlo en su archivo de tiempo de ejecución, ya que no es fácil abrir VIM en su servidor y cambiarlo a producción. Puede crear un archivo config.json en su directorio y cada vez que se ejecuta su aplicación, se lee y establece la configuración.

Farid Nouri Neshat
fuente
12
Este es un mal consejo. Será complicado configurarlo de process.env.NODE_ENVmanera confiable desde la propia aplicación. Mejor configure su variable de entorno correctamente como Daniel enlazó a continuación.
MK Safi
15
Soy fanático de configurar NODE_ENVexplícitamente cada vez que ejecuta la aplicación, como en el segundo ejemplo ( NODE_ENV=production node app.js). De esa manera, potencialmente se salvará de algunos tirones futuros en el caso de que olvide NODE_ENVvolver a configurar su local development.
Jon
No tan brillante en absoluto. Cada vez que ejecuta su aplicación, debe agregar esa variable de entorno. Eso apesta. Publicado mejor solución a continuación.
Lukas Liesis
2
Consulte npmjs.com/package/cross-env para obtener una solución multiplataforma simple. cross-env NODE_ENV=productionFunciona en Windows y Linux / Mac.
AntonB
1
@Gleb NODE_ENV=production forever app.jsdebería funcionar.
Farid Nouri Neshat
102

en package.json:

{
  ...
  "scripts": {
    "start": "NODE_ENV=production node ./app"
  }
  ...
}

luego ejecutar en la terminal:

npm start
Taro Alan
fuente
1
no comience a poner un montón de scripts en package.json, es una mala práctica porque introduce inconsistencias y mata la inmutabilidad en sus proyectos. Sé que muchas personas crean scripts para ejecutar gruñidos o tragos, pero no lo hacen
PositiveGuy
38
@WeDoTDD ¿de qué estás hablando? Estos scripts están destinados a ser utilizados de manera similar a cómo funciona el archivo MAKE. Usarlo como este ejemplo o como has mencionado para ejecutar gulp es un caso de uso perfectamente razonable. Para tareas simples, ahora ni siquiera uso gulp y lo hago todo dentro del script, es mucho más rápido hacer que las cosas funcionen y dejo que webpack haga el trabajo que solía hacer gulp.
Marko Grešak
15
@WTF - ¿Qué quieres decir con que es una "mala práctica" usar scripts en package.json? Ese es el punto de la sección de guiones: ¡poner guiones! Es perfectamente válido y elimina la necesidad de tragar o gruñir. Todo hecho a través de comando y webpack.
TetraDev
66
@WTF El uso de scripts en realidad mejora enormemente la consistencia. Puede configurar un conjunto estándar de comandos para usar en varios proyectos que pueden no usar los mismos scripts de compilación subyacentes, bibliotecas, etc. Al menos podría intentar respaldar su punto con hechos y ejemplos.
Lewis Diamond
44
Poner NODE_ENV=productionen package.json no tiene mucho sentido. Ejecutar npm starten desarrollo lo ejecutará en producción. Puede escribir su código como si siempre fuera producción, ya que siempre lo ejecuta de esa manera. La razón por la que veo para hacer esto sería forzar a otros módulos (por ejemplo, Express) a ejecutarse en modo de producción. ¿Por qué usar variables de entorno si nunca cambian?
Nateowami el
65

¿Nadie mencionado .envaquí todavía? Haga un .envarchivo en la raíz de su aplicación require('dotenv').config()y luego lea los valores. Fácilmente cambiado, fácil de leer, multiplataforma.

https://www.npmjs.com/package/dotenv

Thomas McCabe
fuente
1
Extraño nadie lo menciona, la mejor solución en mi opinión. Ponga el nombre del entorno en el mismo archivo con el resto de las variables.
Asinus Rex
2
Configurar NODE_ENV en el archivo .env no funcionará. Vea esto: github.com/motdotla/dotenv/issues/328
Michael Zelensky
Para mí, la configuración "mode": "production"en el .envarchivo funcionó.
DarkLite1
46

export NODE_ENV=production Es una mala solución, desaparece después de reiniciar.

si no quiere preocuparse más por esa variable, agréguela a este archivo:

/etc/environment

no use la sintaxis de exportación, solo escriba (en una nueva línea si ya hay contenido):

NODE_ENV=production

Funciona después de reiniciar. Ya no tendrá que volver a ingresar el comando export NODE_ENV = production en ningún lugar y simplemente usar el nodo con cualquier cosa que desee, para siempre, pm2 ...

Para heroku:

heroku config:set NODE_ENV="production"

que en realidad es por defecto

Lukas Liesis
fuente
2
Pesadilla de mantenimiento. ¿Qué pasa con una caja donde no tienes permisos para / etc?
Thomas McCabe
1
Yo personalmente uso NODE_ENV=production gulp bundle-production-apppara agrupar secuencias de comandos listas para producción, en el servidor NODE_ENV está en el entorno del servidor y en la máquina de desarrollo no está allí. En algunas máquinas es una pesadilla si no está configurado y espera tenerlo configurado siempre . En algunos, espera no tenerlo, por lo que no agrega. De todos modos, al hacer las IU, dejo en claro si está en modo de desarrollo para que nunca tenga una pregunta si está activado o desactivado. Si NODE_ENV es! == producción, es evidente que estás en otro modo, así que no hay pesadilla en absoluto. Todo claro, todo bien.
Lukas Liesis
+1 por hablar sobre cómo hacer que persista. Me pregunto cuántas personas lo han establecido solo en la sesión actual pensando que persistirá. ¿Qué pasa antes de un reinicio? Si desea configurarlo de inmediato, ¿debería ponerlo /etc/environment y ejecutarlo export NODE_ENV=production?
Nateowami el
24

Para no tener que preocuparse si está ejecutando sus scripts en Windows, Mac o Linux, instale el paquete cross-env . Entonces puedes usar tus scripts fácilmente, así:

"scripts": {
    "start-dev": "cross-env NODE_ENV=development nodemon --exec babel-node -- src/index.js",
    "start-prod": "cross-env NODE_ENV=production nodemon --exec babel-node -- src/index.js"
}

Apoyos masivos para los desarrolladores de este paquete.

npm install --save-dev cross-env
Notorio
fuente
22
heroku config:set NODE_ENV="production"
david_adler
fuente
2
ahhh esto es lo que necesitaba. eres increíble
Connor Leech
55
NODE_ENV=productionahora es el valor predeterminado en implementaciones de Heroku node.js.
sean
1
heroku no es el único lugar para desplegar
Pavan Katepalli
9

Para Windows Powershell, use este comando

$env:NODE_ENV="production" ; node app.js
Harikrishnan
fuente
6

En OSX, recomendaría agregar export NODE_ENV=developmenta su ~/.bash_profiley / o ~/.bashrcy / o ~/.profile.

Personalmente agrego esa entrada a mi ~/.bashrcy luego hago que ~/.bash_profile ~/.profileimporte el contenido de ese archivo, para que sea coherente en todos los entornos.

Después de hacer estas adiciones, asegúrese de reiniciar su terminal para recoger la configuración.

Vincil Bishop
fuente
2

Si estás en windows. Abra su cmd en la carpeta correcta y luego primero

set node_env={your env name here}

pulsa enter, entonces puedes comenzar tu nodo con

node app.js

comenzará con su configuración de env

garenyondem
fuente
1
¿No desaparecerá después de reiniciar? No tengo ventanas, no puedo probarlo yo mismo.
Lukas Liesis
Si está preguntando sobre el reinicio del nodo, no, no desaparecerá hasta que cierre completamente el símbolo del sistema. Pero si Windows Server se reinicia ofc, desaparecerá.
garenyondem
2
hablando de reinicio del sistema operativo. Es por eso que mejor encuentro otra forma de dejar de preguntarme cada vez que se instalan actualizaciones de Windows, o simplemente cualquier reinicio, sobre este problema una y otra vez.
Lukas Liesis
2

Si usa webpack en su aplicación, simplemente puede configurarlo allí, usando DefinePlugin...

Entonces, en su pluginsección, configure el NODE_ENV en production:

plugins: [
  new webpack.DefinePlugin({
    'process.env.NODE_ENV': '"production"',
  })
]
Alireza
fuente
1

Para tener múltiples entornos, necesita todas las respuestas antes (parámetro NODE_ENV y exportarlo), pero utilizo un enfoque muy simple sin la necesidad de instalar nada. En su package.json solo ponga un script para cada env que necesite, de esta manera:

...
"scripts": {
    "start-dev": "export NODE_ENV=dev && ts-node-dev --respawn --transpileOnly ./src/app.ts",
    "start-prod": "export NODE_ENV=prod && ts-node-dev --respawn --transpileOnly ./src/app.ts"
  }
 ...

Luego, para iniciar la aplicación en lugar de usar el npm startuso npm run script-prod.

En el código puede acceder al entorno actual con process.env.NODE_ENV.

Voila

rmpt
fuente
NODE_ENV debe ser "desarrollo" o "producción"; el código de terceros no reconoce lo anterior (aunque puede estar buscando en process.env)
John Culviner
1

Windows CMD -> set NODE_ENV=production

Windows Powershell -> $env:NODE_ENV="production"

MAC -> export NODE_ENV=production

Janith Udara
fuente
0

Daniel tiene una respuesta fantástica, que es el mejor enfoque para el proceso correcto de implementación (configurar y olvidar).

Para aquellos que usan express. Puedes usar grunt-express-server, que también es fantástico. https://www.npmjs.org/package/grunt-express-server

Jesse
fuente
0

Puede ser una posibilidad que haya realizado dos instancias de secuenciar objetos

por ejemplo: var con1 = new Sequelize (); var con2 = new Sequelize ();

que también ocurrirá el mismo error

Prakhar Dixit
fuente