Globalcode – Open4education
Apresentando NodeJS
Giovanni Bassi
giovanni@lambda3.com.br
@giovannibassi
Globalcode – Open4education
Agenda
O que é NodeJS
Modelo assíncrono
Instalando
Módulos
Pacotes
Scripting
Processo de desenvolvimento, debug, testes
Rodando em produção
Mitos, verdades e dúvidas
JavaScript no Servidor
Não é baseado em threads
Eficiente e altamente escalável
Globalcode – Open4education
Quem usa?
Globalcode – Open4education
O que é NodeJS
Ambiente de execução e bibliotecas para rodar
JavaScript
Independente de qualquer navegador
Multiplataforma (Linux, Windows, Mac, etc)
Open Source (https://github.com/joyent/node)
Single threaded
Globalcode – Open4education
Modelo assíncrono
Loop de eventos com uma única thread
Globalcode – Open4education
Node é…
Globalcode – Open4education
O que é NodeJS
Servidor
Não só http ou https
Cliente
App desktop: excelente opção multiplataforma
Ambiente de desenvolvimento para frontend web
Globalcode – Open4education
História
Somente 5 anos de vida (criado em 2009)
Lead e criador: Ryan Dahl
2010: começa a ganhar mais popularidade
2011
surge NPM
suporte nativo a Windows
2012: Novo lead: Isaac Schlueter (npm)
2014
Novo lead: Timothy Fontaine
“bug fixing, performance tuning, staying up to date with the V8
engine”
Globalcode – Open4education
Instalando
Linux:
baixe os binários
use nvm (node version manager) ou outro similar
use o seu gestor de pacotes favorito (geralmente está
desatualizado)
Windows:
baixe o instalador (ou o binário)
use o chocolatey
Mac:
baixe o instalador ou o binário
Todos: baixe e compile
Globalcode – Open4education
Instalando (NVM)
Muito útil para manter diferentes versões do Node
na mesma máquina
Para baixar a última versão estável:
nvm install 0.10
Para usar uma versão:
nvm use 0.10
Para deixar a versão 0.10 imediatamente
disponível:
nvm alias default 0.10
Disponível somente em Linux
Globalcode – Open4education
Sistemas de versões
Pares: estáveis
0.8, 0.10
Ímpares: instáveis/experimentais
0.9, 0.11 (ex: já com novidades do EcmaScript 6)
Obs: Pode mudar no futuro
Globalcode – Open4education
Primeiro contato: REPL
Abra uma janela de terminal e digite simplesmente
“node”:
Globalcode – Open4education
Node como ferramenta para JavaScript
Abra uma janela de terminal e digite simplesmente
“coffee”:
Globalcode – Open4education
Módulos (declarando e consumindo)
//math.js
module.exports = {
soma: function (a, b) { return a + b; }
}
//outro.js
var math = require('./math');
math.soma(1, 2); //3
Globalcode – Open4education
Módulos nativos
O Node vem com uma série de módulos nativos, a
maioria escrito em JavaScript
Path, Console, HTTP, Streams, Eventos, OS, etc...
API bem documentada em http://nodejs.org/api/
Globalcode – Open4education
Pacotes
Gerenciados pelo NPM
NPM vem com as instalações padrão do node, mas pode ser
atualizado separadamente
npm install npm -g
http://npmjs.org
Quase 90k pacotes
400M de downloads por mês
Empacotam módulos
Utilizam Semver (http://semver.org)
Registry aberto, qualquer um pode registrar pacotes
Suporta “pacotes corporativos”
Globalcode – Open4education
Pacotes (dependências)
Sempre locais
Há pacotes globais, mas nunca são carregados pela sua
aplicação, mas usados para criar scripts de execução
global
coffee, grunt, gulp, mocha, azure
Ficam no diretório node_modules da sua aplicação
Globalcode – Open4education
Pacotes (Package.json)
Define um módulo
Informa:
Nome e versão do módulo
Versão do node suportada pelo módulo
Endereço do repositório
Dependências de produção, desenvolvimento
Scripts (run, teste, deploy, etc)
Etc...
Globalcode – Open4education
Exemplo de package.json
{
"name": "projeto",
"version": "0.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "",
"license": "ISC"
}
Globalcode – Open4education
Pacotes (dependências)
/suaapp
/node_modules
/dep_a (versão 1.0)
/node_modules
/dep_z (versão 3.0)
/dep_b (versão 1.0)
/node_modules
/dep_z (versão 4.0)
O único sistema de módulos e pacotes que
permite versões diferentes de subdependências
Globalcode – Open4education
NPM
Iniciar um módulo/projeto (vai criar o package.json)
npm init <dir>
Instalar todas as dependências do projeto
npm install
Instalar um módulo
npm install <modulo>
e gravar isso no package.json
--save
ou como dependência de desenvolvimento
--save-dev
Atualizar tudo
npm update
Globalcode – Open4education
DEMO
REPL
npm init
npm install
require
Globalcode – Open4education
Scripting
Bem mais fácil escrever JavaScript/CoffeeScript do
que Bash
Inicie com um shebang apontando pro node e
diverta-se:
#!/usr/bin/env node
console.log('hello tdc');
Ou com coffee:
#!/usr/bin/env coffee
console.log 'hello tdc'
Globalcode – Open4education
Processo de desenvolvimento
Inicie o servidor com:
node <seuarquivo.js>
Altere o arquivo
Pare e reinicie o servidor
Isso pode ficar muito chato, então use o nodemon
ou algo parecido
npm install nodemon -g
Globalcode – Open4education
Debug
Há um debugger nativo, acessível via linha de
comando
node debug <seuarquivo.js>
Complexo de usar, na prática ninguém usa
Ao iniciar dessa forma a aplicação para de imediato
Mais fácil delegar o acesso a uma ferramenta mais
avançada
node --debug <seuarquivo.js>
Ou --debug-brk
Abra o node-inspector
Abra o Chrome no endereço indicado e use o F12 que
você já conhece
Globalcode – Open4education
DEMO
Debug
Globalcode – Open4education
Testes
A natureza assíncrona do JavaScript torna os
testes mais difíceis de escrever
Usa-se callbacks e promisses para resolver o problema
Uma série de frameworks existem, atualmente o
Mocha é o mais utilizado
Desde testes de unidade simples, até testes de
integração usando Selenium, ou ainda testes de
código front-end (utilizando JSDom)
Globalcode – Open4education
Testes (exemplo com Mocha e CoffeeScript)
describe 'The cart', ->
beforeEach -> Cart.get().clear()
it 'delivers a list of carts when get is run without args', ->
carts = Cart.get()
expect(carts.length).to.equal 0
it 'throws when a cart with empty string is requested', ->
expect(-> Cart.get('')).to.throw
it 'delivers the same cart when the store slug is the same', ->
cart = Cart.get('store_1')
otherCart = Cart.get('store_1')
expect(cart).to.equal otherCart
it 'delivers different carts when the store slug isnt the same', ->
cart = Cart.get('store_1')
otherCart = Cart.get('store_2')
expect(cart).not.to.equal otherCart
it 'is empty when cleared', ->
cart = Cart.get('store_1')
expect(cart.items.length).to.equal 0
Globalcode – Open4education
IDE? Editor de texto?
Há IDEs se esforçando (Visual Studio, Idea,
WebStorm)
A maioria usa editores de texto (VIM, Emacs,
Sublime)
O fluxo de trabalho costuma envolver alguns
terminais abertos e um editor de textos
Globalcode – Open4education
Automatizador de tarefas
Coisas que você faz toda hora podem e devem ser
automatizadas
Build, deploy, testes, compilação
As principais ferramentas são o Grunt (mais
conhecido e utilizado) e o Gulp (mais novo e com
visão inovadora)
Globalcode – Open4education
Versionando
Não versione o diretório node_modules
se precisar saber exatamente o que vai rodar utilize o
`npm shrinkwrap`
Não versione pacotes de front-end também (deixe
o trabalho pro Bower)
Se estiver usando um transpiler, não versione o
JavaScript
A não ser que você esteja criando um pacote
Globalcode – Open4education
Node para quem usa Java, C#, Ruby...
Mesmo se você não vai usar Node no servidor
você pode usar Node se estiver em um projeto
com JavaScript (geralmente web)
Compilação de código (CoffeeScript, LESS, etc)
Rodar testes front-end
Otimização requirejs, browserify, webpack, etc
Deploy
Execução de testes
Gestão de pacotes de front-end usando Bower
Globalcode – Open4education
Rodando em produção
Independente de Apache, nginx, IIS ou qualquer
outro servidor web
Mas normalmente atrás de um deles
Você executa o node diretamente
Lembre-se: single threaded
Há gestores de execução para lidar com
Restart
Multiplos núcleos
Falhas
Globalcode – Open4education
Node como ferramenta cross-platform
Node permiter cruzar o gap entre as plataformas
Windows não tem `which`, então:
npm install which --g
Diversas empresas estão considerando usar o
node para fazer seu ferramental de linha de
comando em node para ser multiplataforma
Exemplo: Azure
npm install azure-cli
Globalcode – Open4education
Mitos, verdades,
dúvidas
Globalcode – Open4education
NodeJS não escala
Mito
Globalcode – Open4education
NodeJS não é assim
tão rápido quando
dizem
Depende. Mas em geral é sim. Mas deixa eu explicar.
Globalcode – Open4education
Vi um benchmark e o
nodejs ficou pra trás
Não olhe benchmarks. Já explico porque.
Globalcode – Open4education
Preciso codar em
JavaScript?
Não. Code em CoffeeScript, TypeScript, Clojure...
Globalcode – Open4education
DEMO Express
(Só se deu tempo)
Globalcode – Open4education
Dúvidas?
Globalcode – Open4education
Obrigado!
Giovanni Bassi
giovanni@lambda3.com.br
@giovannibassi

Introdução ao NodeJS

  • 1.
    Globalcode – Open4education ApresentandoNodeJS Giovanni Bassi giovanni@lambda3.com.br @giovannibassi
  • 3.
    Globalcode – Open4education Agenda Oque é NodeJS Modelo assíncrono Instalando Módulos Pacotes Scripting Processo de desenvolvimento, debug, testes Rodando em produção Mitos, verdades e dúvidas
  • 4.
    JavaScript no Servidor Nãoé baseado em threads Eficiente e altamente escalável
  • 5.
  • 6.
    Globalcode – Open4education Oque é NodeJS Ambiente de execução e bibliotecas para rodar JavaScript Independente de qualquer navegador Multiplataforma (Linux, Windows, Mac, etc) Open Source (https://github.com/joyent/node) Single threaded
  • 7.
    Globalcode – Open4education Modeloassíncrono Loop de eventos com uma única thread
  • 8.
  • 9.
    Globalcode – Open4education Oque é NodeJS Servidor Não só http ou https Cliente App desktop: excelente opção multiplataforma Ambiente de desenvolvimento para frontend web
  • 10.
    Globalcode – Open4education História Somente5 anos de vida (criado em 2009) Lead e criador: Ryan Dahl 2010: começa a ganhar mais popularidade 2011 surge NPM suporte nativo a Windows 2012: Novo lead: Isaac Schlueter (npm) 2014 Novo lead: Timothy Fontaine “bug fixing, performance tuning, staying up to date with the V8 engine”
  • 11.
    Globalcode – Open4education Instalando Linux: baixeos binários use nvm (node version manager) ou outro similar use o seu gestor de pacotes favorito (geralmente está desatualizado) Windows: baixe o instalador (ou o binário) use o chocolatey Mac: baixe o instalador ou o binário Todos: baixe e compile
  • 12.
    Globalcode – Open4education Instalando(NVM) Muito útil para manter diferentes versões do Node na mesma máquina Para baixar a última versão estável: nvm install 0.10 Para usar uma versão: nvm use 0.10 Para deixar a versão 0.10 imediatamente disponível: nvm alias default 0.10 Disponível somente em Linux
  • 13.
    Globalcode – Open4education Sistemasde versões Pares: estáveis 0.8, 0.10 Ímpares: instáveis/experimentais 0.9, 0.11 (ex: já com novidades do EcmaScript 6) Obs: Pode mudar no futuro
  • 14.
    Globalcode – Open4education Primeirocontato: REPL Abra uma janela de terminal e digite simplesmente “node”:
  • 15.
    Globalcode – Open4education Nodecomo ferramenta para JavaScript Abra uma janela de terminal e digite simplesmente “coffee”:
  • 16.
    Globalcode – Open4education Módulos(declarando e consumindo) //math.js module.exports = { soma: function (a, b) { return a + b; } } //outro.js var math = require('./math'); math.soma(1, 2); //3
  • 17.
    Globalcode – Open4education Módulosnativos O Node vem com uma série de módulos nativos, a maioria escrito em JavaScript Path, Console, HTTP, Streams, Eventos, OS, etc... API bem documentada em http://nodejs.org/api/
  • 18.
    Globalcode – Open4education Pacotes Gerenciadospelo NPM NPM vem com as instalações padrão do node, mas pode ser atualizado separadamente npm install npm -g http://npmjs.org Quase 90k pacotes 400M de downloads por mês Empacotam módulos Utilizam Semver (http://semver.org) Registry aberto, qualquer um pode registrar pacotes Suporta “pacotes corporativos”
  • 19.
    Globalcode – Open4education Pacotes(dependências) Sempre locais Há pacotes globais, mas nunca são carregados pela sua aplicação, mas usados para criar scripts de execução global coffee, grunt, gulp, mocha, azure Ficam no diretório node_modules da sua aplicação
  • 20.
    Globalcode – Open4education Pacotes(Package.json) Define um módulo Informa: Nome e versão do módulo Versão do node suportada pelo módulo Endereço do repositório Dependências de produção, desenvolvimento Scripts (run, teste, deploy, etc) Etc...
  • 21.
    Globalcode – Open4education Exemplode package.json { "name": "projeto", "version": "0.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1" }, "author": "", "license": "ISC" }
  • 22.
    Globalcode – Open4education Pacotes(dependências) /suaapp /node_modules /dep_a (versão 1.0) /node_modules /dep_z (versão 3.0) /dep_b (versão 1.0) /node_modules /dep_z (versão 4.0) O único sistema de módulos e pacotes que permite versões diferentes de subdependências
  • 23.
    Globalcode – Open4education NPM Iniciarum módulo/projeto (vai criar o package.json) npm init <dir> Instalar todas as dependências do projeto npm install Instalar um módulo npm install <modulo> e gravar isso no package.json --save ou como dependência de desenvolvimento --save-dev Atualizar tudo npm update
  • 24.
  • 25.
    Globalcode – Open4education Scripting Bemmais fácil escrever JavaScript/CoffeeScript do que Bash Inicie com um shebang apontando pro node e diverta-se: #!/usr/bin/env node console.log('hello tdc'); Ou com coffee: #!/usr/bin/env coffee console.log 'hello tdc'
  • 26.
    Globalcode – Open4education Processode desenvolvimento Inicie o servidor com: node <seuarquivo.js> Altere o arquivo Pare e reinicie o servidor Isso pode ficar muito chato, então use o nodemon ou algo parecido npm install nodemon -g
  • 27.
    Globalcode – Open4education Debug Háum debugger nativo, acessível via linha de comando node debug <seuarquivo.js> Complexo de usar, na prática ninguém usa Ao iniciar dessa forma a aplicação para de imediato Mais fácil delegar o acesso a uma ferramenta mais avançada node --debug <seuarquivo.js> Ou --debug-brk Abra o node-inspector Abra o Chrome no endereço indicado e use o F12 que você já conhece
  • 28.
  • 29.
    Globalcode – Open4education Testes Anatureza assíncrona do JavaScript torna os testes mais difíceis de escrever Usa-se callbacks e promisses para resolver o problema Uma série de frameworks existem, atualmente o Mocha é o mais utilizado Desde testes de unidade simples, até testes de integração usando Selenium, ou ainda testes de código front-end (utilizando JSDom)
  • 30.
    Globalcode – Open4education Testes(exemplo com Mocha e CoffeeScript) describe 'The cart', -> beforeEach -> Cart.get().clear() it 'delivers a list of carts when get is run without args', -> carts = Cart.get() expect(carts.length).to.equal 0 it 'throws when a cart with empty string is requested', -> expect(-> Cart.get('')).to.throw it 'delivers the same cart when the store slug is the same', -> cart = Cart.get('store_1') otherCart = Cart.get('store_1') expect(cart).to.equal otherCart it 'delivers different carts when the store slug isnt the same', -> cart = Cart.get('store_1') otherCart = Cart.get('store_2') expect(cart).not.to.equal otherCart it 'is empty when cleared', -> cart = Cart.get('store_1') expect(cart.items.length).to.equal 0
  • 31.
    Globalcode – Open4education IDE?Editor de texto? Há IDEs se esforçando (Visual Studio, Idea, WebStorm) A maioria usa editores de texto (VIM, Emacs, Sublime) O fluxo de trabalho costuma envolver alguns terminais abertos e um editor de textos
  • 32.
    Globalcode – Open4education Automatizadorde tarefas Coisas que você faz toda hora podem e devem ser automatizadas Build, deploy, testes, compilação As principais ferramentas são o Grunt (mais conhecido e utilizado) e o Gulp (mais novo e com visão inovadora)
  • 33.
    Globalcode – Open4education Versionando Nãoversione o diretório node_modules se precisar saber exatamente o que vai rodar utilize o `npm shrinkwrap` Não versione pacotes de front-end também (deixe o trabalho pro Bower) Se estiver usando um transpiler, não versione o JavaScript A não ser que você esteja criando um pacote
  • 34.
    Globalcode – Open4education Nodepara quem usa Java, C#, Ruby... Mesmo se você não vai usar Node no servidor você pode usar Node se estiver em um projeto com JavaScript (geralmente web) Compilação de código (CoffeeScript, LESS, etc) Rodar testes front-end Otimização requirejs, browserify, webpack, etc Deploy Execução de testes Gestão de pacotes de front-end usando Bower
  • 35.
    Globalcode – Open4education Rodandoem produção Independente de Apache, nginx, IIS ou qualquer outro servidor web Mas normalmente atrás de um deles Você executa o node diretamente Lembre-se: single threaded Há gestores de execução para lidar com Restart Multiplos núcleos Falhas
  • 36.
    Globalcode – Open4education Nodecomo ferramenta cross-platform Node permiter cruzar o gap entre as plataformas Windows não tem `which`, então: npm install which --g Diversas empresas estão considerando usar o node para fazer seu ferramental de linha de comando em node para ser multiplataforma Exemplo: Azure npm install azure-cli
  • 37.
  • 38.
  • 39.
    Globalcode – Open4education NodeJSnão é assim tão rápido quando dizem Depende. Mas em geral é sim. Mas deixa eu explicar.
  • 40.
    Globalcode – Open4education Vium benchmark e o nodejs ficou pra trás Não olhe benchmarks. Já explico porque.
  • 41.
    Globalcode – Open4education Precisocodar em JavaScript? Não. Code em CoffeeScript, TypeScript, Clojure...
  • 42.
    Globalcode – Open4education DEMOExpress (Só se deu tempo)
  • 43.
  • 44.
    Globalcode – Open4education Obrigado! GiovanniBassi giovanni@lambda3.com.br @giovannibassi