NODE.JS: DO GUGUDADÁ AO "TÁ RODANDO PAI!"

dev de APIs na PRODEB;
apaixonado por comunidades;

RESTafarian;
blogueiro;
palestrante;
organizador de eventos;
minion;

WHOAMI...

@mmalaquiasdev

POR QUE VOCÊ QUER APRENDER SOBRE NODE.JS?

EU NÃO GOSTO DE JS PORQUE...

=> NÃO TEM UMA ESTRUTURA DEFINIDA;

=> JQuery == GAMBIARRAS;

=> PROTOTYPICAL? EM 2017?!;

=> ESCREVER TUDO NA MÃO;

=> COMPLEXO DEMAIS PRA DEBUGAR;

=> VARIÁVEIS GLOBAIS;

JS HOJE EM DIA É...

=> A LINGUAGEM DA WEB;

=> CROSS-PLATAFORM;

=> PODEROSA!;

=> POSSUI UM ECOSSISTEMA ENORME;

=> UMA DAS PLATAFORMAS QUE MAIS CRESCE NO MERCADO;

ENTÃO VAMOS FALAR UM POUCO SOBRE JAVASCRIPT

se prepara

JS COMO TODA LINGUAGEM MODERNA

É MULTI PARADIGMA

PROCEDURAL;

ORIENTADA A OBJETOS;

CADA VEZ MAIS FUNCIONAL;

VARIÁVEIS

PRIMITIVAS:

   - string, number, boolean, null

OBJETOS:
   - Date, array, function...

VAR, LET OU CONST ?

JS É FRACAMENTE TIPADO 

let name = 'Mateus Malaquias'
console.log(name)

// Mateus Malaquias

name = name + ' ' + 651818272832832
console.log(name)

//  Mateus Malaquias 651818272832832

JS É FRACAMENTE TIPADO 

let doisComDoisQuatro = '2'
console.log(doisComDoisQuatro)

// 2                  

doisComDoisQuatro += 2
console.log(doisComDoisQuatro)

//  4

JS É FRACAMENTE TIPADO 

let novaData = new Date('dasdasad 1')
console.log(novaData)

// Mon Jan 01 2001 00:00:00 GMT-0200     

JS, AMIGA SUA LOKA

const valores = new Array(7).join('valor' + 1)
console.log(valores )

// valor1valor1valor1valor1valor1valor1

JS, AMIGA SUA LOKA

const valores =

new Array(8).join('valor' - 1) + ' Batman!'​console.log(valores )

//NaNNaNNaNNaNNaNNaN Batman!

NULL VS UNDEFINED

null É O ESTADO DE UMA
VARIÁVEL SEM VALOR

undefined É A AUSÊNCIA
DE UM VALOR

AQUI TUDO

É OBJETO,

DÚVIDA?

só vou apostando

ISSO É UM OBJETO

let usuario = {
     nome = 'Mateus',
     email = 'mateusmalaquiasdev@outlook.com',
     token = 7JSA1232ndsa231ds

}                                                                                                              

console.log(usuario.nome)

// Mateus                  

JS É DINÂMICO

usuario.sobrenome = 'Malaquias'        

console.log(usuario.sobrenome)

// Malaquias                 

ISSO TAMBÉM

É UM OBJETO

const usuario = new Usuario('Mateus', 26, 'M')

console.log(usuario.name)

// Mateus

FUNÇÕES

function

se acostume com elas

FUNÇÕES

function isNumeroPar (numero) {
 
return (numero % 2) === 0 ? true : false
}

FUNÇÕES ANÔNIMAS

let numero = 8

console.log(
(numero) => {                              
  return (numero % 2) === 0 ? true : false

})                                                     

MAIS FUNÇÕES

const isNumeroPar = (numero) => {
   return (numero % 2) === 0 ? true : false
}

PROMISES

return new Promise((resolve, reject) => {
    twit.get('search/tweets', queryString, (err, data) => {
      if (err) {
        reject(err)
        return
      }

      resolve(data)
    })

 })

PROMISES

NÃO DEIXEM DE OLHAR

ENFIM,

VAMOS FALAR

DE NODE?

MAS O QUE

É O NODE?

NODE É...

=> NODE É UMA PLATAFORMA;

=> V8 COMO INTERPRETADOR;

=> LIBEV, PARA OS AMIGOS EVENT LOOP;

=> LIBEIO, GARANTIDO ASSÍNCRONO E/S;

=> LIBUV = LIBEV + LIBEIO + ...;

QUEM ESTÁ APOIANDO?

const empresas = [                          
  'paypal', 'uber', 'netflix', 'mozilla', 'IBM', 'linkedin', 'groupon', 'godaddy', 'ebay', 'microsoft', 'redhat', 'walmart', 'joyent',
'intel', 'nodesource', 'npm', 'google', 'yahoo'
]                                                        

NÃO CAIA NA ARMADILHA DE USAR ALGO SÓ POR QUE ESTA TODO MUNDO USANDO

NODE É

SINGLE THREAD

PARE DE CHORORÓ, VAMOS ENTENDER O BÁSICO

ARQUITETURA,

NÃO BLOCK E/S,

EVENT LOOP

REQ

RES

REQUISIÇÃO BLOQUEANTE

REQ

RES

REQUISIÇÃO NÃO BLOQUEANTE

ISSO É

REALMENTE

RÁPIDO?

PQ JS NO SERVIDOR?

=> EFICIENTE E PRODUTIVO;

=> REUTILIZAÇÃO DE CÓDIGO ENTRE BACK E FRONT;

=> VELOCIDADE, ESCALABILIDADE E PERFORMANCE;

=> ECOSISTEMA RICO EM OPEN SOURCE;

=> SUPORTE CORPORATIVO ESTA MELHORANDO;

=> EXCELENTE PARA APIS, MICROSERVIÇOS, SERVELESS, IOT, AUTOMAÇÃO DE TAREFAS;

PQ JS NO SERVIDOR?

E PQ NÃO?

=> MUITOS PROBLEMAS ACONTECEM POR FALTA DE DESIGN;

=> PERFORMANCE PODE SER FACILMENTE COMPROMETIDA;

=> FALTA DE MATURIDADE (ISSO TEM MELHORADO);

=> A MAIORIA DOS PROFISSIONAIS SÃO FULL STACK (SABEM DE TUDO, MESTRES DE NADA);

=> CALLBACK HELL;

=> EM GRANDES PROJETOS COM UMA ESTRUTURA MUITO ACOPLADA VAI SER DIFÍCIL ACOMPANHAR O FLUXO DOS EVENTOS;

E A PROPÓSITO NÃO USE O NODE EM CENÁRIOS DE USO INTENSO DE CPU

NODE É JS,

MAS NÃO É 100%

IGUAL AO DO NAVEGADOR

CONTEXTO

É O SEGUINTE

NO NODE TEMOS GLOBAL

NO NAVEGADOR TEMOS WINDOW

LOGO...

GLOBAL.PROCESS === PROCESS

GLOBAL.PROCESS.ENV

GLOBAL.PROCESS.ARG

INFORMAÇÕES

DO PROJETO

FICAM NO
PACKAGE.JSON

{
  "name": "nodebotsdayssa-twitter-bot",
  "version": "0.0.1",
  "main": "index.js",
  "scripts": {
      ...
  },
  "author": "Mateus Malaquias",
  "dependencies": {
      ...
   }

PACKAGE.JSON

$ npm set init.author.name "Mateus Malaquias"
$ npm set init.author.email "mateusmalaquiasdev...com"
$ npm set init.author.url "https://medium.com/collabcode"

CONFIG BÁSICAS

$ npm init

INICIANDO UM PROJETO

$ npm install express --save

INSTALANDO PACOTES

$ npm install nodemon --save-dev

$ npm i pm2 -g

  "dependencies": {
      "express": "^4.15.4"
   },
  "devDependencies": {
    "nodemon": "^1.11.0",
  }

PACKAGE.JSON

$ npm unistall express --save

REMOVENDO

PACOTES

$ npm remove nodemon --save-dev

$ npm r pm2 -g

USANDO UM MODÚLO

const express = require('restify')

const server = restify.createServer()

server.listen(8080, function() {
  console.log('Servidor rodando!! ')
})

MÓDULOS EVERYWHERE

const express = require('restify')

const fs = require('fs')

const server = require('./src')

const config = require('./src/config.js')

TODO ARQUIVO

.JS É UM MODULO DENTRO DO NODE

SEU PRIMEIRO MÓDULO

// batman.js

const fraseEfeito =
    new Array(5).join('valor' - 1) + ' Batman!'
 

module.exports = fraseEfeito

// index.js

const fraseEfeito = require('./batman.js')

console.log(fraseEfeito)

// NaNNaNNaNNaN Batman!

EXISTEM MUITAS FORMAS DE SE TRABALHAR COM MÓDULOS

=> OBJETO SIMPLES;
=> MODULOS FUNCIONAIS;
=> FACTORY PATTERN;

// wayne.js

let wayne = () => {
  this.fortuna = 1000
  return this
}

module.exports = wayne()

OBJETO SIMPLES

// index.js

let bruce = require('./wayne')
bruce .fortuna -= 1000

console.log(bruce .fortuna)

OBJETO SIMPLES

// 0

CUIDADO TODO MÓDULO NO

NODE É GUARDADO EM CACHE

// index.js

OBJETO SIMPLES

let bruce = require('./wayne')
bruce.fortuna -= 1000

console.log(bruce.fortuna)

// 0

let damian = require('./wayne')

console.log(damian.fortuna)

// 0

// random_number.js

MÓDULOS FUNCIONAIS

const randomNumber = (length) => {  

return Math.floor(Math.random() * length)
}

module.exports = randomNumber

MÓDULOS FUNCIONAIS

// index.js

const { randomNumber } = require('../../libs')
 

const getRetweetId = (data) => {
  const indexNumber = randomNumber(data.length)
  return data[indexNumber].id_str
}


console.log(getRetweetId(data))

FACTORY PATTERN

NÃO DEIXEM DE OLHAR

VAMOS FALAR DE FRAMEWORKS E TALS

MELHORES OPÇÕES

ALGUNS CUIDADOS INICIAIS QUE TALVEZ VOCÊ QUERIA TER AO COLOCAR UMA API

EM PRODUÇÃO

MODELE SUA API SEGUINDO AS DEFINIÇÕES REST

ESCREVA UMA DOCUMENTAÇÃO

PARA SUA API

// index.js

const compression = require('compression')
const express = require('express')

const app = express()

app.use(compression())

GZIP

FAÇA CACHE DE

SUAS RESPOSTAS

NÃO USEM

FUNÇÕES SÍNCRONAS!

OU MELHOR FUNÇÕES SÍNCRONAS SOMENTE NO MOMENTO DE

INICIALIZAÇÃO

PM2

npm install pm2 -g

pm2 start app.js

pm2 monit

pm2 logs

pm2 start app.js -i 0

TESTES AUTOMATIZADOS

USEM VARIÁVEIS

DE AMBIENTE

POR ONDE
VOCÊ PODE COMEÇAR?

OBRIGADO POR
NÃO DORMIR \O/

@mmalaquiasdev

NODE.JS: DO GUGUDADÁ AO TÁ RODANDO PAI

By Mateus Malaquias

NODE.JS: DO GUGUDADÁ AO TÁ RODANDO PAI

  • 517