Capitulo 9788575226773

Page 1

Ricardo R. Lecheta

Novatec



capítulo 1

Introdução

1.1 Introdução ao Node.js Node.js é uma linguagem baseada no motor de JavaScript V8 do Chrome que está sendo adotada no mundo inteiro por sua facilidade no desenvolvimento e performance. Node.js usa um modelo de E/S (entrada e saída ou I/O, em inglês) não bloqueante, é orientado a eventos (Event Driven) e extremamente leve, rápido e eficiente. Uma das suas principais características é utilizar JavaScript como linguagem de programação, o que é interessante, pois, historicamente, JavaScript sempre foi uma linguagem de sintaxe simples usada por web designers para construir sites. Node.js utiliza JavaScript como linguagem de servidor, algo que torna sua curva de aprendizado rápida, pois é uma linguagem amplamente conhecida e adotada no mercado.

1.2 A linguagem JavaScript A linguagem JavaScript (não confunda com Java da Sun/Oracle) foi originalmente criada pela Netscape em 1995. Com a ascensão da internet, rapidamente ganhou força e foi amplamente adotada como linguagem de script para a construção de websites. De 1996 a 1997, JavaScript foi levado para a ECMA para criar uma especificação-padrão que outros fornecedores poderiam implementar com base no trabalho feito no Netscape. Sendo assim, rapidamente JavaScript foi adotado por vários browsers e amplamente conhecido em todo o mundo. JavaScript é uma linguagem extremamente produtiva, dinâmica, não tipada (não precisa declarar os tipos das variáveis) e interpretada, além de possuir suporte à Orientação a Objetos. 14


Capítulo 1 ■ Introdução

15

Hoje, JavaScript evoluiu muito e não somente é usado nos browsers e na camada de apresentação dos sites, mas também no servidor graças à popularização da plataforma Node.js. Uma das melhorias no Node.js ao adotar o motor JavaScript V8 do Chrome é que a engine do Chrome compila o JavaScript, tornando a execução mais rápida, ao contrário do JavaScript clássico, que é interpretado pelo browser.

1.3 Arquitetura não bloqueante Diversas linguagens clássicas e amplamente adotadas pelo mundo, como Java, PHP, .NET, Ruby, Python etc., possuem uma arquitetura multi-threading e bloqueante. Para exemplificar, imagine um sistema web que tenha 1 milhão de acessos. Para cada acesso, é criada uma thread para cuidar dessa requisição. Essa thread permanece travada até que a requisição termine. Como os recursos e threads do sistema operacional são limitados, essa arquitetura apresenta problemas para escalar para sistemas que possuem milhões de acessos e são utilizados em larga escala. Caso o número de threads que o sistema operacional possui chegue ao limite, as requisições começam a ser enfileiradas, gerando um gargalo na resposta para o cliente, pois sempre uma requisição precisa terminar para depois iniciar a próxima. Essa é a arquitetura síncrona. Node.js possui uma proposta diferente, pois faz chamadas não bloqueantes (assíncronas), o que tem se mostrado uma solução extremamente eficiente e com excelente performance. Enquanto para escalar sistemas nas outras linguagens é muitas vezes preciso aumentar a capacidade do servidor (memória e CPU), ou até mesmo adicionar mais servidores em algum balanceador de carga, às vezes em Node.js é possível atender ao mesmo sistema com um hardware mais modesto, pois Node.js faz melhor uso e gerenciamento do hardware disponível.

1.4 Single Thread e Event Loop Quando o servidor Node.js é iniciado, possui uma única thread que fica escutando por eventos chamada de Event Loop. Na prática, se chegarem 100 requisições, estas serão enfileiradas e tratadas sequencialmente pelo Event Loop. Mas o segredo do Event Loop é que faz isso rapidamente e logo delega a tarefa para threads


16

Node Essencial

secundárias chamadas de workers. Essas threads secundárias executam a tarefa em background, de modo assíncrono, e quando terminam, enviam a resposta novamente para o Event Loop para ser processado. Esse modelo com o Event Loop recebendo as requisições e disparando tarefas assíncronas tem demonstrado ser muito eficiente e, por isso, o Node.js se tornou extremamente popular e tem caído nas graças dos desenvolvedores e empresas de todo o mundo.

1.5 Npm O Node.js utiliza o gerenciador de pacotes NPM (Node Package Manager), o que confere muita produtividade para gerenciar os pacotes (libs) que serão utilizadas no projeto. O NPM é um repositório on-line (npmjs.com) repleto de bibliotecas e chamado por linha de comando. Por exemplo, digamos que você precise de alguma biblioteca que facilite a persistência em algum banco de dados relacional ou NoSQL. Basta encontrá-la no repositório do NPM e referenciá-la no projeto. Com um simples comando no terminal, conseguimos baixar ou atualizar a versão dessa biblioteca. Veremos isso na prática no decorrer dos próximos capítulos.

1.6 Instalação do Node.js A instalação do Node.js é simples e recomendo que você siga os passos do site oficial: • Instalando o Node.js pelo gerenciador de pacotes https://nodejs.org/en/download/package-manager/

Nesta página, você pode selecionar o seu sistema operacional, como Windows, Linux e Mac, e ver o tutorial apropriado. Muitas vezes, dependendo do sistema operacional, o tutorial apenas vai redirecioná-lo para a página de download do Node.js, onde basta fazer o download e instalar. • Atalho para a página do download https://nodejs.org/en/#download


Capítulo 1 ■ Introdução

17

Depois de instalar o Node.js, abra o terminal e digite o seguinte comando para imprimir o número da versão do Node e npm instaladas: $ node --version && npm --version v9.3.0 5.5.1

Se quiser, digite separadamente os comandos node --version ou npm --version. Nota: Node.js é o nome correto da linguagem, mas, a partir deste momento, vou me referir a ela como apenas Node para facilitar o texto e explicações, até porque é assim que normalmente falamos no dia a dia.

1.7 Brincando com o terminal do Node Com o Node devidamente instalado, vamos brincar no terminal para testar a sintaxe da linguagem. No terminal, digite node para abrir o console e, depois, 1+1 e <enter>. Veremos que o Node vai retornar a soma dos números. Para encerrar o console, digite .exit e <enter>: $ node > 1+1 <enter> 2 > .exit <enter> $

Feito esse simples teste, continue no terminal e digite novamente o comando node para abrir o console. Na sequência, vamos praticar pequenos comandos para ir quebrando o gelo com a linguagem.

1. Declarando variáveis e a função console.log(string): > var a = 1 undefined > var b = 2 undefined > var c = a + b undefined


18

Node Essencial > c 3 > console.log(c) 3 undefined > console.log("O resultado da soma é", c); O resultado da soma é 3 undefined >

Utilizamos a palavra-chave var para declarar as variáveis e, logo depois, foi impresso o texto undefined, pois isso é o retorno da chamada, o qual, neste caso, não existe. Veja que foi impresso o valor da variável c de duas formas diferentes. Ao digitar apenas c no console, o valor da variável é impresso. Também testamos a função console.log(string). Nesse caso, a primeira linha imprimiu o valor 3 e, logo depois, foi retornado um undefined, novamente, pois a função console.log(var) não possui retorno. Note que a função console.log(string, ...args) possui múltiplos argumentos, então é possível imprimir a variável c no final assim: console.log("O resultado da soma é", c);

Ou podemos concatenar strings, fica a seu critério: console.log("O resultado da soma é " + c);

Caso você digite algo errado no console, não se preocupe, pois será retornado um texto informando que o resultado é inválido. Nesse caso, é só tentar novamente. Por exemplo: > nome ReferenceError: nome is not defined at repl:1:1 at sigintHandlersWrap (vm.js:22:35) at sigintHandlersWrap (vm.js:96:12) at ContextifyScript.Script.runInThisContext (vm.js:21:12) at REPLServer.defaultEval (repl.js:340:29)

Nesse exemplo, a variável nome ainda não foi definida, por isso tivemos um erro. Podemos declarar uma variável nome da seguinte forma: > nome = "Ricardo Lecheta" 'Ricardo Lecheta'


Capítulo 1 ■ Introdução

19

Veja que depois de declarar a variável, foi impresso o texto, pois é o retorno dessa chamada. Com a variável devidamente declarada, se a digitarmos novamente, o seu valor será impresso: > nome 'Ricardo Lecheta'

2. Criando funções A seguir, vamos criar a famosa função que vai imprimir o texto "Hello World" na tela: > function hello() { return "Hello, World" } undefined > hello [Function: hello] > hello() 'Hello, World'

Na primeira linha, criamos a função e, no retorno da chamada, foi impresso undefined. Logo depois, digitamos hello e hello(). Veja que a primeira chamada apenas imprime um texto informando que hello é uma função. Mas somente ao abrir e fechar parênteses a função foi invocada. Caso a função hello() seja alterada para imprimir o texto com a função console. log(string), veja que ao chamá-la são impressas duas linhas: > function hello() { return console.log("Hello, World") } undefined > hello() Hello, World undefined

A primeira linha imprimiu Hello, World, pois é o resultado do console.log(string). A segunda imprimiu undefined, pois a função hello() não possui retorno. Funções também podem ser declaradas como variáveis e receber parâmetros. Veja a sintaxe neste simples exemplo que soma dois números: > var soma = function(a,b) { return a + b } undefined > soma(1,2) 3


20

Node Essencial

1.8 Executando códigos em Node no terminal Se quiser testar um código um pouco maior, brincar no terminal será inviável. Uma solução melhor é criar um arquivo .js com o código-fonte do programa em Node que deseja executar. Crie o arquivo hello.js no seu editor de texto preferido. Se estiver em um terminal de Mac ou Linux, use os bons e velhos conhecidos vi e vim:

hello.js console.log("Hello, World Node.js!")

Neste caso, o arquivo hello.js possui apenas uma única linha, mas, para fins de teste, já é suficiente. Para executar esse arquivo, digite no terminal o comando node nome_arquivo: $ node hello.js Hello, World Node.js

Como vimos, é muito fácil executar e testar programas em Node. Vale lembrar que tudo o que vimos até aqui foram códigos na linguagem JavaScript, portanto, se você já tem familiaridade com JavaScript ou mesmo noções básicas de programação, não deve ter tido problemas.

1.9 Editores de texto Antes de prosseguir com a leitura do livro, recomendo que instale algum destes editores de texto para JavaScript. • SublimeText https://www.sublimetext.com/

• WebStorm https://www.jetbrains.com/webstorm/

• Visual Code https://code.visualstudio.com/docs/languages/javascript


Capítulo 1 ■ Introdução

21

No meu computador, tenho instalados o SublimeText, por sua simplicidade, e o WebStorm, pois facilita a visualização de um projeto quando há muitas pastas e arquivos. Como gosto de programar para Android, o WebStorm tem a vantagem de ser da JetBrains, mesma empresa que faz o Android Studio, portanto possuem um visual parecido.

1.10 Links úteis e download dos códigos de exemplo Para auxiliar nos seus estudos, você poderá baixar o código-fonte dos exemplos deste livro no GitHub e também utilizar os seguintes links para contato e dúvidas referentes ao livro: • GitHub com códigos do livro https://github.com/livronode/1ed

• Blog com artigos e tutoriais variados http://ricardolecheta.com.br

• Google+ https://plus.google.com/+RicardoLecheta

• Facebook https://www.facebook.com/ricardolecheta

• Twitter https://twitter.com/rlecheta

• Fórum de dúvidas (apenas sobre os livros) https://groups.google.com/forum/m/#!forum/livros-lecheta


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.