Você está na página 1de 46

Boas

Prticas com
Sumrio
Clique nos captulos
para acess-los
1. INTRODUO 3
2. BONS HBITOS E PRINCPIOS GERAIS 6
Use Node para os projetos certos 7
Node.js foi criado para async 8
Ajude seu crebro a entender o projeto 8
Crie apenas os diretrios que precisa 8
Torne fcil localizar arquivos de cdigo 9
Diminua o acoplamento e aumente o reuso de software 9
Priorize configuration over convention 9
Nomes de arquivos no formato lower-kebab-case 10
Tenha um padro de cdigo a.k.a. Guia de Estilo 10
3.CODIFICANDO 12
Comece todos os projetos com npm init 13
Entenda o versionamento de pacotes 13
Configure scripts no package.json 15
Use variveis de ambiente 16
Carregue suas dependncias antecipadamente 18
Centralize a criao de conexes ao banco 19
Mindset funcional 19
JS Full-stack 21
4.TESTANDO 24
Use uma boa ferramenta 25
Trate bem os seus erros 26
Aumente a visibilidade dos erros 26
Vendo os objetos completamente no console 27
Escreva testes unitrios 28
5.DEPLOY 29
No use FTP! 30
Cuide da segurana 31
Mantendo seu processo no ar! 31
Trabalhando com vrios cores 34
Use Integrao/entrega/implantao contnua 35
6. MDULOS RECOMENDADOS 38
7.SEGUINDO EM FRENTE 42
INTRODUO

Without requirements and design,


programming is the art of adding
bugs to an empty text file.

Louis Srygley
Sabe quando voc faz um trabalho e ele fica to bom que voc pensa algo como:
eu gostaria de ter tido acesso a isso quando estava comeando?

Pois , esse o meu sentimento com este ebook.

Quando estamos comeando com uma nova tecnologia sempre tudo muito
confuso, complexo e, por que no dizer, assustador?

Trabalho h onze anos com programao e h uns treze programo mesmo que
no profissionalmente, desde um tcnico em eletrnica que fiz em 2004 que
inclua programao de microcontroladores para a indstria. Nesse nterim tive
de trocar sucessivas vezes de tecnologias, seja por questes acadmicas, seja
por questes de mercado: Assembly, C/C++, Lisp, Prolog, Visual Basic, Java,
Lua, .NET, PHP e, agora, Node.js.

E a cada troca eu volto a ser um calouro, tendo de aprender no apenas sintaxe,


semntica, todo o ferramental relacionado tecnologia, mas o mais difcil de
tudo: boas prticas!

Como saber se o cdigo que estou escrevendo est dentro dos padres de
mercado?

Como tirar o mximo proveito da linguagem atravs do uso das melhores


ferramentas e extenses?

Como a arquitetura ou o mindset correto para os tipos de projetos que so


criados com esta tecnologia?

Como

E tudo fica pior quando estamos falando de uma tecnologia que no tem sequer
uma dcada de vida ainda e at cinco anos atrs era coisa de devs malucos em
eventos. So muitas as dvidas sobre Node.js e, mesmo com o todo-poderoso
Google em nossas mos, parece que essas respostas esto desconectadas e
jogadas cada uma em um canto obscuro da Internet, fazendo com que d um
trabalho enorme encontr-las.

INTRODUO 4
No trago aqui verdades universais ou respostas para todas as perguntas que
voc vai ter sobre Node.js, mas trago um apanhado da experincia coletiva de
milhares de desenvolvedores ao redor do globo para formar um guia de boas
prticas com Node.js. Pessoas com muito mais conhecimento de Node do que
eu, e algumas dicas minhas tambm, afinal eu tambm sou um desses milhares
de desenvolvedores!
Talvez inclusive voc reconhea alguma dica que voc mesmo pode ter dado em
alguma rede social ou publicao na Internet.

Espero que goste do que preparamos pra voc e que este ebook seja til na
sua jornada como programador Node.js. Este o grande propsito da Umbler:

Facilitar o desenvolvimento web, seja com a nossa


plataforma, seja com materiais como esse.

Ah, e se um dia o seu projeto virar uma startup de sucesso e voc for fazer um
IPO ou receber uma proposta de compra vinda do Facebook, lembra de quem te
ajudou l no incio. ;)

Um abrao e sucesso.

Luiz Duarte
Dev Evangelist
Umbler

INTRODUO 5
BONS HBITOS
E PRINCPIOS
GERAIS

Im not a great programmer;


Im just a good programmer
with great habits.

Kent Beck
Acima de qualquer boa prtica que eu possa propor neste ebook, vale ressaltar
alguns princpios e motivaes que devem estar acima de qualquer coisa em
seus projetos com Node.js.

Nem todos princpios vo se encaixar apenas no Node.js e talvez voc reconhea


uma ou outra coisa que j utilize hoje em outra tecnologia, como PHP. timo!

Por outro lado, talvez encontre crticas a hbitos ruins que voc possui hoje.
No se assuste, parte do processo de evoluo como programadores (e como
pessoas!) envolve manter bons hbitos e evitar hbitos ruins o tempo todo.

Afinal, como dizem, o hbito faz o monge.

Use Node para os projetos certos

Existe um dito popular que diz: Nem todo problema um prego e nem toda
ferramenta um martelo.

Qualquer tecnologia que lhe vendam como sendo a soluo para todos seus
problemas no mnimo para se desconfiar. Node no um canivete-suo e
possui um propsito de existir muito claro desde sua homepage at a seo de
about no site oficial: ele te proporciona uma plataforma orientada eventos,
assncrona e focada em I/O e aplicaes de rede no-bloqueantes.

Isso no quer dizer que voc no possa fazer coisas com ele para as quais ele no
foi originalmente concebido, apenas que ele pode no ser a melhor ferramenta
para resolver o problema e voc pode acabar frustrado achando que a culpa do
Node. Por isso, use Node preferencialmente para:

APIs;
Bots;
Mensageria;
IoT;
Aplicaes real-time;

BONS HBITOS E PRINCPIOS GERAIS 7


Node.js foi criado para async

Isso pode parecer bvio quando falamos de uma plataforma focada em I/O no-
bloqueante, mas parece que tem programador que a todo custo quer mudar isso
em suas aplicaes, fazendo todo tipo de malabarismo para transformar trechos
de cdigo e mdulos originalmente assncronos em tarefas sncronas.

Esquea. Nem perca seu tempo.

Se no gosta de callbacks (ser que algum gosta?) use promises e async/await,


mas no tente transformar Node.js em uma plataforma sncrona pois esse no
o objetivo dele e ele no funciona bem dessa forma, afinal ele single-thread,
lembra? Se realmente precisa que tudo rode sincronamente, use PHP ou outra
plataforma que crie threads separadas e seja feliz.

Ajude seu crebro a entender o projeto


Conseguimos lidar com apenas pequenas quantidades de informao de cada
vez. Alguns cientistas falam de sete coisas ao mesmo tempo, outros falam de
quatro coisas. Por isso que usamos pastas, mdulos e por isso que criamos
funes. Elas nos ajudam a lidar com a complexidade do sistema nos permitindo
mexer em pequenas pores dele de cada vez.

Crie apenas os diretrios que precisa


No saia criando dezenas de diretrios que acabaro vazios ou com apenas
um arquivo dentro. Comece com o bsico de pastas que voc precisa e v
adicionando conforme a complexidade for aumentando. Afinal, voc no compra
um nibus como primeiro veculo pensando no dia em que pode querer dar
carona para muita gente, certo?

Evite o over engineering de querer ter a melhor arquitetura possvel no dia


um do seu projeto. Voc deve conhecer (e evitar) o termo cdigo espaguete,
certo? Um projeto com mais pastas do que o necessrio to nocivo quanto, o
chamado cdigo lasanha (muitas camadas)!

BONS HBITOS E PRINCPIOS GERAIS 8


Torne fcil localizar arquivos de cdigo
Os nomes de pasta devem ser significativos, bvios e fceis de entender. Cdigo
que no mais usado, bem como arquivos antigos, devem ser removidos do
projeto, e no apenas comentados ou renomeados. Afinal, quem gosta de coisas
antigas e que no so mais usadas museu, certo?

Diminua o acoplamento e aumente o reuso de software.


A sugesto aqui ter mais mdulos especialistas na sua aplicao o mais
desacoplados possvel, at mesmo em projetos separados registrados no NPM,
por exemplo. Uma vez que voc tenha mdulos independentes, sua aplicao
fica menos acoplada e a manuteno mais simples.

Uma dica para aumentar o reuso de software mantendo o acoplamento baixo


no colocar cdigo especializado nas suas chamadas de model e controller. Por
exemplo, se aps salvar um cliente no banco voc precisa enviar um email pra
ele, no coloque o cdigo que envia email logo aps o salvamento no banco, ao
invs disso, dispare uma funo de um mdulo de email.

Outra dica programar com um mindset


mais funcional, conforme citado
no captulo sobre codificao.

Uma terceira e ltima dica aproveitar os mdulos j existentes, sempre


procurando a soluo para o que voc precisa antes de comear a desenvolver
ela. A lista de mdulos recomendados no captulo final um bom comeo, mas
use e abuse do site do NPM e do StackOverflow para isso.

Priorize configuration over convention


No faa coisas mgicas como assumir que o nome de um arquivo x ou que os
uploads vo parar sempre em uma pasta y. Esse hbito chamado popularmente
de convention over configuration. Isso frgil e facilmente quebra sua aplicao
quando alguma coisa muda e voc no lembra de todas as convenes que criou

BONS HBITOS E PRINCPIOS GERAIS 9


para sua arquitetura. Programe de maneira que o cdigo em si possa fazer com
que o programador entenda todo o projeto.
Use variveis de ambiente (como ser citado mais pra frente) e/ou
arquivos JSON de configurao, o que preferir, mas configure o seu projeto
adequadamente e de preferncia de maneira independente de infraestrutura,
para que voc consiga subir sua aplicao rapidamente em qualquer lugar.

Nomes de arquivos no formato lower-kebab-case

Use apenas minsculas, sem acentos e - como separador entre palavras. Isso
evita problemas de sistemas de arquivos em sistemas operacionais diferentes
que sua aplicao Node possa rodar. Ex: cadastro-cliente.js

Este o padro do NPM para arquivos e pastas, ento melhor seguir esta
regra, por mais que no goste dela.

Veja mais regras adiante.

Tenha um padro de cdigo a.k.a. Guia de Estilo

Muitos programadores que conheo no gostam de padres de cdigo. No


entanto, um ponto importante a se entender : padres de cdigo no so para
o programador, mas sim para a empresa ou para a comunidade (no caso dos
projetos open-source).

Uma vez que em empresas e projetos abertos existe uma certa rotatividade de
profissionais trabalhando no mesmo cdigo, natural que programadores com
diferente vises de como o software deve ser escrito podem mexer nele e fazer
com que facilmente no exista coerncia na escrita. Padres evitam isso.

Por mais que alguns podem achar isso preciosismo, s quem j trabalhou em
grandes bases e cdigo sem padro que sabe o quo difcil se achar no meio de
um projeto bagunado. Para resolver isso, empresas e projetos de todos os tipos
e tamanhos decidem padres. Um ponto importante aqui que no o mesmo
padro para todos(as). A regra clara: pegue um padro que voc se sinta
confortvel e que funcione na sua empresa/projeto.

BONS HBITOS E PRINCPIOS GERAIS 10


Aqui vai uma sugesto que est ganhando cada vez mais fora: StandardJS,
disponvel em http://standardjs.com. um padro rgido, inflexvel, construdo
com opinies fortes mas que rapidamente est dominando diversos projetos e
empresas mundo afora. Eu no concordo com tudo o que prega o StandardJS,
mas que ajuda a tornar o cdigo muito mais legvel e enxuto, isso com certeza.

Para ajudar com projetos j existentes, ele possui um fixer automtico que
corrige a maior parte dos cdigos fora do estilo e, dependendo da ferramenta
que estiver usando (eu uso o Visual Studio Code), te d sugestes real-time
do que voc est fazendo errado. Costumo trabalhar em projetos remotos
com outros desenvolvedores e uma excelente maneira de garantir uma
padronizao entre os cdigos escritos por todos. Basta rodar:

standard --fix

e praticamente tudo se resolve!

E se eu no consegui te convencer, a pgina deles est cheia de empresas/projetos


que usem esse estilo, como: NPM, GitHub, ZenDesk, MongoDB, Typeform,
ExpressJS e muito mais. Falando de NPM especificamente, muitos, mas muitos,
dos mais populares mdulos existentes foram escritos usando StandardJS como
guia de estilo, entre eles o mocha, dotenv, mssql, express-generator e muito mais.

BONS HBITOS E PRINCPIOS GERAIS 11


CODIFICANDO

Any fool can write code that a


computer can understand.
Good programmers write code
that humans can understand.

Martin Fowler

3
Node.js se tornou uma das plataformas mais populares nos ltimos anos. Parte
desse sucesso se deve ao fato de que muito fcil comear projetos em Node.
js, mas uma vez que voc v alm do Ol Mundo bsico, saber como codificar
corretamente sua aplicao e como lidar com tantos erros pode facilmente se
tornar um pesadelo (alis, como na maioria das linguagens de programao).

Infelizmente, evitar que este pesadelo se torne realidade faz toda a diferena
entre uma aplicao slida em produo e um desastre em forma de software.

Com isso em mente, vamos passar neste captulo por uma srie de boas prticas
usando Node.js que te ajudaro a evitar a maioria das armadilhas desta
plataforma.

Comece todos os projetos com npm init

Vamos comear do bsico, ok?


Todos estamos acostumados a usar o NPM para instalar novos pacotes em nosso
projeto, mas sua utilidade vai alm disso. Primeiramente, eu recomendo que
comece todos os seus projetos usando npm init, como abaixo:

mkdir novo-projeto
cd novo-projeto
npm init

Isto faz com que o package.json seja criado, o que permite que voc adicione
diversos metadados que ajudaro voc e sua equipe mais tarde,, definindo a
verso do node que roda o projeto, quais dependncias ele possui, qual o
comando para inicializar o projeto...opa essa uma dica quente, vamos explor-la?

Entenda o versionamento de pacotes


Ento voc abre o package.json e rapidamente entende que as dependencies so
os pacotes que sua aplicao usa, mas onde deveriam estar listadas as verses
dos pacotes tem um monte de smbolos que no dizem muita coisa.
Resumidamente funciona assim:

CODIFICANDO 13
O til garante que o pacote seja sempre carregado respeitando o nmero
do meio da verso. Ex: 1.2.3 pega o pacote mais recente da verso 1.2.x,
mas no vai atualizar para 1.3. Geralmente garante que correes de bugs
sejam atualizados no seu pacote.

O circunflexo garante que o pacote seja sempre carregado respeitando


o primeiro nmero da verso. Ex: 1.2.3 pega o pacote mais recente da
verso 1.x, mas no vai atualizar para 2.0. Garante que bugs e novas
funcionalidades do seu pacote sejam atualizados, mas no novas verses
major dele.

A imagem abaixo ajuda a entender o template de verses dos pacotes do NPM,


que alis usa um padro bem comum da indstria de software:

caret (^)

Patch
bug xes

3 9 2

major minor patch


Major
breaking change
tilde (~)

Minor
backwards compatible new functionality
old functionality deprecated, but operational
large internal refactor

CODIFICANDO 14
Outros smbolos incluem:

>, >=, <, <=1.0: a verso deve ser superior, superior ou igual, inferior, inferior
ou igual 1.0, respectivamente.
1.2.x: equivalente a 1.2.0
*: qualquer verso do pacote
latest: a verso mais recente do pacote

Se voc no tiver smbolo algum, a o pacote deve ser sempre carregado usando
a verso especificada.

Uma ltima dica bem valiosa para quando se quer atualizar todos pacotes
colocar * na verso de todos e rodar o comando npm update --save sobre a
pasta do projeto.

Configure scripts no package.json

Lembra da dica de priorizar configuration over convention que mencionei l


atrs? Pois , em diversas ocasies temos de rodar scripts para fazer tarefas em
nossas aplicaes e se tivermos de lembrar qual script rodar, em qual ordem, em
qual situao, etc certamente uma hora algum vai fazer alguma besteira por
esquecimento.

Uma constante so os scripts de inicializao, mas existem outros, todos


podendo ser configurados na propriedade scripts do package.json, como abaixo:

"scripts": {
"start": "node index.js"

Neste caso, quando executarmos o comando npm start dentro da pasta deste
projeto, ele ir executar node index.js, sem que tenhamos de escrever este
comando manualmente. Ok, aqui foi um exemplo de comando simples, mas poderia
ser mais complicado, como passando flags e at mesmo variveis de ambiente.

CODIFICANDO 15
Alm do script start para inicializao, temos:

test: para rodar os seus testes automaticamente (til para facilitar CI);
preinstall: para executar alguma coisa logo que um npm install chamado,
antes da instalao realmente acontecer;
postinstall: para executar alguma coisa depois que um npm install acontecer;

E por fim, caso queira scripts personalizados, voc pode adicionar o nome que
quiser nos scripts, mas para cham-lo depois deve usar o comando npm run-script
nomeDoScript, facilitando a sua vida caso seu time tenha vrios scripts diferentes.

Use variveis de ambiente


Uma das premissas centrais do Node.js o desacoplamento. Mais tarde
falaremos de micro servios (que uma excelente prtica para Node), mas,
por ora, entenda que um dos acoplamentos que mais tomam tempo de
gerncia de configurao so os relacionados servios externos como
bases de dados, APIs, etc.

Isso porque esses servios externos possuem diferentes configuraes


nos diferentes ambientes que sua aplicao Node vai passar: configs de
produo, de teste, de homologao, na sua mquina, etc. Como lidar com
isso sem que os desenvolvedores tenham de conhecer as configuraes de
produo, sem ferrar com seu CI, etc? Com variveis de ambiente!

Sempre que subimos uma aplicao Node podemos passar ela as variveis
de ambiente daquele processo (process.env) antes do comando de
inicializao:

NOME_VARIAVEL=valor node index.js

ou em Windows

SET NOME_VARIAVEL=valor node index.js

CODIFICANDO 16
Assim, podemos passar configuraes locais como variveis de ambiente para
aquela sesso da aplicao, evitando ter connection strings, por exemplo, hard-
coded na sua aplicao.

Se voc no achou prtico, saiba que eu tambm no gosto de digitar isso a


toda vez que vou executar uma aplicao Node. Sendo assim, uma maneira mais
profissional seria usar essa dica em conjunto com a dica anterior, de configurar
scripts no package.json. Basta que voc adicione as variveis de ambiente no
comando de start, como abaixo:

"scripts": {
"start": "set NOME_VARIAVEL=valor && node app"
}

No entanto, se seu package.json estiver versionado, e geralmente est, isso pode


no ser uma boa, porque ao fazer commit na master ele pode ser enviado ao
servidor (se estiver usando CI) e estragar sua aplicao de produo. Neste caso,
sugiro uma abordagem ainda mais profissional: arquivos .env.

Alguns desenvolvedores criam arquivos de configurao prprios que so


lidos na inicializao da aplicao para carregar estas variveis, no entanto,
arquivos .env e o mdulo dotenv (e a verso segura dotenv-safe) resolvem este
problema facilmente. Primeiro, crie o seu arquivo .env (sem nome, apenas .env
mesmo) e coloque uma varivel de ambiente por linha, como abaixo, podendo
usar # para comentrios:

#meu primeiro .env


VARIAVEL1=valor1
VARIAVEL2=valor2

Agora adicione no gitignore este arquivo, para ele no ser versionado.


Certifique-se de fazer cpias dele nos seus diversos ambientes com os valores
de teste, homologao, produo, etc, assim, voc nunca envia ele e nunca
sobrescreve as configs de produo.

CODIFICANDO 17
Para carreg-lo, muito simples, chame esta linha de cdigo na primeira linha
do arquivo principal da sua aplicao, para que ele carregue as variveis de
ambiente antes de tudo:

require(dotenv).config()

E voil! Est pronto.


A nica diferena entre dotenv e dotenv-safe (que eu prefiro, alis) que o
segundo exige um arquivo .env.example que descreva todas as variveis de
ambiente obrigatrias que sua aplicao necessita para funcionar (apenas
nomes das variveis, uma por linha). Caso na inicializao no seja encontrada
alguma das variveis, d um erro e a aplicao no sobe.

Carregue suas dependncias antecipadamente


Muitos desenvolvedores Node.js programam desta forma os seus requires:

app.get("/meu-servico", function(request, response) {


var datastore = require("db-module")(config);
datastore.get(req.query.someKey)
// etc, ...
});

O problema com o cdigo acima que quando algum faz uma requisio
para /meu-servico, o cdigo ento ir carregar todos os arquivos requeridos
por db-module - o que pode causar uma exceo caso estejam bugados.
Adicionalmente, quando passamos config para o objeto pode acontecer um erro
de configurao (ou at de conexo) que derrube o processo inteiro. Alm disso,
no sabemos quanto tempo aquele require, que funciona de maneira sncrona,

CODIFICANDO 18
ir levar e isso terrvel pois ele bloqueia todas as requisies at que termine.

O problema s no pior porque depois que o require sobre aquele mdulo for
chamado uma vez, ele ficar em cache. Sendo assim, todas as suas dependncias
devem ser carregadas e configuradas antecipadamente, o que ajudar a
descobrir erros de conexo e configurao bem cedo e deixar o funcionamento
da aplicao mais fluida.

Centralize a criao de conexes ao banco


Passe as conexes criadas para os subsistemas ao invs de ficar passando
informaes de conexo por parmetro e permitindo que eles criem suas
prprias conexes.

Claro que toda regra tem sua exceo caso venha a utilizar Node.js com bancos
relacionais em PaaS, talvez tenha que abrir e fechar as conexes por conta
prpria e no poder ficar repassando o objeto entre as funes, ainda assim
voc pode centralizar o acesso dados em um mdulo especfico para tal, como
um db.js, por exemplo.

Mindset funcional

Voc j deve ter ouvido falar que funes so objetos de primeira classe em
JavaScript, certo? Isto dito porque em JS funes no so tratadas de maneira
muito distinta de outros objetos, diferente de outras linguagens que costumam
deixar muito clara a diferena entre funes e variveis.

Programar com um mindset funcional aproveitar essa caracterstica inerente


da linguagem e usar e abusar de funes coesas, desacopladas, que aumentem
o reuso de cdigo, a legibilidade do cdigo, facilitem a criao de testes (que
veremos mais pra frente) e muito mais. Algumas regras bsicas que voc pode
adotar com JS funcional sem medo de errar so:

SRP - Single Responsibility Principle


Cada funo deve ter uma nica razo de existir e, portanto, uma nica razo
para ser alterada. Jamais crie funes que atuem como canivetes suos. Isso
garante uma uma alta coeso e uma boa dica para criao de mdulos em JS
tambm, evitando mdulos como utils.js.

CODIFICANDO 19
DRY - Dont Repeat Yourself
Trechos de cdigo com lgica parecida? Encapsule em uma funo. Funes
chamadas repetidas vezes? Encapsule em um lao. Funes repetidas entre
projetos? Encapsule em um mdulo. Etc.

Imutabilidade
Sempre que possvel, trabalhe com objetos imutveis. Isso se tornou bem mais
fcil com a adio do const no ES6.

Baixo Acoplamento
Lembra da definio matemtica do que uma funo? Funes so relaes de
um conjunto A com um conjunto B, ou seja, dados determinados parmetros de
entrada (A), teremos determinado retorno como sada (B). Sempre relacione A
com B, jamais A com C (variveis externas?) ou C com B, ou seja, para manter um
baixo acoplamento a funo apenas deve conhecer o conjunto de entradas para
construir a partir dele as suas sadas.

Declarativo ao invs de Imperativo


Use as funes declarativas nativas como foreach, map, reduce, filter, etc
trabalharem duro por voc sem se preocupar com os detalhes de tais lgicas fica
mais legvel e muitas vezes mais eficiente.

Anonymous Functions
Aprenda a usar e se acostume com elas, especialmente closures e arrow
functions.

Desde o ES6 que JS tem obtido caractersticas mais orientadas objetos e


alguns conceitos de OO inclusive foram citados logo acima. No entanto, focar
em um JS OO, na minha opinio, no agrega tanto valor linguagem quanto suas
caractersticas funcionais.

Existem bons livros sobre programao funcional, inclusive com JavaScript, alm de
cursos especficos, ento no entrarei em detalhes aqui. Apenas reservo este espao
para alertar sobre a importncia desse mindset para o uso correto desta tecnologia e
sugerir a leitura deste material simples, porm muito inteligente: JAMES SINCLAIR.

CODIFICANDO 20
JS Full-stack

Muitas pessoas chegam at o Node com a promessa de escrever tanto o client-


side quanto o server-side na mesma linguagem. No entanto, para que realmente
isso seja vantajoso o reuso de software tem que ser possvel em ambos os lados
da aplicao, certo?!

Uma boa prtica conseguir reutilizar os seus mdulos JS tanto no browser


quanto no back-end (via Node.js).

Primeiramente, em Node quando queremos expor um mdulo, usamos um

exports.test = function(){
return hello world;
};

No entanto, no browser isso d erro uma vez que exports undefined neste
ambiente. O primeiro passo para contornar este problema verificar a
existncia ou no do exports, caso contrrio, teremos que criar um objeto para o
qual possamos exportar as funes:

if(typeof exports == undefined){


var exports = this[mymodule] =
{};
}

CODIFICANDO 21
cdigo semelhante a esse:
O problema com essa abordagem que no browser as funes que no foram
exportadas tambm ficam disponveis como funes globais, o que no algo
desejvel. possvel resolver isso usando closures, como no exemplo abaixo:

(function(exports){

// seu codigo vai aqui


exports.test = function(){
return hello world
};

})(typeof exports === undefined?


this[mymodule]={}: exports);

O uso do objeto this representa o browser, e o uso de this[mymodule] o local


de exportao no browser. Esse cdigo est pronto para ser usado tanto no
browser quanto no server. Considerando que ele est em um arquivo mymodule.
js, usamos esse mdulo da seguinte maneira em Node:

var mymodule = require(./mymodule),


sys = require(sys);

sys.puts(mymodule.test());

CODIFICANDO 22
E no browser usamos assim:

<script src=mymodule.js></script>
<script>
alert(mymodule.test());
</script>

Claro, existem cdigos JS escritos em Node que no sero suportados pelo


browser, como o comando require por exemplo. Sendo assim, os mdulos
compartilhados entre os dois devero ser o mais genricos possveis para que
haja compatibilidade.

Tome cuidado tambm com as features mais recentes da linguagem Javascript


que muitas vezes so suportadas pela engine V8 que o Node usa mas no pelos
demais browsers e vice-versa (em casos mais raros). Nestes casos muito til
usar um transpiler como o BABEL.

CODIFICANDO 23
TESTANDO

4
Everyone knows that debugging
is twice as hard as writing a pro-
gram in the first place. So if youre
as clever as you can be when you
write it, how will you ever debug
it?

Brian W. Kernighan
Parece um tanto bvio e estpido incluir um captulo sobre testes dentro de um
guia de boas prticas, certo?

Quem dera fosse.

A grande maioria dos projetos que vivenciei (e ouvi falar), independente da


plataforma, no possuem uma boa cobertura de testes, no fazem testes
unitrios corretamente, no possuem rotinas de regresso, etc. E nem estou
falando do quase utpico TDD.

Coloque em sua mente que no importa a idade do seu projeto, nunca tarde
para iniciar uma cultura de testes. E no, testes no prejudicam projetos. Bugs
sim. Cliente insatisfeito sim. Comece pequeno, comece simples, no mnimo com
as dicas que sero dadas neste captulo.

Use uma boa ferramenta

Assim como o JavaScript tradicional, em Node podemos usar qualquer editor


de texto para programar nossas aplicaes. No entanto, opes simplificadas
demais como o Notepad e editores de linha de comando (como nano), embora
prticos de usar, no so muito teis quando precisamos depurar aplicaes
bugadas. Alm disso, no contam com de outros benefcios como navegar entre
funes, diversos tipos de highlights e autocompletes, etc.

Vou dar duas sugestes de como depurar programas Node.js.

Opo 1: troque seu editor de texto


O melhor jeito para mim atualmente usando o Visual Studio Code, que vem
com suporte nativo a Node.js, gratuito e roda em Windows, Mac e Linux. Nele
voc pode colocar breakpoints em arquivos .js, inspecionar variveis, testar
expresses no console, fazer integrao com Git, StandardJS e muito mais.

Outra alternativa, mais pesada o Visual Studio Community (2015 com plugin
para Node ou 2017 com suporte nativo).

TESTANDO 25
Opo 2: use um depurador externo ao seu editor
Agora se voc no quiser abrir mo de usar editores de texto nativos do seu
SO ou os clssicos com os quais j est acostumado, voc pode depurar seus
programas Node.js diretamente no Google Chrome tambm, usando o F12.
Voc consegue mais informaes neste post do Medium.

E, por fim, uma outra alternativa para no largar seus editores de texto favoritos
usando o Node Inspector, um projeto open-source disponvel no GitHub.

Trate bem os seus erros


No h nada mais agradvel do que de repente a sua aplicao Node sair do ar e
voc descobrir no servidor que foi uma exception que fez isso. Aquele trecho de
cdigo mal testado, aquela resposta no prevista da API, etc. No importa o que
era, mas sim que derrubou tudo. E voc no pode deixar isso acontecer.

Um bom gerenciamento de excees importante para qualquer aplicao,


e a melhor maneira para lidar com erros usar as ferramentas fornecidas
pelo Node.js para isso, como em promises, em que temos o handler .catch(),
que propaga todos os erros para serem tratados em um nico local, como no
exemplo abaixo:

doSomething()
.then(doNextStage)
.then(recordTheWorkSoFar)
.then(updateAnyInterestedParties)
.then(tidyUp)
.catch(errorHandler);

Qualquer erro que acontea nos then() ser capturado para tratamento no catch().

TESTANDO 26
Aumente a visibilidade dos erros
A dica aqui no jogar erro para o usurio, mas sim usar uma biblioteca de
logging para aumentar a visibilidade dos erros. O console.log timo, mas tem
srias limitaes em uma aplicao em produo. Tentar encontrar a causa de
um bug dentre milhares de linhas de logs terrvel e uma biblioteca de logging
madura pode ajudar com isso.

Primeiro, bibliotecas de logging permitem definir nveis para as mensagens


como debug, info, warning ou error mesmo. Segundo, geralmente elas permitem
quebrar os logs em diferentes arquivos ou mesmo persistir remotamente, o que,
alis, uma tima ideia na minha opinio.
Uma sugesto muito boa mandar seus logs para a Loggly.com que tem um
plano free bem interessante de 200MB de logs por dia e armazenamento
dos ltimos sete dias. O servio dessa startup permite buscar rapidamente
por mensagens usando padres e definir alertas caso muitos erros estejam
acontecendo.

Falando de bibliotecas especificamente, a recomendada aqui a winston.

Vendo os objetos completamente no console


Certas vezes quando temos objetos complexos em Node.js e queremos ver o que
ele est guardando dentro de si usamos o console do Google Chrome ou mesmo
do Visual Studio para entender o que se passa com nosso objeto. No entanto,
dependendo do quo profundo o nosso objeto (quantos objetos ele possui
dentro de si), essa tarefa no muito fcil.

Aqui vo algumas formas de imprimir no console o seu objeto JSON inteiro, no


importando quantos nveis hierrquicos ele tenha:

TESTANDO 27
Opo 1: console.log
Tente usar a funo console.log passando o objeto or parmetro, isso funciona
na maioria dos casos.

console.log(myObject);

Opo 2: util.inspect
Use o seguinte cdigo abaixo para usar a funo util.inspect e retornar todo o
contedo de um objeto JSON.

const util = require(util)


console.log(util.inspect(myObject,
{showHidden: false, depth: null}))

Opo 3: JSON.stringify
Use a funo JSON.stringify passando o objeto e o nvel de indentao que
deseja dentro do objeto, como abaixo.

console.log(JSON.stringify(myObject, null,4));

TESTANDO 28
Escreva testes unitrios

Escrever testes unitrios permite que voc tenha mais confiana que as
menores partes do seu projeto funcionam como deveriam. Alm disso,
resolve a maior parte dos bugs toscos que tiram muitas noites de sono dos
desenvolvedores. Unit tests so facilmente automatizados atravs de extenses
adequadas, oferecendo um ganho de qualidade e velocidade muito grande.

Existem diversos mdulos para ajudar com testes unitrios em Node.js e


no h um consenso sobre qual o melhor deles, sendo os mais comumente
recomendados:

Jasmine
Mocha
Chai
Tap

Especificamente para web applications e web APIs, usar o Supertest ou o hippie


para abstrair a camada de front-end uma tima ideia tambm.
No vou entrar em detalhes aqui, j que no sei qual biblioteca voc vai adotar
e todas possuem excelente documentao e tutoriais na Internet. Os excelentes
livros do Kent Beck como TDD (ele o inventor do termo) e at mesmo o livro
Programao Extrema (seu mtodo gil de desenvolvimento de software) so
altamente recomendados neste tpico.

TESTANDO 29
DEPLOY

The most important property of


a program is whether it accom-
plishes the intention of its user.

C.A.R. Hoare
Ento voc usou os melhores princpios do Node.js, escreveu sua aplicao
perfeitamente, depurou e tratou todos os erros, agora s colocar em
produo, certo?

S uma palavra meio fraca para esta tarefa que, dependendo da sua aplicao,
pode exigir bastante trabalho ou ao menos bastante configurao de sua parte.
H ainda a questo de que apenas colocar em produo no resolve todo seu
problema, afinal voc ter de ter mecanismos que mantenham a sua aplicao
disponvel, mecanismos de logging, etc.

Neste captulo falaremos de vrias coisas sobre colocar sua aplicao no ar e


mant-la l!

No use FTP!

Antes de entrar nas boas prticas do que voc deve usar, falarei do que voc
no deve usar: FTP. Estamos falando de uma tecnologia da dcada de 80 que,
embora ainda seja utilizada at hoje em diversos contextos, nunca foi criada com
o objetivo de implantar software web.

Implantar software na web profissionalmente raramente apenas subir


arquivos para uma pasta no seu servidor. Geralmente envolve fazer um backup
da verso atual em produo, subir a nova verso, substituir as duas, etc. No
caso do Node.js, pode envolver tambm baixar os mdulos corretos via NPM e
esse o tipo de coisa que voc no vai querer subir via FTP.

Se voc usa um provedor de hospedagem para manter suas aplicaes Node.js


24x7, tenha em mente que FTP inevitavelmente falha e que isso no bom para
deploy em produo. Afinal, quem nunca ficou com um arquivo trancado em 0
bytes no servidor e voc no consegue nem exclu-lo, bem sobrescrev-lo?

Na Umbler nossa hospedagem Node.js no usa FTP, mas sim Git para deploy. Na
nossa abordagem, tanto faz se voc enviar a sua pasta node_modules ou no, e
voc pode tambm adicionar outros usurios com permisso para fazer deploy
tambm, se necessrio.

DEPLOY 31
Cuide da segurana
Se o seu projeto uma web application, existem um monte de boas prticas de
segurana especficas visando manter sua app segura:
Proteo a XSS;
Preveno de ClickingJacking usando X-Frame-Options;
Forar conexes como HTTPS;
Configurar um cabealho Context-Security-Policy;
Desabilitar o cabealho X-Powered-By para que os atacantes no tenham
informaes teis para ataques;

Ao invs de tentar se lembrar de todas elas voc pode usar o mdulo Helmet,
que permite facilmente alterar todas configuraes default (e inseguras) de web
applications e deixa voc customizar as que forem necessrias.
Como tudo em Node.js, incrivelmente simples de instalar o Helmet:

$ npm install helmet

e muito simples e usar na sua aplicao:

var helmet = require(helmet);


app.use(helmet());

Mantendo seu processo no ar!

Se voc optar por uma soluo hands-on, em que voc ter de configurar o
servidor para manter sua aplicao rodando, certifique-se de fazer com que
seu processo fique sempre rodando, mesmo que seja derrubado e mesmo que
o servidor inteiro reinicie. No importa se voc tratou todos os erros da sua
aplicao, inevitavelmente algo vai acontecer e tirar seu processo do ar e ele
deve ser capaz de subir novamente.

DEPLOY 32
Aqui vo algumas boas opes de como fazer isso:
Windows Service
Uma das opes instalar um script Node.js de inicializao da sua aplicao
como um Windows Service (algo bem parecido com o que voc deve ter feito na
dica de codificao sobre scripts no package.json). Um Windows Service permite
configuraes como iniciar junto ao Windows (caso ele reinicie), reiniciar
automaticamente em caso do processo travar, os erros enfrentados pelo
Windows Service vo parar no Event Viewer do Windows, etc.

Para fazer isso, primeiro instale o mdulo node-windows globalmente:

npm install -g node-windows

Agora rode o seguinte comando (dentro da pasta do seu projeto) para incluir
uma referncia deste mdulo ao seu projeto:

npm link node-windows

Depois, dentro do seu projeto Node.js (na raiz mesmo) crie um arquivo service.js
com o seguinte contedo:

var Service = require(node-windows).Service;

// Create a new service object


var svc = new Service({ name:Nome da sua Aplicao,
description: Apenas uma descrio, script:
C:\\domains\\sitenodejs\\bin\\www });

// Listen for the install event, which indicates the


// process is available as a service.
svc.on(install,function(){ svc.start(); });
svc.install();

DEPLOY 33
Troque as propriedades name e description de acordo com seu gosto, mas
atente propriedade script nesse cdigo, que deve conter o caminho absoluto
at o arquivo JS que inicia sua aplicao. Neste exemplo estava usando
ExpressJS e apontei para o arquivo www que fica na pasta bin do projeto
(curiosamente ele no possui extenso, mas um arquivo).

Se voc fez tudo corretamente, v at Ferramentas Administrativas > Servios


(Administrative Tools > Services ou services.msc no Run/Executar do Windows)
e seu servio vai aparecer l com o name que definiu ali no script, permitindo
que voc altere suas configuraes de inicializao, dar Start, Stop, etc.

SC STOP servicename
SC DELETE servicename

Caso precise remover esse servio (para instalar uma verso mais atualizada,
por exemplo) rode o comando abaixo no cmd:
Esse servicename voc encontra nas propriedades do Windows Service que
deseja excluir.

PM2
PM2 um projeto open-source criado e mantido pela empresa Keymetrics.
io, que, alm do PM2 (que gratuito), vende um servio de gerenciamento
de performance de aplicaes Node.js homnimo. S para voc ter uma ideia
do que o PM2 hoje, so mais de 20M de downloads e empresas como IBM,
Microsoft e PayPal usando, o que o torna, disparado, a melhor soluo de
process manager pra Node, muito mais do que seus principais concorrentes, o
Forever e o Nodemon.

Para usar o PM2 muito simples, primeiro instale globalmente o mdulo do


PM2:

$ npm install pm2 -g

DEPLOY 34
Depois, quando quiser iniciar o processo da sua aplicao Node.js:

$ pm2 start myApp.js

Para garantir que ele rodar eternamente, se recuperar sozinho de falhas, etc,
voc pode estudar o guia oficial dele.

Alm do PM2, a Keymetrics.io oferece uma ferramenta de monitoramento e


alertas muito boa e til que inclusive conta com um plano gratuito que atende
boa parte dos desenvolvedores. Usar uma boa ferramenta de monitoramento
ajuda bastante a evitar dores de cabea principalmente se seu servio possui
clientes pagantes. Ao contrrio de ferramentas de monitoramento de uptime
simples como Pingdom e StatusCake, a Keymetrics.io monitora consumo de
recursos como RAM e CPU.

Trabalhando com vrios cores

O Node.js trabalha com uma nica thread dentro de um nico processo na sua
mquina. Dessa forma, natural que ele utilize apenas um processador, mesmo
que voc esteja rodando sua aplicao em um webserver com 16 ncleos ou
mais. Sendo assim, uma dvida bem comum : como escalar um projeto Node
para que use todo o poder do seu servidor?

Basicamente voc tem algumas opes de como fazer o deploy de uma aplicao
Node.js que use os diversos ncleos da mquina:

Usar uma arquitetura de micro-servios.


Cada mdulo da sua aplicao deve ser uma sub-aplicao autnoma,
que responde a requisies e realiza apenas as tarefas que so de sua
responsabilidade. Sendo assim, teramos diversas aplicaes pequenas
escritas em Node.js, cada uma usando um core da sua mquina, recebendo (e
processando) as requisies que cabem a elas. Uma aplicao principal recebe a
requisio original do usurio e delega as tarefas para as demais sub-aplicaes.
Falei disso em mais detalhes no captulo de Codificao.

DEPLOY 35
Note que nesta abordagem usaremos vrios cores pois teremos vrios servios
Node rodando e, consequentemente, vrios processos. Dentro da plataforma
da Umbler voc consegue adotar esta estratgia com vrios subdomnios
apontando para instncias pequenas ao invs de uma instncia grande rodando
um nico app Node.js.

Usar um webproxy na frente do Node


Voc pode colocar um Apache, Nginx ou IIS frente da sua aplicao e deixar com
ele essa tarefa de controlar a carga de requisies, balanceando entre diferentes ns
idnticos da sua aplicao, cada um em um processador. Voc pode fazer isso com Node.
js tambm, mas geralmente Apache e cia. j possuem muito mais maturidade para
isso.
Nesta abordagem usaremos vrios cores rodando o mesmo servio de maneira
repetida. Tenha isto em mente quando estiver criando sua aplicao, pois cada
processo ir fazer a sua conexo com o banco e no compartilhar memria
com os demais. Uma alternativa para solucionar esse problema de memria
compartilhada usar um Redis ou similar para compartilhar recursos.

Alm disso, ao invs de usar um webproxy frente do Node voc pode usar o
PM2.Basicamente voc consegue subir uma instncia da sua aplicao Node por
CPU usando o comando abaixo:

$ pm2 start myApp.js -i max

Consulte o guia oficial do PM2 para conhecer mais sobre clusterizao com ele.
Existem outras opes? Sim, mas essas duas acima so recomendadas.

DEPLOY 36
Use Integrao/entrega/implantao contnua

Algumas definies rpidas pois existe muita confuso sobre estes termos:

Continuous Integration
o processo de fundir o trabalho desenvolvido com a master vrias vezes ao
dia e/ou constantemente (dependendo do seu ritmo de trabalho), ajudando a
capturar falhas rapidamente e evitar problemas de integrao, sendo boa parte
desses objetivos atingidos com uma boa bateria de testes automatizados.

Continuous Delivery
o prximo passo aps a entrega contnua, sendo a prtica de entregar cdigo
para um ambiente, seja para o time de QA ou para clientes, para que o mesmo
seja revisado. Uma vez que as alteraes sejam aprovadas, eles podem ir para
produo.

Continuous Deployment
O ltimo passo nessa sequncia a implantao contnua, quando o cdigo
que passou pelas etapas anteriores com sucesso implantado em produo
automaticamente. Continuous deployment depende pesadamente de uma
infraestrutura organizada e automatizada.

Noties developer

Commits code Triggers build Deploy to production


if every tests passed

Developer Source control Continuous Production


integration servers servers

Fonte: Rising Stack

DEPLOY 37
Embora estas definies variem um pouco dependendo da linha de pensamento
adotada pelos autores de livros e professores universitrios, todas elas esto
associadas a conceitos mais universais como ALM e Agile e at mesmo com
necessidades bem especficas como as entregas contnuas do Scrum e do Lean
Startup. Independente disso, tm se mostrado cada vez mais importantes, e
valiosas, nos projetos atuais.

Felizmente, Node.js parece ter nascido para ser entregue continuamente pois
possui diversas caractersticas (cortesia do JavaScript) propcias para tal como
a modularizao, a dinamicidade, a facilidade de uso como micro servios, entre
muitas outras.

Considero que existem cinco pilares a se terem em mente se o objetivo


alcanar um ambiente de entrega contnua realmente funcional:

Pilar 1: Versionamento
Seu cdigo deve estar versionado em um repositrio (geralmente Git), pois todo
o processo de integrao comea com um commit.

Pilar 2: Testes automatizados


O commit deve disparar (ou ao menos ser precedido, voc escolhe) por
uma bateria de testes automatizados, o que inclusive pode ser feito com as
bibliotecas citadas no captulo sobre testes.

Uma boa cobertura de testes crucial se voc quiser ser bem sucedido com
entrega contnua, caso contrrio a estratgia pode sair pela culatra, com bugs
sendo entregues em produo mais rpido do que nunca!

Pilar 3: Chaveamento de features


Como os commits vo parar na master bem cedo, geralmente antes do final
do projeto, natural que existam features que devem esperar para serem
lanadas e outras que devem ser lanadas imediatamente. O chaveamento
de features (feature toggle no original) tambm muito til quando se deseja
subir correes pra master sem adicionar as funcionalidades novas nas quais
voc ainda est trabalhando e so uma alternativa para as dores de cabea com
branches. Existe inclusive um mdulo no NPM chamado feature-toggles com
esse objetivo.

DEPLOY 38
Pilar 4: Ferramenta de CI
Existem diversas opes no mercado, tanto open-source quanto proprietrias,
tanto pagas quanto gratuitas, fica a seu critrio. A dica aqui : no reinvente a
roda. Existem excelentes opes consolidadas e bem testadas, apenas escolha
uma e siga em frente.

Algumas opes so:


Jenkins (open-source)
Travis
Codeship
Strider (open-source)
CircleCI

Basicamente o que essas ferramentas fazem so orquestrar builds complexos


que so iniciados a partir de commits no seu repositrio em uma branch
especfica. Esses builds podem incluir testes automatizados, execuo de
scripts, transferncia de arquivos, notificaes por email e muito mais. Tudo vai
depender do que seu projeto precisa.

Pilar 5: Rollback
Sempre tenha em mente que o processo pode falhar, ainda mais em uma
arquitetura complexa de deployment contnuo e que, se isso acontecer, tudo
deve continuar como estava antes do processo de CI ter sido inicializado. Um
rollback bem pensado e 100% funcional deve ser uma prioridade.

Com certeza no estressei esse assunto com estas poucas sugestes. Existem
excelentes livros sobre ALM, CI, etc mas espero ter despertado no mnimo o
interesse pelo assunto caso seja novidade para voc. Na Umbler facilitamos
esses processos atravs do deploy via Git e essa uma das caractersticas mais
apreciadas por nossos clientes.

DEPLOY 39
MDULOS
RECOMENDADOS

Simple things should be simple,


complex things should be possible.

Alan Kay
Uma das coisas mais fantsticas do Node.js o seu ecossistema. O NPM
rapidamente cresceu para se tornar o maior repositrio de bibliotecas e
extenses do mundo e isso em menos de uma dcada de existncia.

Esse captulo, na verdade, um ndice remissivo para que voc encontre


facilmente todos os mdulos recomendados nos demais captulos, apenas por
uma questo de organizao, em ordem alfabtica e com uma frase resumindo
do que se trata. Tomei a liberdade de incluir tambm outras bibliotecas notveis
que no foram citadas, mas que acredito serem importantes.

Clique nos links dos nomes para ir ao site de cada mdulo.

Artillery.io
Mdulo muito bacana para testes de carga e stress em APIs, no
necessariamente Node.

Babel
Transpilador muito utilizado para permitir a utilizao de recursos recentes do
EcmaScript mesmo em navegadores mais antigos. Mencionado no tpico sobre
JS Full-Stack no Captulo 3.

Chai
Popular biblioteca para uso de TDD e BDD com Node.js. Mencionado no tpico
sobre testes unitrios no captulo 4.

DotEnv e DotEnv-Safe
Mdulos para carregamento de variveis de ambiente de maneira rpida e
fcil. A diferena entre os dois pacotes que a verso safe no permite a
inicializao do sistema se as variveis de ambiente necessrias no puderam
ser encontradas. Citados no tpico de variveis de ambiente do captulo 3.

EJS (Embedded JavaScript)


View-engine muito popular para usa com Express visando permitir o uso de
HTML e JS para composio das views.

Express
Web framework extremamente popular para Node.js. Se voc no conhece,
deveria, resolve boa parte das demandas com Node de maneira rpida e fcil.

MDULOS RECOMENDADOS 41
Express Generator
Um scaffold para ExpressJS que j define uma arquitetura bsica mas bem til
para iniciar rapidamente com projetos Node.js.

Feature-toggles
Extenso para permitir facilmente fazer...feature-toggles. Citado no tpico sobre
integrao contnua no captulo 5.

Helmet
Mdulo de segurana que j blinda a sua aplicao Express quanto aos ataques
e brechas mais comuns em web applications. Citado no tpico de segurana no
captulo 5.

Hippie
Extenso para permitir o teste de APIs web abstraindo boa parte das
complicaes. Mencionado no tpico sobre testes unitrios no captulo 4.

Jasmine
Popular biblioteca para testes. Mencionado no tpico sobre testes unitrios no
captulo 4.

Loopback.io
Framework web muito popular para criao de APIs Restful.

Mocha
Popular biblioteca para testes. Mencionado no tpico sobre testes unitrios no
captulo 4.

Mongoose
ORM bem popular e poderoso, especialmente para uso com MongoDB, at 50%
mais veloz do que seu principal concorrente, Monk.

Node-Windows
Biblioteca para uso de scripts Node.js como Windows Service em servidores.
Citado no tpico de como manter seu processo no ar no captulo 5.

Passport
Autenticao em aplicaes Node.js, especialmente APIs.

MDULOS RECOMENDADOS 42
PM2
Gerenciador de processos para Node.js, visando recuperao de falhas,
monitoramento e muito mais. Citado no tpico de como manter seu processo no
ar no captulo 5.

Sequelize
ORM muito popular e indicado para uso de Node.js com bancos relacionais.

Socket.io
Comunicao ponto-a-ponto para aplicaes de mensageria em Node.js.

StandardJS
Linter JavaScript que determina um guia de estilo uniforme e popular para
codificao de projetos JS. Citado no tpico de guia de estilo no captulo 2.

Supertest
Extenso para permitir o teste de aplicaes web abstraindo o front-end.
Mencionado no tpico sobre testes unitrios no captulo 4.

Tap
Popular biblioteca para testes. Mencionado no tpico sobre testes unitrios no
captulo 4.

Typescript
Um superset que permite escrever em um JavaScript mais bombado que depois
compilado para JavaScript tradicional para uso em produo.

Winston
Popular (e poderosa) biblioteca para logging. Citado no tpico sobre visibilidade
dos erros no captulo 4.

Tem algum mdulo que voc conhece e recomenda e que no est nessa
lista? Mande para ns pelo amigos@umbler.com que incluiremos em revises
futuras deste guia!

MDULOS RECOMENDADOS 43
SEGUINDO
EM FRENTE

A code is like love, it has created


with clear intentions at the begin-
ning, but it can get complicated.

Gerry Geek
Este guia termina aqui.

Pois , certamente voc est agora com uma vontade louca de aprender mais e
criar aplicaes incrveis com Node.js, que resolvam problemas das empresas e
de quebra que o deixem cheio de dinheiro na conta bancria, no mesmo?

Pois , eu tambm! :)

Este guia propositalmente pequeno, com menos de 40 pginas. Como


professor, costumo dividir o aprendizado de alguma tecnologia (como Node.js)
em duas grandes etapas: aprender o bsico e executar o que foi aprendido no
mercado, para alcanar os nveis intermedirios e avanados. Acho que este guia
atende bem ao primeiro requisito, mas o segundo s depende de voc.

De nada adianta saber muita teoria se voc no aplicar ela. Ento agora que
terminou de ler este guia e j conhece uma srie de boas prticas com esta
fantstica plataforma, inicie hoje mesmo (no importa se for tarde) um projeto
de aplicao que as use. Caso no tenha nenhuma ideia, cadastre-se agora
mesmo em alguma plataforma de freelancing. Mesmo que no ganhe muito
dinheiro em seus primeiros projetos, somente chegaro os projetos grandes,
bem pagos e realmente interessantes depois que voc tiver experincia.

Me despeo de voc leitor com uma sensao de dever cumprido. Caso acredite
que est pronto para conceitos mais avanados, sugiro dar uma olhada em meu
blog LuizTools e na pgina Academy.

Outras fontes excelentes de conhecimentos especfico de Node o blog


RisingStack, enquanto que sobre JavaScript a Developer possui tudo que voc
pode precisar!

Caso tenha gostado do material, indique esse ebook a um amigo que tambm
deseja aperfeioar as suas habilidades com Node. No tenha medo da
concorrncia e abrace a ideia de ter um scio que possa lhe ajudar nos projetos.

Caso no tenha gostado tanto assim, envie suas dvidas, crticas e sugestes
para amigos@umbler.com que estamos sempre dispostos a melhorar.

Um abrao e at a prxima!

SEGUINDO EM FRENTE 45