o modulo-1 somente será incluído sua versão fixa, a 1.0.0. Utilize este tipo ver-
são para instalar dependências cuja suas atualizações possam quebrar o projeto pelo
simples fato de que certas funcionalidades foram removidas e ainda as utilizamos na
aplicação. O segundo módulo já possui uma certa flexibilidade de update. Ele utiliza
o caractere ~ que faz atualizações a nível de patch (1.0.x), geralmente essas atualizações são seguras, trazendo apenas melhorias ou correções de bugs. O modulo-3
atualiza versões que seja maior ou igual a 1.0.0 em todos os níveis de versão. Em
muitos casos utilizar >= pode ser perigoso, por que a dependência pode ser atua-lizada a nível major ou minor, contendo grandes modificações que podem quebrar
um sistema em produção, comprometendo seu funcionamento e exigindo que você
atualize todo código até voltar ao normal. O último, o modulo-4, utiliza o caractere
"* , este sempre pegará a última versão do módulo em qualquer nível. Ele também pode causar problemas nas atualizações e tem o mesmo comportamento do versionamento do modulo-3. Geralmente ele é utilizado em devDependencies, que
são dependências focadas para testes automatizados, e as atualizações dos módulos
9
1.8. Escopos de variáveis globais
Casa do Código
não prejudicam o comportamento do sistema que já está no ar.
1.8
Escopos de variáveis globais
Assim como no browser, utilizamos o mesmo Javascript no Node.js, ele também
utiliza escopos locais e globais de variáveis. A única diferença é como são implementados esses escopos. No client-side as variáveis globais são criadas da seguinte
maneira:
window.hoje = new Date();
alert(window.hoje);
Em qualquer browser a palavra-chave window permite criar variáveis globais
que são acessadas em qualquer lugar. Já no Node.js utilizamos uma outra keyword
para aplicar essa mesma técnica:
global.hoje = new Date();
console.log(global.hoje);
Ao utilizar global mantemos uma variável global, acessível em qualquer parte
do projeto sem a necessidade de chamá-la via require ou passá-la por parâmetro
em uma função. Esse conceito de variável global é existente na maioria das lingua-
gens de programação, assim como sua utilização, pelo qual é recomendado trabalhar
com o mínimo possível de variáveis globais, para evitar futuros gargalos de memória
na aplicação.
1.9
CommonJS, Como ele funciona?
O Node.js utiliza nativamente o padrão CommonJS para organização e carregamento
de módulos. Na prática, diversas funções deste padrão será utilizada com frequência
em um projeto Node.js. A função require('nome-do-modulo') é um exem-
plo disso, ela carrega um módulo. E para criar um código Javascript que seja mo-
dular e carregável pelo require, utilizam-se as variáveis globais:
exports ou
module.exports. Abaixo apresento-lhe dois exemplos de códigos que utilizam
esse padrão do CommonJS, primeiro crie o código hello.js:
module.exports = function(msg) {
console.log(msg);
};
10
Casa do Código
Capítulo 1. Bem-vindo ao mundo Node.js
E também crie o código human.js com o seguinte código:
exports.hello = function(msg) {
console.log(msg);
};
A diferença entre o hello.js e o human.js esta na maneira de como eles
serão carregados. Em hello.js carregamos uma única função modular e em
human.js é carregado um objeto com funções modulares. Essa é a grande diferença
entre eles. Para entender melhor na prática crie o código app.js para carregar esses
módulos, seguindo o código abaixo:
var hello = require('./hello');
var human = require('./human');
hello('Olá pessoal!');
human.hello('Olá galera!');
Tenha certeza de que os códigos hello.js, human.js e app.js estejam na
mesma pasta e rode no console o comando: node app.js.
E então, o que aconteceu? O resultado foi praticamente o mesmo, o app.js
carregou os módulos: hello.js e human.js via require(), em seguida foi
executado a função hello() que imprimiu a mensagem Olá pessoal! e por úl-
timo o objeto human que executou sua função human.hello('Olá galera!').
Percebam o quão simples é programar com Node.js! Com base nesses pequenos
trechos de código já foi possível criar um código altamente escalável e modular que
utiliza as boas práticas do padrão CommonJS.
11
Capítulo 2
Desenvolvendo aplicações web
2.1
Criando nossa primeira aplicação web
Node.js é multiprotocolo, ou seja, com ele será possível trabalhar com os protoco-
los: HTTP, HTTPS, FTP, SSH, DNS, TCP, UDP, WebSockets e também existem outros
protocolos, que são disponíveis através de módulos não-oficiais criados pela comu-
nidade. Um dos mais utilizados para desenvolver sistemas web é o protocolo HTTP.
De fato, é o protocolo com a maior quantidade de módulos disponíveis para trabalhar
no Node.js. Na prática desenvolveremos um sistema web utilizando o módulo nativo
HTTP, mostrando suas vantagens e desvantagens. Também apresentarei soluções de
módulos estruturados para desenvolver aplicações complexas de forma modular e
escalável.
Toda aplicação web necessita de um servidor para disponibilizar todos os seus