O Node.js é um interpretador de código JavaScript que funciona do lado do servidor. Esta plataforma permite aos programadores o desenvolvimento de aplicações em rede, em tempo real e de alta escalabilidade, de uma forma simples e rápida. O Node.js é baseado no interpretador V8 da Google.
Hoje vamos aprender a instalar o Node.js no Ubuntu e aprender a criar as primeiras apps.
Como referido, uma das razões que está a tornar o node.js cada vez mais popular é a utilização do javascript como linguagem de programação. Antes do node.js, o javascript era apenas utilizado no browser e para programarmos no lado do servidor teríamos que utilizar outra linguagem como o PHP.
Isto obrigava que um programador Web precisasse ter conhecimentos em HTML, CSS, Javascript e uma outra linguagem. O node.js veio mudar isso oferecendo-nos a possibilidade de escrever servidores Web utilizando o javascript e graças ao modelo não bloqueante obter uma boa performance.
Neste pequeno tutorial vamos mostrar como criar um servidor de conteúdo estático, como é o caso de ficheiros HTML ou CSS. Qualquer servidor HTTP conseguiria fazer a mesma tarefa sem termos de recorrer à programação, mas vamos aproveitar para conhecer melhor o node.js.
O node.js está disponível para varias plataformas. Como editor de texto vamos usar o poderoso Sublime Text.
Estrutura do Projecto
A estrutura do projecto será bastante simples, vamos criar uma pasta principal e, dentro dessa pasta, iremos ter a nossa aplicação “server.js” e a pasta “public” onde iremos colocar todo o conteúdo do nosso site, ficheiros HTML, CSS e outros irão para aqui.
|---public\
|
|---server.js
Para não começarmos do zero, procurei um template gratuito que fosse responsivo e com o aspecto pretendido para o nosso site. Um site com design responsivo é um site que se adapta a vários tamanhos de ecrã seja ele Desktop, Tablet ou Smartphone.
O framework mais popular que nos permite fazer isso chama-se bootstrap e foi criado pelo Twitter para facilitar o desenvolvimento de páginas web, dando-lhes um aspecto uniforme. São boas fontes de pesquisa para este tipo de templates os sites startbootstrap ou o shapebootstrap. Depois de encontrado o template, fiz-lhe algumas alterações e copiei todos os ficheiros e pastas para a pasta “public”. Vamos agora começar a desenvolver o servidor no ficheiro “server.js”.
Em vez de reunir todos os componentes directamente no node.js, optou-se por permitir adicionar funcionalidades ao node.js através de módulos e é por aí que vamos começar. Logo no início da aplicação vamos incluir os módulos que iremos utilizar.
var http = require('http')
var url = require('url')
var fs = require('fs')
var path = require('path')
Neste tutorial vou apenas utilizar módulos core ou seja módulos que já vêm incluídos no node.js. Podemos também instalar módulos externos através do node package manager ou npm.
Este utilitário é instalado juntamente com o node.js e permite-nos instalar milhares de módulos de código aberto e assim adicionar funcionalidades às aplicações que estamos a desenvolver. Pesquisando o repositório em npmjs.com poderíamos com certeza encontrar algum modulo que fornecesse as funcionalidades que pretendemos implementar no servidor mas não é esse o objetivo deste tutorial.
Criação do Servidor Web
A seguir vamos criar o servidor no localhost porta 80 que é a porta utilizada pelo protocolo de transferência HTTP.
http.createServer(function (pedido, resposta) {
// Aqui vamos escrever o código do servidor que vai ser
// executado sempre que for feito um pedido
}).listen(80, 'localhost', function () {
console.log('--- O servidor arrancou –--');
});
Se observarmos o código acima vemos uma coisa que pode parecer estranha, as funções podem ter como parâmetros outras funções, são as chamadas callback functions, perceber o seu mecanismo é essencial para o desenvolvimento em node.js, por isso aconselho o estudo mais aprofundado deste tema. Por exemplo, na linha:
… listen(80, 'localhost', function () { … });
foi definida uma função anónima que vai ser executada após o arranque do servidor.
Para arrancar com o servidor abrimos a linha de comandos, mudamos para a pasta do projecto e escrevemos:
node server.js
O nosso servidor ainda não faz nada, simplesmente mostra no ecrã a informação que o servidor arrancou. Para interromper a execução do servidor digite CTRL+C.
Sempre que for feito um pedido ao servidor temos que:
- 1º Saber qual o ficheiro pedido (pagina html)
- 2º Ler o ficheiro correspondente a partir da pasta public
- 3º Responder ao pedido com o conteúdo do ficheiro lido
Quando escrevemos o endereço http://www.exemplo.com/caminho/recurso num browser de internet podemos ver que esse endereço é composto por diversas partes. A parte que nos interessa é o caminho/recurso. Para obtê-lo e vamos escrever o seguinte:
...
// Aqui vamos escrever o código do servidor que vai ser
// executado sempre que for feito um pedido
var caminho = url.parse(pedido.url).pathname;
Porque os ficheiros que pretendemos utilizar estão na pasta public vamos criar uma variável com o caminho completo do ficheiro a ler.
if (caminho==='/') {
var ficheiro = path.join(__dirname, 'public', caminho, 'index.html');
} else {
var ficheiro = path.join(__dirname, 'public', caminho);
}
A função path.join é utilizada para juntar as diversas partes do caminho. A variável __dirname é uma variável do node.js que indica a pasta do script atual, à qual juntamos a pasta public e o caminho obtido a partir do url. Quando o endereço que escrevemos no browser não contém o caminho/recurso então o conteúdo a apresentar será a página index.html.
A seguir vamos então ler o ficheiro correspondente ao caminho/recurso que foi pedido ao servidor.
fs.readFile(ficheiro, function (erro, dados) {
if (erro) {
resposta.writeHead(404);
resposta.end();
} else {
resposta.end(dados);
}
Se o ficheiro que foi pedido não existir ou caso ocorra algum erro ao ler o ficheiro devolvemos o código de status 404 e terminamos a resposta do servidor, caso contrário devolvemos o conteúdo do ficheiro. Se não definirmos um código de status ele será sempre 200 ou seja não ocorreram erros.
Testar…
Para testar vamos iniciar novamente o server.js, abrir um browser de internet e digitar o endereço http://127.0.0.1. Podemos ver que o servidor já funciona mas a nossa página de internet parece estar com alguns problemas de formatação.
Para que uma página seja correctamente interpretada pelo browser temos que incluir na resposta do servidor o tipo de conteúdo que estamos a enviar. Podemos fazer isso observando a extensão do nome do ficheiro que estamos a ler, por exemplo, para o ficheiro “índex.html” a extensão é “html” e o tipo de conteúdo será “text/html”.
Para resolver este problema vamos criar um objecto com as extensões dos ficheiros incluídos no template e o seu correspondente tipo de conteúdo. Vamos adicionar este objecto antes da criação do servidor.
var contentTypes = {
'html' : 'text/html',
'css' : 'text/css',
'ico' : 'image/x-icon',
'png' : 'image/png',
'svg' : 'image/svg+xml',
'js' : 'application/javascript',
'otf' : 'application/x-font-otf',
'ttf' : 'application/x-font-ttf',
'eot' : 'application/vnd.ms-fontobject',
'woff' : 'application/x-font-woff',
'woff2': 'application/font-woff2',
'zip' : 'application/zip'
}
Podemos encontrar uma lista com os tipos de conteúdo em http://www.freeformatter.com/mime-types-list.html
Vamos também adicionar antes da resposta do servidor com o conteúdo do ficheiro as linhas abaixo, onde obtemos a extensão do ficheiro e definimos o tipo de conteúdo utilizando o objecto anteriormente criado.
var extensao = path.extname(ficheiro).slice(1);
resposta.setHeader('Content-Type', contentTypes[extensao]);
Com isto fica concluído este tutorial cujo objectivo não era ser perfeito nem definitivo, pretendendo apenas ser um ponto de partida para um maior conhecimento do node.js.
Para publicar o site na internet utilizei a versão gratuita da plataforma Openshift desenvolvida pela Red Hat. O resultado final pode ser visto em http://server-rgapps.rhcloud.com/ onde também existe um link para download do código da aplicação e template.