Como definir NODE_ENV para produção / desenvolvimento no OS X

Respostas:

663

Antes de executar seu aplicativo, você pode fazer isso no console,

export NODE_ENV=production

Ou, se você estiver no Windows, tente o seguinte:

SET NODE_ENV=production

ou você pode executar seu aplicativo assim:

NODE_ENV=production node app.js

Você também pode configurá-lo no seu arquivo js:

process.env.NODE_ENV = 'production';

Mas não sugiro fazer isso no seu arquivo de tempo de execução, pois não é fácil abrir o VIM no servidor e alterá-lo para produção. Você pode criar um arquivo config.json em seu diretório e sempre que seu aplicativo é executado, ele lê e define a configuração.

Farid Nouri Neshat
fonte
12
Este é um mau conselho. Será complicado definir de process.env.NODE_ENVforma confiável a partir do próprio aplicativo. É melhor definir sua variável de ambiente corretamente, como Daniel vinculado abaixo.
MK Safi
15
Sou fã de definir NODE_ENVexplicitamente toda vez que você executa o aplicativo, como no segundo exemplo ( NODE_ENV=production node app.js). Dessa forma, você potencialmente se poupará de algum puxão de cabelo no futuro, caso esqueça de NODE_ENVvoltar ao local development.
Jon
Não é tão brilhante assim. Toda vez que você executa seu aplicativo, você deve adicionar esse env var. Isso é péssimo. Postado melhor solução abaixo.
Lukas Liesis
2
Consulte npmjs.com/package/cross-env para obter uma solução simples de plataforma cruzada. cross-env NODE_ENV=productionfunciona em windows e linux / mac.
Antonb
1
@Gleb NODE_ENV=production forever app.jsdeve funcionar.
Farid Nouri Neshat
102

no package.json:

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

depois corra no terminal:

npm start
Taro Alan
fonte
1
não comece a colocar vários scripts no package.json, é uma prática ruim porque você apresenta inconsistências e mata a imutabilidade em seus projetos. Eu conheço um monte de gente criar scripts para executar grunhido ou gole, mas não faça isso
PositiveGuy
38
@WeDoTDD do que você está falando? Esses scripts devem ser usados ​​da mesma forma que o makefile funciona. Usá-lo como este exemplo ou como você mencionou para executar o gulp é um caso de uso perfeitamente razoável. Para tarefas simples, agora nem uso o gulp e faço tudo isso dentro do script, é muito mais rápido fazer as coisas funcionarem e deixo o webpack fazer o trabalho que costumava ser feito pelo gulp.
Marko Grešak 9/11/2015
15
@WTF - Como assim, é "má prática" usar scripts no package.json? Esse é o objetivo da seção scripts: colocar scripts! É perfeitamente válido e elimina a necessidade de engolir ou grunhir. Tudo feito via comando e webpack.
TetraDev
6
@WTF O uso de scripts realmente melhora bastante a consistência. Você pode configurar um conjunto padrão de comandos a serem usados ​​em vários projetos, que podem não usar os mesmos scripts de construção subjacentes, bibliotecas, etc. Você pode pelo menos tentar apoiar seu argumento com fatos e exemplos.
Lewis Diamond
4
Colocar NODE_ENV=productionno package.json não faz muito sentido. A execução npm startno desenvolvimento executará na produção. Você pode escrever seu código como se fosse sempre produção, desde que você sempre o execute dessa maneira. A única razão pela qual vejo isso é forçar outros módulos (por exemplo, o Express) a serem executados no modo de produção. Por que usar variáveis ​​de ambiente se elas nunca mudam?
Nateowami
65

Ninguém mencionou .envaqui ainda? Crie um .envarquivo na raiz do aplicativo require('dotenv').config()e leia os valores. Facilmente alterado, de fácil leitura e multiplataforma.

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

Thomas McCabe
fonte
1
Estranho, ninguém menciona, a melhor solução na minha opinião. Coloque o nome do ambiente no mesmo arquivo com o restante das variáveis.
Asinus Rex 14/03/19
2
Definir NODE_ENV no arquivo .env não funcionará. Veja isso: github.com/motdotla/dotenv/issues/328
Michael Zelensky
Para mim, definindo "mode": "production"no .envarquivo funcionou.
DarkLite1
46

export NODE_ENV=production é uma solução ruim, desaparece após o reinício.

se você não quiser mais se preocupar com essa variável - adicione-a neste arquivo:

/etc/environment

não use sintaxe de exportação, basta escrever (em nova linha, se já houver algum conteúdo):

NODE_ENV=production

funciona após o reinício. Você não precisará digitar novamente o comando export NODE_ENV = production em qualquer lugar e apenas usar o nó com o que quiser - para sempre, pm2 ...

Para heroku:

heroku config:set NODE_ENV="production"

que é realmente o padrão.

Lukas Liesis
fonte
2
Pesadelo de manutenção. Que tal uma caixa onde você não tem permissões para / etc?
Thomas McCabe
1
Eu pessoalmente uso NODE_ENV=production gulp bundle-production-apppara agrupar scripts prontos para produção, no servidor NODE_ENV está no ambiente do servidor e na máquina dev não está lá. Em algumas máquinas, é um pesadelo se não estiver definido e você espera que ele esteja definido sempre . Em alguns, você espera não tê-lo, para não adicioná-lo. De qualquer forma, ao fazer interfaces, deixo claro se está no modo de desenvolvimento, para que você nunca tenha uma pergunta se está ligado ou desligado. Se NODE_ENV é! == produção, está na sua cara que você está em outro modo, então não há pesadelo. Tudo claro, tudo de bom.
Lukas Liesis
+1 por falar sobre como fazê-lo persistir. Gostaria de saber quantas pessoas o definiram apenas na sessão atual, pensando que isso persistirá. Que tal antes de uma reinicialização? Se você deseja configurá-lo imediatamente, deve instalá-lo /etc/environment e executá-lo export NODE_ENV=production?
Nateowami
24

Para não precisa se preocupar se você está executando seus scripts em Windows, Mac ou Linux instalar o cross-env pacote. Então você pode usar seus scripts facilmente, assim:

"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"
}

Acessórios maciços para os desenvolvedores deste pacote.

npm install --save-dev cross-env
Notório
fonte
22
heroku config:set NODE_ENV="production"
david_adler
fonte
2
ahhh, era disso que eu precisava. você é incrível
Connor Sanguessuga
5
NODE_ENV=productionagora é o padrão no Heroku node.js implementado.
sean
1
heroku não é o único lugar para implantar
Pavan Katepalli
9

Para o Windows PowerShell, use este comando

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

No OSX, eu recomendo adicionar export NODE_ENV=developmentao seu ~/.bash_profilee / ou ~/.bashrce / ou ~/.profile.

Pessoalmente, adiciono essa entrada à minha ~/.bashrce, em seguida, ~/.bash_profile ~/.profileimporto o conteúdo desse arquivo, para que seja consistente entre os ambientes.

Depois de fazer essas adições, reinicie o terminal para pegar as configurações.

Vincil Bishop
fonte
2

Se você estiver no Windows. Abra seu cmd na pasta direita e depois primeiro

set node_env={your env name here}

pressione enter, então você pode iniciar seu nó com

node app.js

começará com sua configuração de ambiente

garenyondem
fonte
1
não desaparecerá após o reinício? Não tem janelas, não posso tentar.
Lukas Liesis
Se você estiver perguntando sobre a reinicialização do nó não, ele não desaparecerá até você fechar completamente o prompt de comando. Mas se o Windows Server reiniciar, ele desaparecerá.
precisa saber é o seguinte
2
falando sobre reiniciar o sistema operacional. É por isso que é melhor eu encontrar outra maneira de parar de me perguntar toda vez que o Windows instala atualizações ou qualquer reinicialização sobre esse problema repetidamente.
Lukas Liesis 6/03/16
2

Se você estiver usando o webpack em seu aplicativo, basta configurá-lo lá, usando DefinePlugin...

Portanto, na sua pluginseção, defina o NODE_ENV para production:

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

Para ter vários ambientes, você precisa de todas as respostas antes (parâmetro NODE_ENV e exportá-lo), mas eu uso uma abordagem muito simples, sem a necessidade de instalar nada. No seu package.json basta colocar um script para cada ambiente que você precisa, assim:

...
"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"
  }
 ...

Em seguida, inicie o aplicativo em vez de usar o npm startuso npm run script-prod.

No código, você pode acessar o ambiente atual com process.env.NODE_ENV.

Voila.

rmpt
fonte
NODE_ENV deve ser "desenvolvimento" ou "produção", o que foi dito acima não é reconhecido pelo código de terceiros (embora você possa estar olhando para process.env)
John Culviner 17/01
1

CMD do Windows -> set NODE_ENV=production

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

MAC -> export NODE_ENV=production

Janith Udara
fonte
0

Daniel tem uma resposta fantástica, que é a melhor abordagem para o processo correto de implantação (definir e esquecer).

Para quem usa express. Você pode usar o grunt-express-server, que também é fantástico. https://www.npmjs.org/package/grunt-express-server

Jesse
fonte
0

Pode ser uma chance de você ter criado duas instâncias de sequenciar objetos

por exemplo: var con1 = new Sequelize (); var con2 = novo Sequelize ();

do que também ocorrerá o mesmo erro

Prakhar Dixit
fonte