Aplicações de tempo real com Meteor.js

33
Rafael Sales

description

Uma visão geral sobre Meteor.js - Ceará JavaScript (CEJS) 9/Nov/2013

Transcript of Aplicações de tempo real com Meteor.js

Page 1: Aplicações de tempo real com Meteor.js

Rafael Sales

Page 2: Aplicações de tempo real com Meteor.js

Real-Time AppsWith Meteor

Page 3: Aplicações de tempo real com Meteor.js

DBDBCPU

WEBPresentation

HTTP

Page 4: Aplicações de tempo real com Meteor.js

DBDBCPU

WEBPresentation

HTTP

DBDB CPUCloud

Data

?CPU

Page 5: Aplicações de tempo real com Meteor.js

DBDBCPU

WEBPresentation

HTTP

DBDB CPUCloud

Data

?CPU

DBDB CPU

Client/Server

Data

RPC, NFS...

CPU

Page 6: Aplicações de tempo real com Meteor.js

Como seria esse protocolo?

• APIs são assinaturas de conjuntos de dados

• Cache local dos dados no cliente

• Chamada de métodos ao servidor (RPC)

• Cliente pode simular métodos do servidormodificando seu cache local de dados

Page 7: Aplicações de tempo real com Meteor.js

Meteor é uma plataforma open-source para criar aplicações web modernas

Page 8: Aplicações de tempo real com Meteor.js

Real-time

Reactive programming

JavaScript

Page 9: Aplicações de tempo real com Meteor.js

Real-time

Reactive programming

JavaScript

Page 10: Aplicações de tempo real com Meteor.js

Inclusive a API do Banco de Dados

Mesma API disponível no cliente e servidor

Cliente e servidor escritos em JavaScript

Só JavaScript

Page 11: Aplicações de tempo real com Meteor.js

Inclusive a API do Banco de Dados

Mesma API disponível no cliente e servidor

Cliente e servidor escritos em JavaScript

Só JavaScript

// código compartilhadoif (Meteor.isServer) { // código do servidor}if (Meteor.isClient) { // código do cliente}

// código compartilhadoif (Meteor.isServer) { // código do servidor}if (Meteor.isClient) { // código do cliente}

Page 12: Aplicações de tempo real com Meteor.js

API do Banco de Dados no cliente?

Page 13: Aplicações de tempo real com Meteor.js

API do Banco de Dados no cliente?

Messages = new Meteor.Collection("messages"); Messages.insert({ text: "Hello world!" }); Messages.find();

Messages = new Meteor.Collection("messages"); Messages.insert({ text: "Hello world!" }); Messages.find();

Page 14: Aplicações de tempo real com Meteor.js

O cliente faz assinatura de um conjunto dedados que deseja manter-se atualizado

Sincronizaçãode dados

O servidor irá manter tais conjuntosatualizados nos clientes

Page 15: Aplicações de tempo real com Meteor.js

Sem mais...

function getLastMessages() { $.get('/last-messages', callback);}

Page 16: Aplicações de tempo real com Meteor.js

E como faz?

/server/chat.jsMeteor.publish("messages-to-me", function () { return Messages.find({ to: myId });});

/client/chat.jsMeteor.subscribe("messages-to-me");

Page 17: Aplicações de tempo real com Meteor.js

automaticamente atualizadosquando o BD é alterado

Partes atualizáveis são escritas com templates

Atualização da página em tempo real

Page 18: Aplicações de tempo real com Meteor.js

Sem mais...

$.get('/messages', function(responseBody) { $('#messages').html(responseBody);});

JavaScript haters

Page 19: Aplicações de tempo real com Meteor.js

Sem mais...$.get('/messages', function(messages) { var list = $('ul'); list.empty();

$.each(messages, function(index, msg) { var newItem = $('<li/>', { text: msg.text }); list.append(newItem); });});

JavaScript Lovers

Page 20: Aplicações de tempo real com Meteor.js

E como faz?/client/index.html

<template name="container"> <ul> {{#each messages}} <li> {{text}} </li> {{/each}} </ul></template>

/client/chat.jsTemplate.container.messages = function() {  return Messages.find();};

Page 21: Aplicações de tempo real com Meteor.js

Alterações de dados efetuadas no cliente refletema UI ao mesmo tempo que são enviadas ao servidor

Compensaçãode latência

Cópia dos dados dos clientes e o UI são corrigidoscaso o servidor rejeite as alterações

Page 22: Aplicações de tempo real com Meteor.js

Sem mais...

$.post('/messages/create', parameters, function(newMsg) { var li = $('<li/>', { text: newMsg.text }); $('ul').append(li);});

Page 23: Aplicações de tempo real com Meteor.js

=> alteração no código => build do JS => envia para cliente e atualiza

Hot Code Pushes

Page 24: Aplicações de tempo real com Meteor.js

Aplicação e suas dependências empacotadas

Pacote da aplicaçãoindependente

Executa em ambientes que suportam node.js

Page 25: Aplicações de tempo real com Meteor.js

DDP - Distributed Data Protocol

Interoperabilidade

Page 26: Aplicações de tempo real com Meteor.js

Injetam código no cliente e/ou servidor

Smart Packages

É possível substituir pacotes padrão,como o de templating (Handlebars.js)

Meteorite: package manager for Atmosphere

Page 27: Aplicações de tempo real com Meteor.js

Exemplo: Leaderboard

Page 28: Aplicações de tempo real com Meteor.js

<template name="leaderboard">  <div class="leaderboard">    {{#each players}}      {{> player}}    {{/each}}  </div>

  {{#if selected_name}}   <div class="details">     <div class="name">{{selected_name}}</div>     <input type="button" class="inc” value="Give 5 points" />   </div>  {{else}}   <div class="none">Click a player to select</div>  {{/if}}</template>

HTML

Page 29: Aplicações de tempo real com Meteor.js

<template name="leaderboard">  <div class="leaderboard">    {{#each players}}      {{> player}}    {{/each}}  </div>

  {{#if selected_name}}   <div class="details">     <div class="name">{{selected_name}}</div>     <input type="button" class="inc” value="Give 5 points" />   </div>  {{else}}   <div class="none">Click a player to select</div>  {{/if}}</template>

HTML

<template name="player">  <div class="player {{selected}}">    <span class="name">{{name}}</span>    <span class="score">{{score}}</span>  </div></template>

<template name="player">  <div class="player {{selected}}">    <span class="name">{{name}}</span>    <span class="score">{{score}}</span>  </div></template>

Page 30: Aplicações de tempo real com Meteor.js

JSPlayers = new Meteor.Collection(“players");

if (Meteor.isServer) {  Meteor.startup(function () {    if (Players.find().count() === 0) {      var names = ["Ada Lovelace",                   "Grace Hopper",                   "Marie Curie",                   "Carl Friedrich Gauss",                   "Nikola Tesla",                   "Claude Shannon"];

      for (var i = 0; i < names.length; i++)        Players.insert({ name: names[i], score: Random.floor(Random.fraction()*10)*5 }); }  });}

Page 31: Aplicações de tempo real com Meteor.js

JSPlayers = new Meteor.Collection(“players");

if (Meteor.isClient) {  Template.leaderboard.players = function() {    return Players.find({}, { sort: { score: -1, name: 1 }});  };

  Template.leaderboard.selected_name = function() {    player = Players.findOne(Session.get("selected_player"));    return player && player.name;  }; Template.leaderboard.events({    'click input.inc': function() {      Players.update(Session.get("selected_player"),

{ $inc: { score: 5 }});    }  });  Template.player.events({    'click': function() {      Session.set("selected_player", this._id);    }  });}

Page 32: Aplicações de tempo real com Meteor.js

meteor.com

github.com/meteor/meteor

Page 33: Aplicações de tempo real com Meteor.js

Obrigado!

github.com/rafaelsales

[email protected]