Bacharel em Sistemas de Informação pela Universidade Católica de Santos, blo-
gueiro nos tempos livres, apaixonado por programação, web, tecnologias, filmes e
seriados.
Participante das comunidades:
NodeBR: Comunidade Brasileira de Node.js
MeteorBrasil: Comunidade Brasileira de Meteor
DevInSantos: Grupo de Desenvolvedores de Software em Santos
Iniciei em 2011 como palestrante nos eventos DevInSantos e Exatec, abordando
temas atuais sobre Node.js e Javascript.
Autor dos Blogs: Underground WebDev e Underground Linux.
v
Casa do Código
Prefácio
As mudanças do mundo web
Tudo na web se trata de consumismo e produção de conteúdo. Ler ou escrever blogs,
assistir ou enviar vídeos, ver ou publicar fotos, ouvir músicas e assim por diante. Isso fazemos naturalmente todos os dias na internet. E cada vez mais aumenta a necessidade dessa interação entre os usuários com os diversos serviços da web. De fato, o
mundo inteiro quer interagir mais e mais na internet, seja através de conversas com
amigos em chats, jogando games online, atualizando constantemente suas redes so-
ciais ou participando de sistemas colaborativos. Esses tipos de aplicações requerem
um poder de processamento extremamente veloz, para que seja eficaz a interação
em tempo real entre cliente e servidor. E mais, isto precisa acontecer em uma escala
massiva, suportando de centenas a milhões de usuários.
Então o que nós desenvolvedores precisamos fazer? Nós precisamos criar uma
comunicação em tempo real entre cliente e servidor que seja rápido, atenda muitos
usuários ao mesmo tempo e utilize recursos de I/O (dispositivos de entrada ou saída)
de forma eficiente. Qualquer pessoa com experiência desenvolvimento web sabe que
o HTTP não foi projetado para suportar estes requisitos. E pior, infelizmente exis-
tem sistemas que os adotam de forma ineficiente e incorreta, implementando solu-
ções workaround (Gambiarras) que executam constantemente requisições assín-
cronas no servidor, mais conhecidas como long-polling. Para sistemas trabalharem
em tempo real, servidores precisam enviar e receber dados utilizando comunica-
ção bidirecional, ao invés de utilizar intensamente requisição e resposta do modelo
HTTP através do Ajax. E também temos que manter esse tipo comunicação de forma
leve e rápida para manter escalável, reutilizável e fácil de manter o desenvolvimento
a longo prazo.
A quem se destina esse livro?
Esse livro é destinado aos desenvolvedores web, que tenham pelo menos conhe-
cimentos básicos de Javascript e arquitetura cliente-servidor. Ter domínio desses
vii
Casa do Código
conceitos, mesmo que seja um conhecimento básico deles, será essencial para que a
leitura desse livro seja de fácil entendimento.
Como devo estudar?
Ao decorrer da leitura serão apresentados diversos conceitos e códigos, para que
você aprenda na prática toda a parte teórica do livro. A partir do capítulo 4 até o
capítulo final, iremos desenvolver na prática um projeto web, utilizando os principais frameworks e aplicando as boas práticas de desenvolvimento Javascript para Node.js.
viii
Casa do Código
Sumário
Sumário
1
Bem-vindo ao mundo Node.js
1
1.1
O problema das arquiteturas bloqueantes
. . . . . . . . . . . . . . . .
1
1.2
E assim nasceu o Node.js . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.3
Single-thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.4
Event-Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.5
Instalação e configuração . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.6
Gerenciando módulos com NPM . . . . . . . . . . . . . . . . . . . . .
7
1.7
Entendendo o package.json . . . . . . . . . . . . . . . . . . . . . . . . .
8
1.8
Escopos de variáveis globais . . . . . . . . . . . . . . . . . . . . . . . .
10
1.9
CommonJS, Como ele funciona? . . . . . . . . . . . . . . . . . . . . .
10
2
Desenvolvendo aplicações web
13
2.1
Criando nossa primeira aplicação web . . . . . . . . . . . . . . . . . .
13
2.2
Como funciona um servidor http? . . . . . . . . . . . . . . . . . . . . .
14
2.3
Trabalhando com diversas rotas . . . . . . . . . . . . . . . . . . . . . .
15
2.4
Separando o HTML do Javascript . . . . . . . . . . . . . . . . . . . . .
18
2.5
Desafio: Implementar um roteador de url . . . . . . . . . . . . . . . .
19
3
Por que o assíncrono?
21
3.1
Desenvolvendo de forma assíncrona . . . . . . . . . . . . . . . . . . .
21
3.2
Assincronismo versus Sincronismo . . . . . . . . . . . . . . . . . . . . 24
3.3
Entendendo o Event-Loop . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.4
Evitando Callbacks Hell . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
ix
Sumário
Casa do Código
4
Iniciando com o Express
31
4.1
Por que utilizá-lo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
4.2
Instalação e configuração . . . . . . . . . . . . . . . . . . . . . . . . . .
32
4.3
Criando um projeto de verdade . . . . . . . . . . . . . . . . . . . . . .