Características importantes de Node.JS

Para definir Node.JS melhor, ajuda observar algumas características da plataforma e as diferenças de NodeJS com Javascript comum e com outras linguagens de programação.

Por Miguel Angel Alvarez - Tradução de Celeste Veiga


Publicado em: 20/2/13
Valorize este artigo:
 
Este Manual de Node.JS está criado através de algumas conversas #nodeIO que realizamos em CriarWeb.com, das quais estes artigos são uma transcrição. Neste ponto estamos ainda na primeira conversa, na que Alejandro Morales nos está esclarecendo alguns conceitos importantes para poder entender bem o que é NodeJS.

No artigo anterior vimos como se instalava esta NodeJS e neste texto veremos em detalhes algumas das características mais fundamentais de NodeJS. Entre todas elas nosso relator Alejandro Morales destacou: JavaScript sem limitações, Programação assíncrona e Programação orientada a eventos. Todos estes pontos serão vistos a continuação.
 

Um Javascript "sem restrições"

Com NodeJS temos um "Javascript sem restrições", tal como afirma @_alejandromg, já que tudo é executado no servidor e não temos que nos preocupar se nosso código será compatível ou não com diferentes clientes. Tudo que você escreva em Node JS e que funcione em seu servidor, estará seguro de que funcionará bem, seja qual for o sistema que se conecte, porque toda a execução de código do servidor fica isolada no servidor.

Nota: Este detalhe de confiabilidade e compatibilidade, ou o que o autor chamou de Javascript "sem restrições" (por estar executado em um ambiente seguro, do lado do servidor) não deixa de ser uma vantagem de todos as linguagens do lado do servidor, como PHP, ASP.NET, JSP, etc.

Porém, não só isso, o Javascript original tem algumas estruturas de controle que realmente não se utilizam no dia a dia , mas que realmente existem e estão disponíveis em NodeJS. Em algumas ocasiões resulta especialmente útil alguma das melhorias de Javascript em temas como a herança.

Outro exemplo é que em Javascript você faz:

for(var key in obj){ }

Enquanto que nas novas versões de Javascript você poderia fazer este outro:

Object.keys(obj).forEach()
 

Programação Assíncrona

Este é um conceito que algumas pessoas não conseguem entender de primeira e que agora toma especial importância, dado que NodeJS foi pensado desde o primeiro momento para potenciar os benefícios da programação assíncrona.

Imaginemos que um programa tem um fragmento de código que tarda cinco segundos em ser resolvido . Na maioria das linguagens de programação precedentes, durante todo esse tempo o fio de execução se encontra parado, esperando que passem esses cinco segundos, ou os que seja, antes de continuar com as instruções seguintes. Na programação assíncrona você é capaz de criar diferentes fios, com diferentes processos que levarão um tempo a serem executados , de modo que sejam feitos todos simultaneamente. Ademais, você poderá especificar código (callbacks) que se execute ao final de cada um desses extensos processos.

A filosofia detrás de Node.JS é fazer programas que não bloqueiem a linha de execução de código com respeito a entradas e saídas, de modo que os ciclos de processamento fiquem disponíveis quando se está esperando que se completem essas ações. Isto se implementa a partir de "callbacks" que são funções que se indicam com cada operação I/O e que se executam quando as entradas ou saídas foram completadas.

Nota: Estes callbacks são mais ou menos como os que podemos conhecer de outros sistemas Javascript como jQuery. Funções que são colocadas em execução quando terminam serem executadas outras.

Por exemplo olhemos este código:

console.log("ola");
fs.readFile("x.txt", function(erro, arquivo){
   console.log("arquivo");
})
console.log("ja!");

Realmente Javascript é síncrono e executa as linhas de código uma detrás de outra, mas pela forma de ser executado o código torna possível a programação assíncrona. A segunda instrução (que faz a leitura do arquivo) demora um pouco em ser executada e nela indicamos ademais uma função com um console.log ("arquivo"), essa é a função callback que só será executada quando termine a leitura do arquivo. A continuação, e antes que se termine a leitura do arquivo executa a instrução com o último console.log().

Como resultado, primeiro veremos a mensagem"ola" no console, depois a mensagem "ja!" e por último, quando o arquivo terminou sua leitura, veremos a mensagem "arquivo".
 

Problema do código piramidal

O uso intensivo de callbacks na programação assíncrona produz o pouco desejável efeito de código piramidal, também conhecido habitualmente como "código Espaguete". Ao se utilizarem os callbacks, se colocam umas funções dentro de outras e se vai entrando em níveis de profundidade que fazem um código menos simples de entender visualmente e de manter.

A solução é fazer um esforço adicional para estruturar nosso código, que basicamente se trata de modularizar o código de cada uma das funções, para escrevê-las à parte e ao indicar a função callback, em vez de escrever o código, escrevemos o nome da função que se definiu à parte. Você poderia, inclusive, definir as funções em arquivos à parte e requerê-las com require("nome_arquivo") no código de sua aplicação.

Ao conseguir níveis de indentação menos profundos, estamos ordenando o código, e com isso será mais simples de entender e também mais fácil de encontrar possíveis erros. Ademais, no fim das contas, conseguirá que seja mais escalável e possa estendê-lo no futuro ou mantê-lo por qualquer razão.

Alguns conselhos à hora de escrever código para que ele seja de maior qualidade:

  • Escreva código modularizado (um arquivo com mais de 500 linhas de código pode que estar mal proposto)
  • Não abuse, não repita as mesmas coisas, melhor evitar.
  • Use bibliotecas que ajudem o controle (como async que te ajuda a ordenar essa quantidade de callbacks)
  • Use promessas e futuros
  • Use um estilo continuo (Exemplo: https://gist.github.com/4192304)
  • Conheça a linguagem

 

Programação orientada a eventos (POE)

Conhecemos a programação orientada a eventos porque a utilizamos em Javascript para escrever aplicações do lado do cliente. Estamos acostumados ao sistema, que em NodeJS é algo diferente, embora siga o mesmo conceito.

Em Javascript do lado del cliente temos objetos como "window" ou "document" mas em Node.JS não existem, pois estamos no lado do servidor.

Eventos que poderemos captar no servidor serão diferentes, como "uncaughtError", que se produz quando se encontra um erro pelo qual um processo já não possa continuar. O evento "data" é quando chegam dados por um stream. O evento "request" sobre um servidor também se pode detectar e executar coisas quando se produza esse evento.

Voltamos a insistir, NodeJS seria um equivalente a PHP, JSP, ASP.NET e então tudo que sejam eventos de Node, serão coisas que ocorram no lado do servidor, diferentemente dos eventos de Javascript comum que são do lado do cliente e ocorrem no navegador.

Nota: A comparação de Node.JS com linguagens do lado do servidor é bom para entender como podem seus eventos ser distintos dos de Javascript do lado do cliente. No entanto devemos saber que Node.JS é um framework baseado em Javascript do lado do servidor, razão pela qual seu equivalente mais próximo poderia ser algo como Django ou Ruby on Rails. Há que matizar, contudo, que essa comparação pode ser um pouco atrevida, devido a que NodeJS estaria em um nível muito mais baixo (mais próximo à máquina) e embora você possa usá-lo sem mais acréscimos para o desenvolvimento de web sites, se combina com outros frameworks como ExpressJS para dar maiores facilidades para a criação de sites aplicações web.

 

Conclusão

Pouco a pouco vamos entendendo o que é (e o que NÃO é) NodeJS. São todos conceitos que resultarão novos para muitos dos leitores e por isso era importante deixá-los claros. Agora vamos passar a explicar algumas outras coisas de interesse que utilizamos no dia a dia nesta plataforma, como o gestor de pacotes npm.
 






Usuários :    login / registro

Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato