SlideShare uma empresa Scribd logo
1 de 76
Baixar para ler offline
JurassicJavaScriptParkRodando offline até na Ilha Nublar!
@eduardojmatos eduardomatos.me
OI, EU SOU O EDU
Seu empréstimo certo. Com garantia. Online.
PORQUE AINDA
FALAMOS SOBRE
OFFLINE EM
2016?
http://ispspeedindex.netflix.com/country/brazil/
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/
COMO ISSO DEVERIA
IMPACTAR NOSSO
DESENVOLVIMENTO?
UX
Sensação de rapidez
Não deve ser frustrante
Deve ser honesta sobre conectividade
Não deve perder informações
TÁ, E COMO FAZ?
APPLICATION CACHE
CACHE DE ARQUIVOS NO BROWSER
<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
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/
HÁ ESPERANÇA
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
AppCache
Service Workers
O FUTURO DO CACHE NO BROWSER
SERVICE WORKERS
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);
});
};
// /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'
]);
})
);
});
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');
}));
});
MAS VAMOS FALAR
SOBRE DADOS
Como faço pra armazenar informações
além de assets?
FORMAS DE SE
ARMAZENAR DADOS
• cookies
• localStorage
• WebSQL
• IndexedDB
COOKIE
Forma mais primitiva de armazenar
informação no browser
document.cookie = "dino=T-Rex";
document.cookie = "dino=T-Rex;expires=Fri,
31 Dec 9999 23:59:59 GMT";
https://github.com/js-cookie/js-cookie
Cookies.set("dino", "Velociraptor", { expires: 7 });
Cookies.get("dino");
// returns "dino"
Cookies.remove("dino");
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
LOCALSTORAGE
Forma mais moderninha de
armazenamento
localStorage.setItem("dino", "Aragosaurus");
localStorage.getItem("dino");
// returns "Aragosaurus"
localStorage.dino = "Aragosaurus";
https://github.com/addyosmani/basket.js
basket.require(
{ url: "jquery.js" },
{ url: "underscore.js" },
{ url: "backbone.js" }
);
basket.require({ url: "jquery.min.js", key: "jquery" });
var req = basket.get("jquery");
https://github.com/marcuswestin/store.js
store.set("dino", "Datousaurus");
store.get("dino");
// returns "Datousaurus"
store.remove("dino");
store.clear();
store.set("dino", {
name: "Datousaurus",
diet: "herbivorous"
});
PRÓS CONTRAS
Fácil implementação Limite de 5M por domínio
Amplo suporte É síncrono
Melhor segurança
Os dados ficam lá
eternamente, mesmo não
visitando mais o site
WEBSQL
SQL no seu browser
// 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);
}
);
}
);
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);
}
);
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!");
}
);
PRÓS CONTRAS
Banco de dados no
browser
Sintaxe SQL pode
assustar quem não está
acostumado
Performance razoável
Deprecated. Apenas
alguns browsers ainda
dão suporte.
Não é full SQL supported.
Crash com muitos dados
(10,000 rows já apresenta
certa lentidão)
INDEXEDDB
like a localStorage, but coolest
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
});
};
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)
}
};
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
perde
Pode trabalhar em
Workers
Mais complexo que as
outras formas de
armazenamento
Tem índices
FUNCIONA NO MEU
FRAMEWORK DO ❤?
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
WEBSQL
https://github.com/BJTerry/backbone.websqloffline
https://github.com/paulocaldeira17/angular-websql
https://github.com/inDream/ember-model-websql-
adapter
INDEXEDDB
https://github.com/vincentmac/backbone-idb
https://github.com/bramski/angular-indexedDB
https://github.com/kurko/ember-indexeddb-adapter
OK, MAS TUDO
ISSO AINDA
PARECE MUITO
COMPLICADO...
MOZILLA.LOCALFORAGE
https://github.com/mozilla/localForage
// 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);
});
localforage.getItem("dino", function(err, value) {
if (err) {
console.error(“Oops...”);
} else {
console.log("Dino:", value);
}
});
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");
AGORA SIM! PODEMOS RODAR
NOSSA APLICAÇÃO ATÉ NA
ILHA NUBLAR!!!
NÃO É SÓ POR DIVERSÃO
É QUESTÃO DE UX!!!
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
eduardoj.matos@gmail.com
@eduardojmatos
http://eduardomatos.me
OBRIGADO ;)

Mais conteúdo relacionado

Destaque

A arte de ser Mensch
A arte de ser MenschA arte de ser Mensch
A arte de ser MenschCreditas
 
How To Get Organized
How To Get OrganizedHow To Get Organized
How To Get OrganizedCreditas
 
Positive reinforcement and statistics
Positive reinforcement and statisticsPositive reinforcement and statistics
Positive reinforcement and statisticsCreditas
 
O que o seu texto diz sobre você
O que o seu texto diz sobre vocêO que o seu texto diz sobre você
O que o seu texto diz sobre vocêCreditas
 
O paradoxo da escolha
O paradoxo da escolhaO paradoxo da escolha
O paradoxo da escolhaCreditas
 
Modern sql
Modern sqlModern sql
Modern sqlCreditas
 
Debugging with pry
Debugging with pryDebugging with pry
Debugging with pryCreditas
 
Rails in the bowels
Rails in the bowelsRails in the bowels
Rails in the bowelsCreditas
 
Como melhorar sua comunicação com sua equipe, sua mãe e seu chefe
Como melhorar sua comunicação com sua equipe, sua mãe e seu chefeComo melhorar sua comunicação com sua equipe, sua mãe e seu chefe
Como melhorar sua comunicação com sua equipe, sua mãe e seu chefeCreditas
 
Text mining Pre-processing
Text mining Pre-processingText mining Pre-processing
Text mining Pre-processingCreditas
 
OOCSS and SMACSS
OOCSS and SMACSSOOCSS and SMACSS
OOCSS and SMACSSCreditas
 
An introduction to MySQL
An introduction to MySQLAn introduction to MySQL
An introduction to MySQLCreditas
 
Pig - Analyzing data sets
Pig - Analyzing data setsPig - Analyzing data sets
Pig - Analyzing data setsCreditas
 
Melanoma: how to detect skin cancer
Melanoma: how to detect skin cancerMelanoma: how to detect skin cancer
Melanoma: how to detect skin cancerCreditas
 

Destaque (15)

A arte de ser Mensch
A arte de ser MenschA arte de ser Mensch
A arte de ser Mensch
 
How To Get Organized
How To Get OrganizedHow To Get Organized
How To Get Organized
 
Positive reinforcement and statistics
Positive reinforcement and statisticsPositive reinforcement and statistics
Positive reinforcement and statistics
 
O que o seu texto diz sobre você
O que o seu texto diz sobre vocêO que o seu texto diz sobre você
O que o seu texto diz sobre você
 
O paradoxo da escolha
O paradoxo da escolhaO paradoxo da escolha
O paradoxo da escolha
 
Modern sql
Modern sqlModern sql
Modern sql
 
Debugging with pry
Debugging with pryDebugging with pry
Debugging with pry
 
Rails in the bowels
Rails in the bowelsRails in the bowels
Rails in the bowels
 
Como melhorar sua comunicação com sua equipe, sua mãe e seu chefe
Como melhorar sua comunicação com sua equipe, sua mãe e seu chefeComo melhorar sua comunicação com sua equipe, sua mãe e seu chefe
Como melhorar sua comunicação com sua equipe, sua mãe e seu chefe
 
Sublime
SublimeSublime
Sublime
 
Text mining Pre-processing
Text mining Pre-processingText mining Pre-processing
Text mining Pre-processing
 
OOCSS and SMACSS
OOCSS and SMACSSOOCSS and SMACSS
OOCSS and SMACSS
 
An introduction to MySQL
An introduction to MySQLAn introduction to MySQL
An introduction to MySQL
 
Pig - Analyzing data sets
Pig - Analyzing data setsPig - Analyzing data sets
Pig - Analyzing data sets
 
Melanoma: how to detect skin cancer
Melanoma: how to detect skin cancerMelanoma: how to detect skin cancer
Melanoma: how to detect skin cancer
 

Semelhante a Jurassic JavaScript Park - Rodando Offline até na ilha Nublar!

Html5 storage api
Html5 storage apiHtml5 storage api
Html5 storage apiSuissa
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsSuissa
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-androidAlberto Souza
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Rodrigo Urubatan
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaChrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaJoselito Nascimento
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersHarlley Oliveira
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com AjaxAdler Medrado
 
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)Evandro Klimpel Balmant
 
Da argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroDa argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroMichael Castillo Granados
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoCezinha Anjos
 
A vida além do jQuery
A vida além do jQueryA vida além do jQuery
A vida além do jQueryPaulo Pires
 

Semelhante a Jurassic JavaScript Park - Rodando Offline até na ilha Nublar! (20)

Html5 storage api
Html5 storage apiHtml5 storage api
Html5 storage api
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webapps
 
Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-android
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
Apresentação Phonegap
Apresentação PhonegapApresentação Phonegap
Apresentação Phonegap
 
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaChrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
 
Mashups: Criando Valor na Web 2.0 (BandTec)
Mashups: Criando Valor na Web 2.0 (BandTec)Mashups: Criando Valor na Web 2.0 (BandTec)
Mashups: Criando Valor na Web 2.0 (BandTec)
 
Mashups: Criando Valor na Web 2.0
Mashups: Criando Valor na Web 2.0Mashups: Criando Valor na Web 2.0
Mashups: Criando Valor na Web 2.0
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para Webdesigners
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com Ajax
 
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
Interfaces Ricas para WEB com jQuery e jQueryUI (User Interface)
 
Da argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroDa argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguro
 
Ajax em java
Ajax em javaAjax em java
Ajax em java
 
Dinamizando Sites Estáticos
Dinamizando Sites EstáticosDinamizando Sites Estáticos
Dinamizando Sites Estáticos
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direito
 
A vida além do jQuery
A vida além do jQueryA vida além do jQuery
A vida além do jQuery
 
Java e Cloud Computing
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud Computing
 

Mais de Creditas

Hanami & Domain-Driven Design
Hanami & Domain-Driven DesignHanami & Domain-Driven Design
Hanami & Domain-Driven DesignCreditas
 
Application layer
Application layerApplication layer
Application layerCreditas
 
Hanami with a modern touch
Hanami with a modern touchHanami with a modern touch
Hanami with a modern touchCreditas
 
Rails Girls - RubyConfBR 2015
Rails Girls - RubyConfBR 2015Rails Girls - RubyConfBR 2015
Rails Girls - RubyConfBR 2015Creditas
 
GTD - Getting Things Done
GTD - Getting Things DoneGTD - Getting Things Done
GTD - Getting Things DoneCreditas
 
Learning how to learn
Learning how to learnLearning how to learn
Learning how to learnCreditas
 
Solid - OOD Principles
Solid - OOD PrinciplesSolid - OOD Principles
Solid - OOD PrinciplesCreditas
 
Sistemas de recomendação em ruby
Sistemas de recomendação em rubySistemas de recomendação em ruby
Sistemas de recomendação em rubyCreditas
 
Do MONOLÍTICO à arquitetura distribuída
Do MONOLÍTICO à arquitetura distribuídaDo MONOLÍTICO à arquitetura distribuída
Do MONOLÍTICO à arquitetura distribuídaCreditas
 
Deploy Heroku
Deploy HerokuDeploy Heroku
Deploy HerokuCreditas
 

Mais de Creditas (12)

Hanami & Domain-Driven Design
Hanami & Domain-Driven DesignHanami & Domain-Driven Design
Hanami & Domain-Driven Design
 
Application layer
Application layerApplication layer
Application layer
 
Hanami with a modern touch
Hanami with a modern touchHanami with a modern touch
Hanami with a modern touch
 
Rails Girls - RubyConfBR 2015
Rails Girls - RubyConfBR 2015Rails Girls - RubyConfBR 2015
Rails Girls - RubyConfBR 2015
 
GTD - Getting Things Done
GTD - Getting Things DoneGTD - Getting Things Done
GTD - Getting Things Done
 
Neo4 j
Neo4 jNeo4 j
Neo4 j
 
Learning how to learn
Learning how to learnLearning how to learn
Learning how to learn
 
Solid - OOD Principles
Solid - OOD PrinciplesSolid - OOD Principles
Solid - OOD Principles
 
Sistemas de recomendação em ruby
Sistemas de recomendação em rubySistemas de recomendação em ruby
Sistemas de recomendação em ruby
 
Do MONOLÍTICO à arquitetura distribuída
Do MONOLÍTICO à arquitetura distribuídaDo MONOLÍTICO à arquitetura distribuída
Do MONOLÍTICO à arquitetura distribuída
 
Minitest
MinitestMinitest
Minitest
 
Deploy Heroku
Deploy HerokuDeploy Heroku
Deploy Heroku
 

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