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