Flávio Almeida MEAN Stack "to be or not to be mean"

105
@flaviohalme ida flavio.almeida@caelum. com.br FLÁVIO ALMEIDA

Transcript of Flávio Almeida MEAN Stack "to be or not to be mean"

Page 2: Flávio Almeida MEAN Stack "to be or not to be mean"

JavaC#PythonRubyGroovyJavaScript

Page 3: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 4: Flávio Almeida MEAN Stack "to be or not to be mean"

Desenvolvedor Java à procura da menor impedância para construção

de aplicações web

Once upon a time…

Page 5: Flávio Almeida MEAN Stack "to be or not to be mean"

Impedância?

Page 6: Flávio Almeida MEAN Stack "to be or not to be mean"

Impedância

“Discrepância da estrutura dos dados armazenados no banco de dados e as estruturas de dados em memória” - Martin Fowler

Page 7: Flávio Almeida MEAN Stack "to be or not to be mean"

Impedância

ESTRUTURA TABULAR E RELACIONAL, SQL

POJO (PLAIN OLD JAVA OBJECTS)

JSON (JAVASCRIPT OBJECT NOTATION)

Page 8: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 9: Flávio Almeida MEAN Stack "to be or not to be mean"

Isomorphic JavaScript

Back-end e front-end compartilham o mesmo código

Page 10: Flávio Almeida MEAN Stack "to be or not to be mean"

JavaScript é considerada a língua franca da web

Page 11: Flávio Almeida MEAN Stack "to be or not to be mean"

Língua Franca

É aquela que um grupo multilíngue de pessoas intencionalmente adota ou desenvolve para que todos consigam sistematicamente comunicar-se uns com os outros.

Page 12: Flávio Almeida MEAN Stack "to be or not to be mean"

Língua franca ou torre de babel?

ESTRUTURA TABULAR E RELACIONAL, SQL

POJO (PLAIN OLD JAVA OBJECTS)

JSON (JAVASCRIPT OBJECT NOTATION)

Page 13: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 14: Flávio Almeida MEAN Stack "to be or not to be mean"

"Não são as respostas que movem o mundo, são as perguntas” — Albert Einstein

Page 15: Flávio Almeida MEAN Stack "to be or not to be mean"

Testes de unidade

Testes de integração

One commit deploy

Integração contínua(Travis)

Grunt(Automaçã

o)

Bootstrap

Karma(Jasmine)

Protractor

(Selenium)

AngularJS

Page 16: Flávio Almeida MEAN Stack "to be or not to be mean"

To be or not to be MEAN?

Page 17: Flávio Almeida MEAN Stack "to be or not to be mean"

Tradução da palavra mean

Adjetivos

inferior, insignificante, malvado, mediano, pobre, ruim, sórdido, etc.

Page 18: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 19: Flávio Almeida MEAN Stack "to be or not to be mean"

Significado do acrônimo MEAN

MongoDBExpressAngularJSNodejs

Page 20: Flávio Almeida MEAN Stack "to be or not to be mean"

Contexto Histórico

Page 21: Flávio Almeida MEAN Stack "to be or not to be mean"

Contexto Histórico

Page 22: Flávio Almeida MEAN Stack "to be or not to be mean"

Era do AJAX 2005

"Nova abordagem de criação de páginas web" - Jesse James Garret

Page 23: Flávio Almeida MEAN Stack "to be or not to be mean"

Era do SPA 2005

SINGLE PAGE APPLICATION

"Elementos de interface e lógica da aplicação são criados e executados no cliente" —Steve Yen

Page 24: Flávio Almeida MEAN Stack "to be or not to be mean"

Era do Extreme Go Horse2005

Page 25: Flávio Almeida MEAN Stack "to be or not to be mean"

2010 Backbone Angular

Era dos Frameworks2009

2011 Batman2012 Ember

Page 26: Flávio Almeida MEAN Stack "to be or not to be mean"

a) Popularidade meteóricab) Pioneiro na injeção de dependênciasc) Solução própria para criação de módulosd) Sistema próprio de rotase) Two-way data bindingf) Ferramentas para testes

Page 27: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 28: Flávio Almeida MEAN Stack "to be or not to be mean"

Era "The Book is on the Table" 2013…

Page 29: Flávio Almeida MEAN Stack "to be or not to be mean"

Progressive Enhancement

X SPA

Page 30: Flávio Almeida MEAN Stack "to be or not to be mean"

"Pensamos no que deveria ser e fechamos os olhos para o que é" - Michel Maffesoli

Page 31: Flávio Almeida MEAN Stack "to be or not to be mean"

SPA's chegaram para ficar, quer você queira ou não

Hoje é a “palavra de ordem“ em aplicações híbridas

Page 32: Flávio Almeida MEAN Stack "to be or not to be mean"

Paralelamente…

Page 33: Flávio Almeida MEAN Stack "to be or not to be mean"

2009

Bancos que não se baseiam em esquemas (Eric Evans)

N SQL

Page 34: Flávio Almeida MEAN Stack "to be or not to be mean"

2009

Banco NoSQL baseado em documento BSON, MUITO semelhante ao JSON, porém com mais tipos

Page 35: Flávio Almeida MEAN Stack "to be or not to be mean"

2009

Boa parte da responsabilidade das regras de validação fica nas mãos dos desenvolvedores.

Page 36: Flávio Almeida MEAN Stack "to be or not to be mean"

2009

Page 37: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 38: Flávio Almeida MEAN Stack "to be or not to be mean"

Quero aplicações Web!!!

Page 39: Flávio Almeida MEAN Stack "to be or not to be mean"

2010

Page 40: Flávio Almeida MEAN Stack "to be or not to be mean"

2011

Page 41: Flávio Almeida MEAN Stack "to be or not to be mean"

var mongoose = require('mongoose');

var schema = mongoose.Schema({ nome: { type: String, required: true }, email: { type: String, required: true, index: { unique: true } } }); return mongoose.model('Contato', schema);

2011

Page 42: Flávio Almeida MEAN Stack "to be or not to be mean"

2012

VALERI KARPOV

Cunhou o acrônimo MEAN para denotar as tecnologias utilizadas durante uma

competição de hackathron que venceu.

Page 43: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 44: Flávio Almeida MEAN Stack "to be or not to be mean"

MEAN

Page 45: Flávio Almeida MEAN Stack "to be or not to be mean"

2012

VALERI KARPOV

Ascot Project

Bookalokal

Page 46: Flávio Almeida MEAN Stack "to be or not to be mean"

Vantagens constatadas durante o Hackathon

SPA desde o início

Menor impedância

API REST

Isomorphic JavaScript*

* não era para você conseguir ler isso!

Page 47: Flávio Almeida MEAN Stack "to be or not to be mean"

SPA desde o início

ngRoute (default)

ui-router(extensão)

Page 48: Flávio Almeida MEAN Stack "to be or not to be mean"

SPA desde o início

<!— index.html —><html ng-app="minhaApp"> <head> (…) </head> <body> <ng-view> </ng-view> </body></html>

<!-- partials/cadastro.html --><h1>Cadastro de fotos</h1><form> (...)</form>

<!-- partials/listagem.html --><h1>Listagem de fotos</h1>

index.html/#/fotos

index.html/#/fotos/new

Page 49: Flávio Almeida MEAN Stack "to be or not to be mean"

SPA desde o inícioangular.module('minhaApp', ['ngRoute']) .config(function($routeProvider) {

$routeProvider.when('/fotos', { templateUrl: 'partials/listagem.html', controller: 'FotosController' });

$routeProvider.when('/fotos/new', { templateUrl: 'partials/cadastro.html', controller: 'FotoController' }); });

Page 50: Flávio Almeida MEAN Stack "to be or not to be mean"

Menor impedância

ESTRUTURA TABULAR E RELACIONAL

Autor autor = new Autor();autor.setNome(…);

{ "_id": "1" "nome": "Flávio Almeida"}

OUTROS

Navegador(JSON)

Banco(SQL)

Servidor(Object)

Page 51: Flávio Almeida MEAN Stack "to be or not to be mean"

Menor impedância

{ "_id": ObjectId("5303e0649fd139619aeb783e") "nome": "Flávio Almeida"}

{ "_id": "5303e0649fd139619aeb783e" "nome": "Flávio Almeida"}

{ "_id": "5303e0649fd139619aeb783e" "nome": "Flávio Almeida"}

MEAN STACK

Navegador(JSON)

Banco(BSON)

Servidor(JSON)

Page 52: Flávio Almeida MEAN Stack "to be or not to be mean"

Menor impedância

$http('/v1/fotos').then(function(fotos){ $scope.fotos = fotos;});

app.get('v1/fotos', function(req, res){ db.collection('contatos').find({}, function(erro, contatos){ if(erro) throw err; res.json(contatos); } });};

Client(Angular

)

Server (API REST)(Express/MongoDB driver)

<img ng-repeat="foto in fotos"

ng-src=“{foto.src}">

Page 53: Flávio Almeida MEAN Stack "to be or not to be mean"

Performance

Escalabilidade

Estado no cliente, servidor stateless

Single thread e non-blocking I/O

Page 54: Flávio Almeida MEAN Stack "to be or not to be mean"

non-blocking I/O

Tudo roda em paralelo, exceto seu código!

Page 55: Flávio Almeida MEAN Stack "to be or not to be mean"

Blocking Vs non-blocking I/O

db.collection('contatos').find({}, function(erro, contatos) { console.log(contatos); });console.log('FIM');

var contatos = db.collection('contatos').find({});console.log(contatos);console.log('FIM');

Pseudo Blocking I/O

Non-blocking I/O

Page 56: Flávio Almeida MEAN Stack "to be or not to be mean"

Mas na prática, é tudo essa maravilha?

Page 57: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 58: Flávio Almeida MEAN Stack "to be or not to be mean"

Não há um Scaffold consolidado

mean.ioVS

mean.js

Page 59: Flávio Almeida MEAN Stack "to be or not to be mean"

Você já implementou um DAO, não importa a linguagem?

Page 60: Flávio Almeida MEAN Stack "to be or not to be mean"

DAO patterndao.porNome = function(nomeProcurado, cb) { db.collection('contatos') .findOne({nome : procurado}, function(erro, contato) { if (erro) cb('Não foi possível…', null); cb(null, contato); });};dao.dependenteDoContato = function(contato, cb) { db.collection('dependentes') .find({contatoId : contato_id}, function(erro, dependente) { if (erro) cb('Não foi possível…', null); cb(null, dependente) ; });};dao.adicionaBeneficio = function(dependente, cb) { db.collection('beneficios') .insert(dependente, function(erro) { if (erro) cb('Não foi possível…’, null); cb(null, true); });};

Page 61: Flávio Almeida MEAN Stack "to be or not to be mean"

Callback HELL

dao.porNome('Flávio Almeida', function(erro, contato) { if(erro) throw console.log(erro); dao.dependenteDoContato(contato, function(erro, dependente) { if(erro) throw console.log(erro); dao.adicionaBeneficio(dependente, function(erro, adicionado){ if(erro) throw console.log(erro); if (adicionado) console.log('Benefício adicionado'); }); });});

Page 62: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 63: Flávio Almeida MEAN Stack "to be or not to be mean"

Callback HELL

dao.porNome('Flávio Almeida', function(erro, contato) { if(erro) throw console.log(erro); dao.dependenteDoContato(contato, function(erro, dependente) { if(erro) throw console.log(erro); dao.adicionaBeneficio(dependente, function(erro, adicionado){ if(erro) throw console.log(erro); if (adicionado) console.log('Benefício adicionado'); }); });});

Page 64: Flávio Almeida MEAN Stack "to be or not to be mean"

Synchronous Heaven

try { var contato = dao.porNome('Flávio Almeida'); var dependente = dao.depententeDoContato(contato); console.log(dao.adicionaBeneficio(dependente));} catch(erro) { console.log(erro);}

Page 65: Flávio Almeida MEAN Stack "to be or not to be mean"

Callback HELL

No cliente (browser) acontece a mesma coisa!

Page 66: Flávio Almeida MEAN Stack "to be or not to be mean"

Mas tem cura doutor?

Page 67: Flávio Almeida MEAN Stack "to be or not to be mean"

Só se você fizer uma promessa!

Page 68: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 69: Flávio Almeida MEAN Stack "to be or not to be mean"

Callback HELL

dao.porNome('Flávio Almeida', function(erro, contato) { if(erro) throw console.log(erro); dao.dependenteDoContato(contato, function(erro, dependente) { if(erro) throw console.log(erro); dao.adicionaBeneficio(dependente, function(erro, adicionado){ if(erro) throw console.log(erro); if (adicionado) console.log('Benefício adicionado'); }); });});

Page 70: Flávio Almeida MEAN Stack "to be or not to be mean"

Promise Pattern

dao.porNome('Flávio Almeida').then(dao.depententeDoContato).then(dao.adicionaBeneficio).then(function(adicionado) { if (adicionado) console.log('Benefício adicionado’);}).catch(function(erro) { console.log(erro); });

Page 71: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 72: Flávio Almeida MEAN Stack "to be or not to be mean"

DAO pattern

dao.porNome = function(nomeProcurado, cb) { db.collection('contatos') .findOne({nome : procurado}, function(erro, contato) { if (erro) cb('Não foi possível…', null); cb(null, contato); });};dao.dependenteDoContato = function(contato, cb) { db.collection('dependentes') .find({contatoId : contato_id}, function(erro, dependente) { if (erro) cb('Não foi possível…’, null); cb(null, dependente) ; });};(…)

Page 73: Flávio Almeida MEAN Stack "to be or not to be mean"

DAO + Promise Pattern

dao.porNome = function(nomeProcurado) { return Q.Promise(function(resolve, reject) { db.collection('contatos') .findOne({nome : procurado}, function(erro, contato) { if (erro) reject(erro); resolve(contato); }); });};dao.dependenteDoContato = function(contato) { return Q.Promise(function(resolve, reject) { db.collection('dependentes') .find({contatoId : contato_id}, function(erro, dependente) { if (erro) reject(erro); resolve(dependente) ; }); }); };(...)

Page 74: Flávio Almeida MEAN Stack "to be or not to be mean"

Promise Pattern

dao.porNome('Flávio Almeida').then(dao.depententeDoContato).then(dao.adicionaBeneficio).then(function(adicionado) { if (adicionado) console.log('Benefício adicionado');}).catch(function(erro) { console.log(erro); });

Page 75: Flávio Almeida MEAN Stack "to be or not to be mean"

Synchronous Heaven

try { var contato = dao.porNome('Flávio Almeida'); var dependente = dao.depententeDoContato(contato); console.log(dao.adicionaBeneficio(dependente));} catch(erro) { console.log(erro);}

Mas eu ainda quero o paraíso!

Page 76: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 77: Flávio Almeida MEAN Stack "to be or not to be mean"

Promise Pattern

dao.porNome('Flávio Almeida').then(dao.depententeDoContato).then(dao.adicionaBeneficio).then(function(adicionado) { if (adicionado) console.log('Benefício adicionado’);}).catch(function(erro) { console.log(erro); });

Page 78: Flávio Almeida MEAN Stack "to be or not to be mean"

Q.async(function*() {try { var contato = yield dao.porNome('Flávio Almeida'); var dependente = yield dao.depententeDoContato(contato); console.log(yield dao.adicionaBeneficio(dependente));} catch(erro) { console.log(erro);}}).done();

É quase um paraíso

Page 79: Flávio Almeida MEAN Stack "to be or not to be mean"

Synchronous Heaven

try { var contato = dao.porNome('Flávio Almeida'); var dependente = dao.depententeDoContato(contato); console.log(dao.adicionaBeneficio(dependente));} catch(erro) { console.log(erro);}

Page 80: Flávio Almeida MEAN Stack "to be or not to be mean"

Permite suspender a execução no meio de uma função para mais tarde retomá-la

Generator

Page 81: Flávio Almeida MEAN Stack "to be or not to be mean"

Generatorfunction * meuGerador() { var num1 = 1; var num2 = 2; var num3 = 3; yield num1; yield num2; yield num3;}

var gerador = meuGerador();console.log(gerador.next().value); // 1console.log(gerador.next().value) // 2console.log(gerador.next().value) // 3console.log(gerador.next().value) // undefined

Page 82: Flávio Almeida MEAN Stack "to be or not to be mean"

Generators e Promises

Q.async(function*() {try { var contato = yield dao.porNome('Flávio Almeida'); var dependente = yield dao.depententeDoContato(contato); console.log(yield dao.adicionaBeneficio(dependente));} catch(erro) { console.log(erro);}}).done();

Page 83: Flávio Almeida MEAN Stack "to be or not to be mean"

Synchronous Heaven

try { var contato = dao.porNome('Flávio Almeida'); var dependente = dao.depententeDoContato(contato); console.log(dao.adicionaBeneficio(dependente));} catch(erro) { console.log(erro);}

Mas eu ainda quero o paraíso!

Page 84: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 85: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 86: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 87: Flávio Almeida MEAN Stack "to be or not to be mean"

Synchronous Heaven

try { var contato = dao.porNome('Flávio Almeida'); var dependente = dao.depententeDoContato(contato); console.log(dao.adicionaBeneficio(dependente));} catch(erro) { console.log(erro);}

Page 88: Flávio Almeida MEAN Stack "to be or not to be mean"

try { var contato = yield dao.porNome('Flávio Almeida'); var dependente = yield dao.depententeDoContato(contato); console.log(yield dao.adicionaBeneficio(dependente));} catch(erro) { console.log(erro);}

Generators e Promises

Page 89: Flávio Almeida MEAN Stack "to be or not to be mean"

E as ferramentas de BI do cliente?

Page 90: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 91: Flávio Almeida MEAN Stack "to be or not to be mean"
Page 92: Flávio Almeida MEAN Stack "to be or not to be mean"

Injection Free!

Page 93: Flávio Almeida MEAN Stack "to be or not to be mean"

Injection Free

// Controller ExpressJS

controller.removeContato = function(req, res) { var _id = req.params.id; Contato.remove({'_id' : _id}).exec() .then(function() { res.status(204).end(); }, function(err) { return console.error(erro); } );};

{"_id" : 5}

Page 94: Flávio Almeida MEAN Stack "to be or not to be mean"

{"_id" : { "$ne" : null}}

Injection Free???

// Controller ExpressJS

controller.removeContato = function(req, res) { var _id = req.params.id; Contato.remove({'_id' : _id}).exec() .then(function() { res.status(204).end(); }, function(err) { return console.error(erro); } );};

Page 95: Flávio Almeida MEAN Stack "to be or not to be mean"

{"_id" : { "$ne" : null}}

Agora, Injection Free

// Controller ExpressJS

var sanitize = require(‘mongo-sanitize');

controller.removeContato = function(req, res) { var _id = sanitize(req.params.id); Contato.remove({'_id' : _id}).exec() .then(function() { res.status(204).end(); }, function(err) { return console.error(erro); } );};

Page 96: Flávio Almeida MEAN Stack "to be or not to be mean"

Carlinhos Aguiar, document replace é uma …

Page 97: Flávio Almeida MEAN Stack "to be or not to be mean"

PÉSSIMA IDEIA, SÍLVIO!

Page 98: Flávio Almeida MEAN Stack "to be or not to be mean"

Document Replace

controller.salvaContato = function(req, res) { var _id = req.body._id; Contato.findByIdAndUpdate(_id, req.body).exec() .then( // código omitido );

Page 99: Flávio Almeida MEAN Stack "to be or not to be mean"

Document Replace

controller.salvaContato = function(req, res) { var _id = req.body._id; var dados = { "nome" : req.body.nome, "email" : req.body.email }; Contato.findByIdAndUpdate(_id, dados).exec()

Pince os dados…

Page 100: Flávio Almeida MEAN Stack "to be or not to be mean"

Sistema de Módulos

AMD CommonJSES6

http://addyosmani.com/writing-modular-js/

Page 101: Flávio Almeida MEAN Stack "to be or not to be mean"

Sistema de Módulos

AMD CommonJSES6

http://addyosmani.com/writing-modular-js/

Page 102: Flávio Almeida MEAN Stack "to be or not to be mean"

A luta deixa deixa de ser pela menor "impedância "e passa a ser por uma

standardization dentro do ecossistema JavaScript.

Page 103: Flávio Almeida MEAN Stack "to be or not to be mean"

MANK

Alternativas à MEAN Stack

MRKN

MyEAN

METEOR

Page 104: Flávio Almeida MEAN Stack "to be or not to be mean"

Obrigado!

Page 105: Flávio Almeida MEAN Stack "to be or not to be mean"

@flaviohalmeida

[email protected]

FLÁVIO ALMEIDA

Perguntas?