jurassic javascript park - rodando offline até na ilha nublar!

76
Jurassic JavaScript Park Rodando oine até na Ilha Nublar!

Upload: bankfacil

Post on 11-Apr-2017

331 views

Category:

Technology


11 download

TRANSCRIPT

Page 1: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

Jurassic JavaScript ParkRodando offline até na Ilha Nublar!

Page 2: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

@eduardojmatos eduardomatos.me

OI, EU SOU O EDU

Page 3: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

Seu empréstimo certo. Com garantia. Online.

Page 4: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

PORQUE AINDA FALAMOS SOBRE

OFFLINE EM 2016?

Page 5: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 6: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

http://ispspeedindex.netflix.com/country/brazil/

Page 7: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

MÉDIA DE CONEXÃO MÓVEL

2,5MB

20,4MB

8,8MB

http://www.reclameaqui.com.br/noticias/noticias/com-media-de-velocidade-abaixo-da-mundial-internet-brasileir_1585/

Page 8: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 9: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

COMO ISSO DEVERIA IMPACTAR NOSSO

DESENVOLVIMENTO?

Page 10: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

UX

Sensação de rapidez

Não deve ser frustrante

Deve ser honesta sobre conectividade

Não deve perder informações

Page 11: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

TÁ, E COMO FAZ?

Page 12: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

APPLICATION CACHECACHE DE ARQUIVOS NO BROWSER

Page 13: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

<html manifest="manifest.appcache">

CACHE MANIFEST

CACHE: http://jurassicpark.com/images/dino1.jpg http://jurassicpark.com/images/dino2.jpg http://jurassicpark.com/images/dino3.jpg

NETWORK: https://facebook.com/sdk.js

FALLBACK: index.html offline.html

Page 14: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 15: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

PROBLEMAS

O AppCache só atualiza o conteúdo do manifesto se ele mesmo for atualizado

Os arquivos sempre virão do ApplicationCache mesmo se você estiver online

Recomendo fortemente a leitura:http://sergiolopes.org/palestra-appcache-html5-offline/

Page 16: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 17: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

HÁ ESPERANÇA

Page 18: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 19: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

MAS AINDA NÃO É O IDEAL…

O Application Cache é ok para cachear assets

Mas precisamos de algo mais evoluído para controlar de forma programática, sem modo texto

Page 20: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 21: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

AppCache

Service Workers

Page 22: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

O FUTURO DO CACHE NO BROWSER

SERVICE WORKERS

Page 23: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

if ('serviceWorker' in navigator) { navigator.serviceWorker.register( '/js/sw.js', { scope: '/' } ).then(function(reg) {

if(reg.installing) { console.log('Service worker installing'); } else if(reg.waiting) { console.log('Service worker installed'); } else if(reg.active) { console.log('Service worker active'); }

}).catch(function(error) { // registration failed console.log('Registration failed with ' + error); }); };

Page 24: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

// /js/sw.js this.addEventListener('install', function(event) { event.waitUntil( caches.open('v1').then(function(cache) { return cache.addAll([ '/index.html', '/js/app.js', '/css/styles.css', '/images/gallery/jurassic_park.jpg' ]); }) ); });

Page 25: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

this.addEventListener('fetch', function(event) { var response; event.respondWith(caches.match(event.request).catch(function() { return fetch(event.request); }).then(function(r) { response = r; caches.open('v1').then(function(cache) { cache.put(event.request, response); }); return response.clone(); }).catch(function() { return caches.match('/images/gallery/jurassic_park.jpg'); })); });

Page 26: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 27: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 28: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

MAS VAMOS FALAR SOBRE DADOS

Como faço pra armazenar informações além de assets?

Page 29: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

FORMAS DE SE ARMAZENAR DADOS

• cookies• localStorage• WebSQL• IndexedDB

Page 30: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

COOKIEForma mais primitiva de armazenar

informação no browser

Page 31: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

document.cookie = "dino=T-Rex"; document.cookie = "dino=T-Rex;expires=Fri, 31 Dec 9999 23:59:59 GMT";

Page 32: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 33: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

https://github.com/js-cookie/js-cookie

Page 34: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

Cookies.set("dino", "Velociraptor", { expires: 7 });

Cookies.get("dino"); // returns "dino"

Cookies.remove("dino");

Page 35: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

PRÓS CONTRAS

Simples de implementar Sem uma biblioteca o controle fica complicado

Browsers suportam amplamente

Problemas de segurança (Cookie stealing e XSS,

CSFR, etc.)

Ótimo para informações curtas Limite de 4093 bytes

Page 36: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

LOCALSTORAGEForma mais moderninha de

armazenamento

Page 37: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

localStorage.setItem("dino", "Aragosaurus");

localStorage.getItem("dino"); // returns "Aragosaurus"

localStorage.dino = "Aragosaurus";

Page 38: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 39: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

https://github.com/addyosmani/basket.js

Page 40: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

basket.require( { url: "jquery.js" }, { url: "underscore.js" }, { url: "backbone.js" } );

basket.require({ url: "jquery.min.js", key: "jquery" }); var req = basket.get("jquery");

Page 41: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

https://github.com/marcuswestin/store.js

Page 42: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

store.set("dino", "Datousaurus");

store.get("dino"); // returns "Datousaurus"

store.remove("dino");

store.clear();

store.set("dino", { name: "Datousaurus", diet: "herbivorous" });

Page 43: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 44: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

PRÓS CONTRAS

Fácil implementação Limite de 5M por domínio

Amplo suporte É síncrono

Melhor segurançaOs dados ficam lá

eternamente, mesmo não visitando mais o site

Page 45: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

WEBSQLSQL no seu browser

Page 46: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

// name, version, description, size (bytes) var db = openDatabase("dinos", "1", "todo list example db", 2 * 1024 * 1024);

// executeSql // (SQL string, arguments, success, error) db.transaction( function (tx) { tx.executeSql( "CREATE TABLE IF NOT EXISTS dinos (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)", [], function (tx, results) { console.log("ok!"); }, function (err) { console.log("error!", err); } ); } );

Page 47: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

db.transaction( function (tx) { tx.executeSql( "SELECT * FROM dinos WHERE id > ?", ["1"], function (tx, results) { var row = ""; for (var i=0; i<results.rows.length; i++) { console.log("Dino name:", results.rows.item(i).name); } }, function (err) { console.log("query problems...", err); } ); }, function (err) { console.log("transaction problems...", err); } );

Page 48: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

db.transaction( function (tx) { tx.executeSql( "INSERT INTO dinos(name) VALUES(?)", ["Megalosaurus"], function ( tx, results ) { console.log("ok! inserted!"); }, function (err) { console.log("not inserted :("); } ); }, function (err) { console.log("inserting problems...", err); }, function () { console.log("transaction completed!"); } );

Page 49: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 50: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 51: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 52: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

PRÓS CONTRAS

Banco de dados no browser

Sintaxe SQL pode assustar quem não está

acostumado

Performance razoávelDeprecated. Apenas

alguns browsers ainda dão suporte.

Não é full SQL supported.

Crash com muitos dados (10,000 rows já apresenta

certa lentidão)

Page 53: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

INDEXEDDBlike a localStorage, but coolest

Page 54: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

var request = window.indexedDB.open("DinoDatabase", 1);

request.onerror = function (event) { console.log("Error", event.target.errorCode); };

request.onupgradeneeded = function (event) { db = event.target.result;

if ( db.objectStoreNames.contains("dinos") ) { db.deleteObjectStore("dinos"); }

var store = db.createObjectStore("dinos", { autoIncrement: true }); };

Page 55: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

request.onsuccess = function (event) { db = event.target.result;

var trans = db.transaction(["dinos"], "readwrite"); var transRequest = trans.objectStore("dinos");

transRequest.onsuccess = function (event) { var result = transRequest.result || event.result;

if (!result) return; console.log("dino", result.key, result.value.text);

cursor.continue(); }

var dinoName = "Velociraptor"; var storeRequest = transRequest.put(dinoName);

storeRequest.onsuccess = function (event) { console.log(event.target.result) }

storeRequest.onerror = function (event) { console.log(event) } };

Page 56: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 57: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 58: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

PRÓS CONTRAS

Mais evoluído que localStorage

Suporte em browsers modernos

Pode trabalhar com uma quantidade maior de

dados

Se o usuário fechar o browser no meio de uma transaction, o dado se

perdePode trabalhar em

Workers

Mais complexo que as outras formas de armazenamento

Tem índices

Page 59: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

FUNCIONA NO MEU FRAMEWORK DO ❤?

Page 60: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

LOCALSTORAGE

https://github.com/jeromegn/Backbone.localStorage

https://github.com/grevory/angular-local-storage

https://github.com/STRML/react-localstorage

https://github.com/locks/ember-localstorage-adapter

Page 61: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

WEBSQL

https://github.com/BJTerry/backbone.websqloffline

https://github.com/paulocaldeira17/angular-websql

https://github.com/inDream/ember-model-websql-adapter

Page 62: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

INDEXEDDB

https://github.com/vincentmac/backbone-idb

https://github.com/bramski/angular-indexedDB

https://github.com/kurko/ember-indexeddb-adapter

Page 63: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

OK, MAS TUDO ISSO AINDA

PARECE MUITO COMPLICADO...

Page 64: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

MOZILLA.LOCALFORAGEhttps://github.com/mozilla/localForage

Page 65: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

// In localStorage, we would do: var obj = { value: "Dinofauro" }; localStorage.setItem("dino", JSON.stringify(obj)); console.log(obj.value);

// With localForage, we use callbacks: localforage.setItem("dino", obj, function (err, result) { console.log(result.value); });

Page 66: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

localforage.getItem("dino", function(err, value) { if (err) { console.error(“Oops...”); } else { console.log("Dino:", value); } });

Page 67: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 68: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 69: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

var db = new PouchDB("dinoDB");

db.put({ _id: 1, name: "Dinofauro Fefiz" });

db.changes().on("change", function () { console.log("Alterou alfuma foisa"); });

db.replicate.to("http://dinofauro.com/dinoDB");

Page 70: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 71: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

AGORA SIM! PODEMOS RODAR NOSSA APLICAÇÃO ATÉ NA

ILHA NUBLAR!!!

Page 72: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

NÃO É SÓ POR DIVERSÃO

É QUESTÃO DE UX!!!

Page 73: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 74: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

SEJA SENSATO!

Em alguns casos o cenário offline nem pode existir, como em serviços de chat, transmissão de áudio e

vídeo, e etc.

O esforço vale a pena somente quando o cenário pede esse tipo de arquitetura

Page 75: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!
Page 76: Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

[email protected]

@eduardojmatos

http://eduardomatos.me

OBRIGADO ;)