Boas práticas de Node.js para iniciantes e especialistas

Node JS

Boas práticas de Node.js para iniciantes e especialistas

Atualmente Node.js é uma das mais populares frameworks para desenvolvimento web. Sendo adotada por diversas empresas, que vão desde a projetos pequenos a grandes soluções.

Com ele é possível criar aplicativos da web leves, escalonáveis, rápidos e robustos do lado do servidor, escrevendo código javascript fora do navegador.

Hoje, falaremos de algumas práticas recomendadas para desenvolvimento com Node.js, que irão ajudar todos os tipos de desenvolvedores a criar um aplicativo eficiente e mais sustentável, do iniciante ao mais experiente.

Restart do app a cada alteração

Em tempo de desenvolvimento, a aplicação para e reinicia a cada alteração feita no código, isso pode ser um incômodo e pode ocasionar perda de foco e produtividade.

Para resolver isso você pode usar ferramentas que evitam reiniciar o aplicativo repetidamente para refletir as alterações.

Abaixo estão alguns dos pacotes de monitoramento de código mais populares para Node.js:

  • Nodemon: Ele oferece um recurso de reinicialização automática sempre que novas alterações forem feitas no código. Para utilizar o nodemon, basta substituir o node por nodemon.
  • Forever: Ele também oferece o recurso de inicialização automática junto com uma configuração adicional, como escrever logs e definir o diretório de trabalho em um arquivo específico.
  • PM2: outra ferramenta de gerenciamento de processos com excelente controle e recursos em comparação com as duas anteriores.

Tanto o Forever quanto o PM2, podem ser utilizados no ambiente de produção. Com eles é possível garantir que o código seja recuperado após um erro de tempo de execução e também garante uma rápida inicialização caso o servidor fique inativo.

Substitua callbacks por async

No início, os callbacks eram usados para criar métodos assíncronos no Node, mas quando aninhados continuamente, costumavam sair do controle. E neste ponto em que o código se torna ilegível.

Com a introdução do async/await, os desenvolvedores perceberam uma diminuição desse problema. No entanto, para evitar callbacks, é necessário garantir o uso de async/await.

Você pode facilmente evitar este cenário ruim de callbacks, substituindo por chamadas async e await.

App Cluster

O Node runtime é limitado a único núcleo da CPU e a implantação de apps Node não clusterizados em um servidor enorme pode ser um desperdício de recursos.

Ao invés disso, escolha adicionar suporte a cluster em seu app, dessa forma pode-se tirar o máximo de proveito de vários núcleos. Com o suporte de um cluster, você obtém flexibilidade mesmo se estiver executando um único processo em um hardware pequeno.

Evite lixo

O Node tem um coletor de lixo lento com um limite padrão de 1,5 GB. Este coletor de lixo aguardará até que ele realmente tenha memória não utilizada para recuperar. Se você está ficando sem memória, não é por causa do vazamento, mas pelo comportamento preguiçoso do coletor de lixo. No entanto, pode-se assumir o controle total sobre o coletor de lixo fornecendo sinalizadores para o V8.

web: node — optimize_for_size — max_old_space_size=920 — gc_interval=100 server.js

Fazer isso é crucial, especialmente quando você está executando um nó em um ambiente com menos de 1,5 Gb de memória.

web: node — optimize_for_size — max_old_space_size=460 — gc_interval=100 server.js

O código acima pode ser usado para personalizar o nó para um contêiner de 512 MB.

Clean Code

Já falamos em um post anterior sobre os benefícios do clean code e como a sua adoção ajuda a melhorar a qualidade do código. A fim de ajudar nessa adoção irei destacar como a utilização de IDEs em conjunto com plugins para correção semântica e de estilo, ajudam o programador no momento de codificação.

Junto com o Node, podemos utilizar um plugin de “Lint” para pesquisar e avisar sobre códigos de erro semântico e sintático, enquanto podemos usar um formatador que funciona com fatores estilísticos para garantir que um conjunto de formatação e estilo seja consistente em todo o projeto.

Temos alguns plugins que são bastante famosos como ESLint, JSLint e JSHint que são aceitos pela maioria dos IDEs/editores de código como Atom e VSCode que valorizam a qualidade do código e oferecem plugins de formatação.

Esses IDEs oferecem recursos adicionais como refatoração, autocompletar, suporte a documentação, importações automáticas, ferramentas de depuração, navegação de código e muito mais.

Dependency Injection Software

Este design de software defende injetar ou passar dependências ou serviços como parâmetros para os módulos, em vez de criá-los. Este termo sofisticado mantém seus módulos independentes, flexíveis, escalonáveis e testáveis em todo o aplicativo. Com a injeção de dependência, você pode tornar suas funções mais genéricas e flexíveis.

Existem outras práticas além da injeção de dependência que tornaram o seu software melhor, para isso recomendo a leitura desse artigo em que falo sobre os princípios do S.O.L.I.D. Abaixo listo algumas boas práticas que são recomendadas:

  • Não se repita
  • Princípio de Responsabilidade Única
  • Mantenha simples (Keep it simple)
  • Divisão de Preocupações
  • Evite a otimização antecipada
  • Injeção de dependência

Use configuração segura, hierárquica e com reconhecimento de ambiente

Sinais de que uma boa configuração sem falhas de setup inclui: as informações que são secretas não são commitadas junto do código, um padrão hierárquico é seguido por uma configuração que facilita a pesquisa e as chaves são legíveis a partir de variáveis ambientes.

Mantenha-se atento às configurações do projeto a fim de atender os requisitos de configuração da equipe de DevOps.

Proteja a sua aplicação web com Helmet

Construir aplicativos da Web é muito divertido. Para tornar sua codificação ainda mais simples, primeiro proteja seu aplicativo.

Use:

  • Proteção XSS
  • Definir um cabeçalho Context-Security-Policy
  • Certifique-se de que todas as conexões sejam HTTPS
  • Evite Clickingjacking usando X-Frame-Options
  • Desative o cabeçalho X-Powered-By para que os invasores não consigam penetrar seus ataques a um software específico

Se você achar que fazer as práticas acima é um pouco assustador, simplesmente use o Helmet que será configurado com o padrão, e você será capaz de ajustar os necessários.

Conclusão

Nenhum desenvolvimento é difícil de mais ou nenhuma linguagem e fácil de mais, até que você encontre as melhores práticas recomendadas. Eu aconselho a práticas recomendadas em seus projeto back-end feito em Node.js que são abordados nesse artigo.

Espero que tenha ajudado você a encontrar o caminho para criar um software robusto, escalável e flexível.

Explore mais