Node.js, a diferença entre desenvolvimento e produção
Não há diferença entre desenvolvimento e produção em Node.js
, ou seja, não há configurações específicas que você precise aplicar para fazer o Node.js funcionar em uma configuração de produção. No entanto, algumas bibliotecas no registro npm reconhecem o uso da variável NODE_ENV
e definem-na como development
por padrão. Sempre execute seu Node.js com NODE_ENV=production
definido.
Uma maneira popular de configurar seu aplicativo é usando a metodologia dos doze fatores.
NODE_ENV no Express
No popular framework express, definir o NODE_ENV como produção geralmente garante que:
- o registro seja mantido no mínimo, nível essencial
- mais níveis de cache ocorram para otimizar o desempenho
Isso geralmente é feito executando o comando
export NODE_ENV=production
no shell, mas é melhor colocá-lo no arquivo de configuração do seu shell (por exemplo, .bash_profile
com o shell Bash), porque caso contrário, a configuração não persistirá em caso de reinicialização do sistema.
Você também pode aplicar a variável de ambiente adicionando-a ao comando de inicialização do seu aplicativo:
NODE_ENV=production node app.js
Por exemplo, em um aplicativo Express, você pode usar isso para definir diferentes manipuladores de erros por 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());
}
Por exemplo, [Pug](https://pugjs.org], a biblioteca de modelos usada por [Express.js](https://express.js], compila no modo de depuração se NODE_ENV
não estiver definido como production
. As visualizações do Express são compiladas a cada solicitação no modo de desenvolvimento, enquanto na produção elas são armazenadas em cache. Existem muitos outros exemplos.
Esta variável de ambiente é uma convenção amplamente usada em bibliotecas externas, mas não no próprio Node.js.
Por que NODE_ENV é considerado um antipadrão?
Um ambiente é uma plataforma digital ou um sistema onde os engenheiros podem construir, testar, implantar e gerenciar produtos de software. Convencionalmente, existem quatro estágios ou tipos de ambientes onde nosso aplicativo é executado:
- Desenvolvimento
- Homologação
- Produção
- Teste
O problema fundamental de NODE_ENV
decorre de desenvolvedores combinarem otimizações e comportamento de software com o ambiente em que seu software está sendo executado. O resultado é um código como o seguinte:
if (process.env.NODE_ENV === 'development') {
// ...
}
if (process.env.NODE_ENV === 'staging') {
// ...
}
if (process.env.NODE_ENV === 'production') {
// ...
}
if (process.env.NODE_ENV === 'testing') {
// ...
}
Embora isso possa parecer inofensivo, torna os ambientes de produção e homologação diferentes, tornando os testes confiáveis impossíveis. Por exemplo, um teste e, portanto, uma funcionalidade do seu produto podem passar quando NODE_ENV
estiver definido como development
, mas falhar ao definir NODE_ENV
como production
. Portanto, definir NODE_ENV
como algo diferente de production
é considerado um antipadrão.