Node.js, a diferença entre desenvolvimento e produção

Você pode ter configurações diferentes para os ambientes de produção e desenvolvimento.

O Node.js assume que você está sempre rodando de um ambiente de desenvolvimento.

Você pode sinalizar ao Node.js que está rodando em produção definindo a variável de ambiente NODE_ENV=production.

Isso normalmente é feito executando o comando

export NODE_ENV=production

no shell, mas é melhor colocar no seu arquivo de configuração shell (bash_profile com Bash shell), porque senão a configuração não é persistida em caso de reinício do sistema.

Você também pode aplicar a variável de ambiente prefixando no comando de inicialização da sua aplicação:

NODE_ENV=production node app.js

Essa variável de ambiente é uma convenção amplamente usada por bibliotecas também.

Definir o ambiente para production geralmente garante que

  • é mantido o mínimo de logs, apenas o essencial
  • mais níveis de cache são usados para otimizar a performance

Tomando como exemplo o Pug, a biblioteca de templates usada pelo Express, compila em modo debug se NODE_ENV não estiver definida como production. No ambiente de desenvolvimento as views do Express são compiladas em cada requisição, enquanto que em produção elas são cacheadas. Há muitos outros exemplos além desse.

Você pode usar condicionais para executar códigos em ambientes diferentes:

if (process.env.NODE_ENV === "development") {
//...
}
if (process.env.NODE_ENV === "production") {
//...
}
if(['production', 'staging'].indexOf(process.env.NODE_ENV) >= 0) {
//...
})

Por exemplo, em uma aplicação Express, você pode usar isso para definir o errorHandler de acordo com o ambiente:

if (process.env.NODE_ENV === "development") {
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }))
})
if (process.env.NODE_ENV === "production") {
app.use(express.errorHandler())
})