Node101: Introdução ao Node.js - Semana 1
Não é segredo que hoje em dia, podemos utilizar JavaScript em qualquer lugar: browser, servidor, apps para móveis ou desktops e até mesmo para Smart TV’s. Todo este avanço aconteceu graças ao Node.js, a tecnologia que mudou o mundo do JavaScript para o que temos hoje.
Se você escreve código Front-End, já deve estar mais que familiarizado com ferramentas em Node como Grunt, Gulp, Webpack e outras.
Introdução
Node.js é uma tecnologia que nos permite executar JavaScript no servidor. Isso mesmo, no servidor.
Ele é open-source, cross-platform e foi introduzido em 2009 e tornou-se muito popular já que desempenha um papel significativo para o desenvolvimento web. Se estrelas no Github são um fator de popularidade, então ter mais de 54.000 estrelas deve significar ser muito popular.
Além disso, foi construído em C++ utilizando a JavaScript V8 que é o motor do Google Chrome, o que nos permite criar servidores web e muito mais.
Nos últimos anos, tenho me divertido muito com o Node e acho que aprendi o suficiente para compartilhar, receber feedback e aprender mais. Mas é muito importante entender que o Node não é uma bala de prata, nem sempre é a melhor solução para cada projeto. Qualquer um pode inicializar um servidor no Node, mas é preciso um entendimento mais profundo da linguagem e arquitetura de software para escrever aplicações escaláveis.
Você pode fazer download do Node em sua página oficial, mas eu sugiro que você utilize um gerenciador de versões como o NVM, o que vai permitir você instalar diferentes versões e alternar de acordo com a necessidade/versão do projeto que você estiver trabalhando.
O Node.js REPL
REPL significa “READ-EVAL-PRINT-LOOP”, ou seja, ele cria um ambiente de programação simples que lê o input
do usuário, a avalia a expressão, imprime o output
, repetindo o mesmo ciclo, assim como temos no console dos browsers modernos.
Como utilizar:
$ node
>
Você pode digitar qualquer expressão Javascript válida no REPL e ver o resultado instantaneamente:
> 121 + 392
513
Quando terminar de experimentar, pressione Ctrl + C
ou digite .exit
e pressione enter para sair do REPL.
Hello World!
Como sempre o exemplo mais estúpido na computação é o “Hello World!”, e veremos a seguir dois exemplos de como faze-lo:
const word = process.argv[2];
console.log('Hello %s!', word || 'World');
Neste primeiro exemplo, criamos um arquivo hello.js
que nos permite passar um argumento “word” da seguinte forma:
node hello.js # Hello World!
node hello.js Rafaell # Hello Rafaell!
Levando em conta que estamos utilizando o objeto process
o qual tem inúmeros métodos e propriedades sobre o atual processo em si. Neste caso utilizamos argv
que nada mais é que um array informando os argumentos executados neste processo. Agora, se criamos um arquivo o qual simplesmente nos mostra o que contem console.log(process.argv)
teremos o seguinte cenário:
node hello.js hello world
#[
# '/usr/bin/node',
# '/home/rafaell/examples/hello.js',
# 'hello',
# 'world'
#]
Ok, este exemplo foi muito simples, agora vamos ver um exemplo com um servidor web:
const {createServer} = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.write('Hello World!');
res.end();
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port} 🚀`)
})
Para executar este código, devemos criar um arquivo chamado server.js
e executar em nosso terminal node server.js
. Com isso se abrimos http://localhost:3000
em nosso navegador, podemos ver a mensagem “Hello World!” na página.
Descrevendo o código, na primeira linha importamos o módulo http
que já vem incluso na instalação do Node.js, depois definimos hostname
e port
que será servirá para informar onde a aplicação deve ser executada, em seguida criamos nosso server
utilizando o método createServer()
do módulo http
que criar um novo servidor HTTP.
Quando o servidor recebe uma requisição, é executada a nossa função que possui dois parâmetros, os objetos req
(Request: um objeto http.IncomingMessage
) e res
(Response: um objeto http.ServerResponse
). Esses dois objetos são essenciais para lidar com chamadas HTTP, onde o primeiro contém as informações sobre a requisição (neste exemplo, não utilizamos nenhuma informação), e o segundo é responsável por retornar dados para a requisição em si (neste exemplo, configuramos a header da resposta com um Content-Type
e status 200
além de devolver a mensagem Hello world
).
Módulos e NPM
O Node.js é uma plataforma de baixo nível, e para tornar as coisas mais fáceis e interessantes para os desenvolvedores, contamos com milhares módulos/bibliotecas que se tornaram muito populares com o tempo.
O Node já vem com alguns módulos pré-definidos, como o http
por exemplo, mas na maioria das vezes vamos precisar utilizar alguns módulos adicionais, os quais podemos instalar via NPM que nada mais é que o gerenciador de pacotes do Node, o qual também nos disponibilizar um programa npm
que podemos utilizar via terminal
$ npm install <nome_do_modulo>
$ npm install -g jshint
Neste caso, estamos instalando o módulo jshint globalmente em nosso sistema utilizando a flag -g
, o que agora nos da a capacidade de testar a qualidade de nosso código .js da seguinte maneira:
jshint nome_do_arquivo.js
Também podemos instalar pacotes localmente em um projeto ao invés de globalmente em nosso sistema. Para isso podemos utilizar o comando npm init
que nos vai guiar na criação do nosso arquivo package.json
que basicamente contem todos os módulos instalados no seu projeto e também algumas outras configurações, assim, toda vez que precisarmos adicionar uma dependência ao nosso projeto, podemos fazer isso com um simples comando npm install <nome_do_modulo> --save
. Isso vai automáticamente anexar a dependência ao nosso arquivo package.json
e também baixar o módulo em uma pasta chamada node_modules
.
O Node utiliza um sistema de módulos chamado Common JS. Com ele podemos importar e exportar módulos dentro de nossas aplicações de uma maneira muito simples. Até o atual momento, temos suporte parcial das features do ES6, porem ainda não contamos com módulos ES6 sem utilizar ferramentas como o Babel ou utilizando a flag --experimental-modules
ou adicionando em nosso package.json
a propriedade type: "module"
. Mas ainda sim, o Common JS funciona de forma simples e não requer nenhuma mágia negra para utiliza-lo.
Vamos ao um exemplo simples:
$ npm install pluralize --save
Agora que temos o módulo pluralize
disponível, podemos simplesmente importa-lo utilizando a função global require
:
const pluralize = require("pluralize")
const words = ['apple', 'banana', 'orange']
words.forEach((word) => console.log( pluralize(word) ));
// "apples"
// "bananas"
// "oranges"
E no momento em que criamos um arquivo que queremos deixar acessível para ser utilizado, podemos fazer isso através do objeto global module
:
const someModule = require('./path/someModule');
const myFunction = (...args) => someModule.method(args);
module.exports = myFunction;
Bem simples não concorda? E o melhor é que podemos importar e exportar qualquer coisa, seja um objeto, função ou até mesmo algum valor string
, number
, boolean
, etc bem como o sistema de módulos do ES6.
Eu não vou entrar mais afundo sobre como utilizar o NPM neste artigo, mas você pode aprender mais com a documentação oficial e também buscando os módulos para te auxiliar em um novo projeto na página oficial do NPM.
Vantagens
Além de velocidade e escalabilidade, um dos pontos fortes do Node é a simplicidade para desenvolver aplicações web, onde você utiliza a mesma linguagem de programação, o que torna tudo mais produtivo. Uma outra vantagem é a possibilidade de compartilhar código entre cliente e servidor, além de muitas outras como o modo que o Node opera através do “Event-Loop”, o qual eu não vou entrar muito a fundo aqui, mais você pode aprender mais sobre isso aqui e aqui.
Isso é tudo, sei que tudo isso é bem básico, mas a proposta é transmitir o básico de conhecimento sobre aplicações com Node.js, criando uma aplicação do zero ao deploy. No próximo artigo, vamos aprender um pouco mais sobre aplicações web utilizando o framework Express juntamente com alguns outros módulos.
Join the Conversation