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ê precisa 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 a definem como development por padrão. Sempre execute seu Node.js com NODE_ENV=production definido.
Uma maneira popular de configurar sua aplicação é usando a metodologia dos doze fatores.
NODE_ENV no Express
No framework extremamente popular express, definir o NODE_ENV para produção geralmente garante que:
- o registro em log seja mantido em um nível mínimo e essencial
- mais níveis de cache ocorram para otimizar o desempenho
Isso geralmente é feito executando o comando
export NODE_ENV=productionno shell, mas é melhor colocá-lo no seu arquivo de configuração do shell (por exemplo, .bash_profile com o shell Bash), pois, 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 prefixando-a ao comando de inicialização do seu aplicativo:
NODE_ENV=production node app.jsPor 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, o [Pug](https://pugjs.org], a biblioteca de templates usada pelo [Express.js](https://expressjs.com], compila no modo de depuração se NODE_ENV não estiver definido como production. As views do Express são compiladas em cada requisição no modo de desenvolvimento, enquanto em produção são armazenadas em cache. Existem muitos outros exemplos.
Esta variável de ambiente é uma convenção amplamente utilizada em bibliotecas externas, mas não dentro do 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
- Staging
- Produção
- Teste
O problema fundamental do NODE_ENV decorre dos desenvolvedores combinarem otimizações e comportamento do 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 staging diferentes, tornando impossível o teste confiável. Por exemplo, um teste e, portanto, uma funcionalidade do seu produto pode passar quando NODE_ENV está definido como development, mas falhar quando NODE_ENV está definido como production. Portanto, definir NODE_ENV para qualquer valor diferente de production é considerado um antipadrão.