SlideShare a Scribd company logo
1 of 61
HTML5 OFFLINE & STORAGE
Soluções para um mundo sem conexão permanente.
Gabriel Oliveira
   gabriel.oliveira@caelum.com.br
   @gabaiel


 UI, UX, IxD designer
 Front-end
 Back-end
 Instrutor na Caelum
HTML5 - O que tem aqui?
Connectivity / Realtime
HTML5 - O que tem aqui?
Connectivity / Realtime
CSS3
HTML5 - O que tem aqui?
Connectivity / Realtime
CSS3
Device Access
HTML5 - O que tem aqui?
Connectivity / Realtime
CSS3
Device Access
3D, Graphics & Effects
HTML5 - O que tem aqui?
Connectivity / Realtime
CSS3
Device Access
3D, Graphics & Effects
Multimedia
HTML5 - O que tem aqui?
Connectivity / Realtime
CSS3
Device Access
3D, Graphics & Effects
Multimedia
Performance & Integration
HTML5 - O que tem aqui?
Connectivity / Realtime
CSS3
Device Access
3D, Graphics & Effects
Multimedia
Performance & Integration
Semantics
HTML5 - O que tem aqui?
Connectivity / Realtime
CSS3
Device Access
3D, Graphics & Effects
Multimedia
Performance & Integration
Semantics
Offline & Storage
“Deixa eu te mostrar esse site...”
WWW - Distributed Platform


Os recursos DEVEM estar “espalhados”
Por que todo mundo fala de “cloud computing”
mesmo?
HTTP Cache




        Server

A       C        E
    B       D        F
                         Client (browser)
HTTP Cache




                           A       C
                               B       D
        Server

A       C        E
    B       D        F
                         Client (browser)
HTTP Cache
                                      A       C
                                          B       D
                         HTTP cache




                                  A           C
                                          B       D
        Server

A       C        E
    B       D        F
                                Client (browser)
HTTP Cache
                                      A       C
                                          B       D
                         HTTP cache




        Server

A       C        E
    B       D        F
                                Client (browser)
HTTP Cache
                                      A    C       E
                                      B        D       F
                         HTTP cache




                                  A       E
                                  B            F
        Server

A       C        E
    B       D        F
                                Client (browser)
HTTP Cache
                                      A       C       E
                                          B       D       F
                         HTTP cache




        Server

A       C        E
    B       D        F
                                Client (browser)
Sem HTTP, sem HTTP Cache
“Só preciso REGISTRAR SEU CONTRATO...”
OFFLINE ...
 Armazenamento de
 recursos no cliente
 Permite obtê-los sem
 conexão
 Hybrid Apps & Mobile
   UIWebView (iOS)
   WebView (Android)
... & STORAGE

Evita full HTTP
roundtrips
Menor consumo de
banda
STANDALONE* Hybrid
Apps & Mobile
HTML5 AppCache

Define recursos que DEVEM ser armazenados em
cache
Define recursos que NÃO DEVEM ser armazenados em
cache
Definição de recursos alternativos
AppCache Manifest

Arquivo “plain text”
Começa com CACHE MANIFEST
Os recursos podem ser declarados diretamente na
“raiz” ou em um grupo CACHE
Adicione um comentário para versionamento e controle
de expiração
AppCache Manifest
                                                           offline.appcache
CACHE MANIFEST

# Version 1

CACHE:
# Todas as páginas aqui, por favor
img/logo.png
css/index.css
js/index.js
js/cachecontrol.js

# Cache de recursos distribuidos (CDN)
http://code.jquery.com/jquery.min.js
http://yui.yahooapis.com/combo?3.6.0/build/cssfonts/cssfonts-min.css&3.6.0/build...
AppCache Manifest

Cache de recursos distribuidos
Tem parâmetros na URL?
Não funcionará.
Encontre ou crie URLs sem parâmetro e tudo vai ficar
bem
AppCache Manifest
                                                           offline.appcache
CACHE MANIFEST

# Version 1

CACHE:
# Todas as páginas aqui, por favor
img/logo.png
css/index.css
js/index.js

# Cache de recursos distribuidos (CDN)
http://code.jquery.com/jquery.min.js
http://yui.yahooapis.com/3.6.0/build/cssreset/cssreset-min.css
http://yui.yahooapis.com/3.6.0/build/cssfonts/cssfonts-min.css
http://yui.yahooapis.com/3.6.0/build/cssbase/cssbase-min.css
AppCache Manifest

Tem algum recurso que NÃO deve ser cacheado?
Você pode definir recursos ou “prefixos” que não
devem ser adicionados o AppCache
Com conexão, o navegador tentará obter o recurso da
maneira tradicional
Declare em um grupo NETWORK
AppCache Manifest
                                                       offline.appcache
CACHE MANIFEST

# Version 1

CACHE:
# ...
# Ainda está tudo aqui :)

NETWORK:
# A ‘/’ no fim do caminho serve como ‘/*’ (wildcard)
realtime/
api/
live/chat.php
utils/sendmail.aspx
AppCache Manifest

Feedback sobre o que não pode ser acessado offline
Declare recursos alternativos em um grupo FALLBACK:
Qualquer recurso (HTML, CSS, JavaScript) pode ter
uma versão alternativa
Qualquer “prefixo” pode apontar para um recurso
alternativo
AppCache Manifest
                                                     offline.appcache
CACHE MANIFEST

# Version 1

CACHE:
# ...
# Ainda está tudo aqui :)

NETWORK:
# ...
# Ainda está tudo aqui :)

FALLBACK:
chat.jsp offline.html
img/top.jpg img/offline_badge_top.jpg
events/ notconnected.html
http://www.facebook.com/plugins/ notconnected.html
http://platform.twitter.com/ notconnected.html
AppCache - Utilização

 Configure seu servidor para responder o manifesto
 com MIME text/cache-manifest - *.appcache
 Adicione o atributo “manifest” em todos os HTMLs que
 devem estar disponíveis offline
 Cuidado: algum recurso respondeu 404?
 Nada vai para o cache!
AppCache - Utilização
                                                                     index.html
<!doctype html>
<html manifest="offline.appcache">
  <head>
    <title>QCon 2012 - Offline</title>
    <link rel="styesheet" href="css/index.min.css">
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    ...
AppCache




        Server

A       C        E       M*
    B       D        F
                              Client (browser)
AppCache




                                A       C
                                    B       D
        Server

A       C        E       M*
    B       D        F                           M*
                              Client (browser)
AppCache
                                           A           C
                                                   B       D
                              HTTP cache

                                               A           C       E
                                                       B       D       F



                                       A               C
                                                                   App Cache
                                               B           D
        Server

A       C        E       M*
    B       D        F                                                 M*
                                     Client (browser)
AppCache
                                           A           C
                                                   B       D
                              HTTP cache

                                               A           C       E
                                                       B       D       F




                                                                   App Cache
        Server

A       C        E       M*
    B       D        F                                                 M*
                                     Client (browser)
AppCache
                                           A       C
                                               B       D
                              HTTP cache


                                               A   E        C
                                               B   F            D



                                               A   E
                                                           App Cache
                                               B   F
        Server

A       C        E       M*
    B       D        F                                          M*
                                     Client (browser)
AppCache - Expiração

Mudou uma imagem? Incremente o número de versão
no comentário
Detecte alterações no AppCache Manifest e reconstrua
o cache
Faça isso com JavaScript
Assegure-se de recarregar a página para obter os
novos recursos
AppCache - Expiração
                                                            js/cachecontrol.js
window.applicationCache.addEventListener(‘updateready’, function(event) {
  if(window.applicationCache.status == window.applicationCache.UPDATEREADY) {
    // Um novo manifesto foi detectado, vamos pegar os recursos de novo:
    window.applicationCache.swapCache();

      // Já temos os novos recursos. Vamos mostrá-los:
      if(confirm(‘Nova versão online. Deseja carregar agora?’)) {
        window.location.reload();
      } else {
        // Merece uma mensagem avisando que a versão é obsoleta, não acham?
      }
  }
}, false);
AppCache - Expiração


Cuidado: impeça que o navegador adicione o
AppCache Manifesto ao HTTP Cache!
“access plus 0 seconds”
Online & Offline Events

 Agumas coisas só devem funcionar com uma conexão
 ativa. E se a conexão cair?
 A mudança de status na atividade da conexão deve
 disparar um evento no navegador
 Podemos capturar esse evento com JavaScript
Online & Offline Events
                                                          js/cachecontrol.js
// Aquele código ainda está por aqui :)

window.addEventListener(‘offline’ function(event) {
  // Event Listeners impedindo novos requests
  // salvaremos tudo localmente
}, false);

window.addEventListener(‘online’ function(event) {
  // Enviar o que está no armazenamento local para o servidor. SYNC!
  // Remover Event Listeners e deixar novos requests serem feitos
}, false);
Client-side Storage


 Local Storage
 Session Storage
 Indexed DB
Local Storage


 É como um cookie, só que melhor
 Para guardar dados não-estruturados
 “Same origin”
 http://exemplo.com:80 ≠ http://exemplo.com:8080
Local Storage
                                                          js/cachecontrol.js
// Aquele código ainda está por aqui :)
// salvaremos tudo localmente COM LOCAL STORAGE

// Só podemos salvar Strings (DOMString)
localStorage.setItem(‘userId’, ‘77634810’);

// Mas isso é uma String não?
localStorage.setItem(‘newContractFormData20120605091422’, JSON.stringify({
  email : ‘bla@foo.com’,
  company: ‘Foo Enterprises LLC’,
  createdAt: ‘2012-6-5 09:14:22’
}));
Local Storage - API

 .setItem ( key, value );
 .getItem( key );
 .removeItem( key );
 .clear( );
Local Storage

 Use .clear( ) e .removeItem( key ) somente se
 necessário
 Usuário pode descartar dados armazenados pelas
 configurações do navegador (limpar dados de
 aplicações)
Session Storage


Idêntico ao Local Storage, só que persiste por uma
“sessão”
Fechou a janela, acabou
Fechou a aba, acabou (*)
Indexed DB


Feito para armazenar dados estruturados (object store)
Assíncrono e transacional
“Full-featured document based schemaless NoSQL”
Indexed DB - Utilização


 Criaremos a “base”
 Criaremos um “Object Store” na “base”
Indexed DB - Utilização
                                                              js/cachecontrol.js
// Aquele código ainda está por aqui :)

var idb = {};
idb.db = null;
idb.open = function() {
  var idbDatabase = indexedDB.open(‘caelum’, ‘Indexed DB Caelum Online’);

     idbDatabase.onsuccess = function(event) {
        idb.db = event.target.result;
        var v = ‘1.0’;
        if (v != idb.db.version) {
          var setVersionTransaction = idb.db.setVersion(v);
          setVersionTransaction.onsuccess = function(event) {
            var store = idb.db.createObjectStore(‘comentarios’, { keyPath: ‘createdAt’});
          }
        }
     };
};
Indexed DB - Utilização


 Abriremos a base
 Vamos inserer um objeto no Object Store
Indexed DB - Utilização
                                                          js/cachecontrol.js
// Aquele código ainda está por aqui :)

idb.createComentario = function(comentario) {
  var transaction = idb.db.transaction([‘caelum’], IDBTransaction.READ_WRITE, 0);
  var store = transaction.objectStore(‘comentarios’);
  var commit = store.put({
    content : comentario,
    createdAt : new Date().getTime()
  });

     commit.onsuccess = function(event) {
       // callback
     }
};
Indexed DB - Utilizção



 Vamos fazer um “SELECT *”, mas usando um cursor
Indexed DB - Utilização
                                                              js/cachecontrol.js
// Aquele código ainda está por aqui :)

idb.getComentarios = function() {
  var transaction = idb.db.transaction([‘caelum’], IDBTransaction.READ_WRITE, 0);
  var store = transaction.objectStore(‘comentarios’);

     var keyRange = IDBKeyRange.lowerBound(0);
     var cursor = store.openCursos(keyRange);

     cursor.onsuccess = function(event) {
        var current = e.target.result;
        // Paramos o cursor com Explicit Boolean Comparison
        // para evitar outros valores válidos
        if(!!current == false) {
          return;
        }
        // callback
     };
};
E quando a conexão voltar?


Mande os dados nos callbacks por XHR, por exemplo
Cuidado: leitura assíncrona, requisições XHR,
callbacks, você sabe onde isso vai parar se não souber
muito bem o que está fazendo...
Perguntas? Eu tenho...
 Quanto posso armazenar?


      App Cache            Indeterminado

     Local Storage         5MB mínimo

    Session Storage        5MB mínimo

      Indexed DB           Indeterminado
Perguntas? Eu tenho...
 Funciona em que navegador?
                             Internet
          Chrome   Firefox              Opera   Safari
                             Explorer
 App
            4       3.5        10       10.60     4
Cache
 Local
            4       3.5         8       10.50     4
Storage
Session
            5        2          8       10.50     4
Storage
Indexed
            12       16        10        --       --
  DB
Perguntas? Eu tenho...
 Mas você citou “MOBILE”
                                            Android
                iOS (Safari)   Opera Mini
                                            Browser

 App Cache          3.2            --         2.1

Local Storage       3.2            --         2.1

  Session
                    3.2            --         2.1
  Storage

 Indexed DB         -- *          -- ?        -- *
MUITO OBRIGADO!
 gabriel.oliveira@caelum.com.br
 @gabaiel

More Related Content

Similar to HTML5 Offline Storage

Introdução ao desenvolvimento Web
Introdução ao desenvolvimento WebIntrodução ao desenvolvimento Web
Introdução ao desenvolvimento WebSérgio Souza Costa
 
SAPO Videos
SAPO VideosSAPO Videos
SAPO Videoscodebits
 
MongoDB em producao
MongoDB em producaoMongoDB em producao
MongoDB em producaoAndre Ferraz
 
Construindo aplicações saudáveis e prontas para envelhecer The 12ou15 Factors
Construindo aplicações saudáveis e prontas para envelhecer The 12ou15 FactorsConstruindo aplicações saudáveis e prontas para envelhecer The 12ou15 Factors
Construindo aplicações saudáveis e prontas para envelhecer The 12ou15 FactorsRoberto Santacroce Martins
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIComunidade NetPonto
 
Ha proxy + consul = balance de carga transparente para conteiners
Ha proxy + consul = balance de carga transparente para conteinersHa proxy + consul = balance de carga transparente para conteiners
Ha proxy + consul = balance de carga transparente para conteinersguitoper
 
Construindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaConstruindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaAmazon Web Services LATAM
 
Deep dive em aceleração de entrega de conteúdo, APIs e Aplicações utilizando ...
Deep dive em aceleração de entrega de conteúdo, APIs e Aplicações utilizando ...Deep dive em aceleração de entrega de conteúdo, APIs e Aplicações utilizando ...
Deep dive em aceleração de entrega de conteúdo, APIs e Aplicações utilizando ...Amazon Web Services LATAM
 
The twelve factor app - Princípios e boas práticas aplicados no mundo real
The twelve factor app - Princípios e boas práticas aplicados no mundo realThe twelve factor app - Princípios e boas práticas aplicados no mundo real
The twelve factor app - Princípios e boas práticas aplicados no mundo realJosé Filipe Lyra
 
AAB301 - Rich Internet Application - wcamb
AAB301 - Rich Internet Application - wcambAAB301 - Rich Internet Application - wcamb
AAB301 - Rich Internet Application - wcambMicrosoft Brasil
 
Levando Serverless para o Edge - ARC301 - Sao Paulo Summit
Levando Serverless para o Edge -  ARC301 - Sao Paulo SummitLevando Serverless para o Edge -  ARC301 - Sao Paulo Summit
Levando Serverless para o Edge - ARC301 - Sao Paulo SummitAmazon Web Services
 
Arquitetura Web Desacoplada - FCI/Mackenzie
Arquitetura Web Desacoplada - FCI/MackenzieArquitetura Web Desacoplada - FCI/Mackenzie
Arquitetura Web Desacoplada - FCI/MackenzieVivaldo Jose Breternitz
 
Html5 pt - Offline Apps
Html5 pt - Offline AppsHtml5 pt - Offline Apps
Html5 pt - Offline AppsByclosure
 
Desenvolvendo para web ASP.Net (Overview para iniciantes)
Desenvolvendo para web ASP.Net (Overview para iniciantes)Desenvolvendo para web ASP.Net (Overview para iniciantes)
Desenvolvendo para web ASP.Net (Overview para iniciantes)Fernando Gonçalves
 
Construindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaConstruindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaAmazon Web Services LATAM
 
Construindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaConstruindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaAmazon Web Services LATAM
 
Construindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaConstruindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaAmazon Web Services LATAM
 

Similar to HTML5 Offline Storage (20)

Introdução ao desenvolvimento Web
Introdução ao desenvolvimento WebIntrodução ao desenvolvimento Web
Introdução ao desenvolvimento Web
 
SAPO Videos
SAPO VideosSAPO Videos
SAPO Videos
 
MongoDB em producao
MongoDB em producaoMongoDB em producao
MongoDB em producao
 
Construindo aplicações saudáveis e prontas para envelhecer The 12ou15 Factors
Construindo aplicações saudáveis e prontas para envelhecer The 12ou15 FactorsConstruindo aplicações saudáveis e prontas para envelhecer The 12ou15 Factors
Construindo aplicações saudáveis e prontas para envelhecer The 12ou15 Factors
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web API
 
Ha proxy + consul = balance de carga transparente para conteiners
Ha proxy + consul = balance de carga transparente para conteinersHa proxy + consul = balance de carga transparente para conteiners
Ha proxy + consul = balance de carga transparente para conteiners
 
Construindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaConstruindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS Lambda
 
Deep dive em aceleração de entrega de conteúdo, APIs e Aplicações utilizando ...
Deep dive em aceleração de entrega de conteúdo, APIs e Aplicações utilizando ...Deep dive em aceleração de entrega de conteúdo, APIs e Aplicações utilizando ...
Deep dive em aceleração de entrega de conteúdo, APIs e Aplicações utilizando ...
 
Iniciando com ASP.NET
Iniciando com ASP.NETIniciando com ASP.NET
Iniciando com ASP.NET
 
The twelve factor app - Princípios e boas práticas aplicados no mundo real
The twelve factor app - Princípios e boas práticas aplicados no mundo realThe twelve factor app - Princípios e boas práticas aplicados no mundo real
The twelve factor app - Princípios e boas práticas aplicados no mundo real
 
AAB301 - Rich Internet Application - wcamb
AAB301 - Rich Internet Application - wcambAAB301 - Rich Internet Application - wcamb
AAB301 - Rich Internet Application - wcamb
 
Levando Serverless para o Edge - ARC301 - Sao Paulo Summit
Levando Serverless para o Edge -  ARC301 - Sao Paulo SummitLevando Serverless para o Edge -  ARC301 - Sao Paulo Summit
Levando Serverless para o Edge - ARC301 - Sao Paulo Summit
 
Diagramas de distribuicao
Diagramas de distribuicaoDiagramas de distribuicao
Diagramas de distribuicao
 
Arquitetura Web Desacoplada - FCI/Mackenzie
Arquitetura Web Desacoplada - FCI/MackenzieArquitetura Web Desacoplada - FCI/Mackenzie
Arquitetura Web Desacoplada - FCI/Mackenzie
 
Html5 pt - Offline Apps
Html5 pt - Offline AppsHtml5 pt - Offline Apps
Html5 pt - Offline Apps
 
Roadmap - Rodney Repullo
Roadmap - Rodney RepulloRoadmap - Rodney Repullo
Roadmap - Rodney Repullo
 
Desenvolvendo para web ASP.Net (Overview para iniciantes)
Desenvolvendo para web ASP.Net (Overview para iniciantes)Desenvolvendo para web ASP.Net (Overview para iniciantes)
Desenvolvendo para web ASP.Net (Overview para iniciantes)
 
Construindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaConstruindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS Lambda
 
Construindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaConstruindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS Lambda
 
Construindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaConstruindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS Lambda
 

HTML5 Offline Storage

  • 1. HTML5 OFFLINE & STORAGE Soluções para um mundo sem conexão permanente.
  • 2. Gabriel Oliveira gabriel.oliveira@caelum.com.br @gabaiel UI, UX, IxD designer Front-end Back-end Instrutor na Caelum
  • 3. HTML5 - O que tem aqui? Connectivity / Realtime
  • 4. HTML5 - O que tem aqui? Connectivity / Realtime CSS3
  • 5. HTML5 - O que tem aqui? Connectivity / Realtime CSS3 Device Access
  • 6. HTML5 - O que tem aqui? Connectivity / Realtime CSS3 Device Access 3D, Graphics & Effects
  • 7. HTML5 - O que tem aqui? Connectivity / Realtime CSS3 Device Access 3D, Graphics & Effects Multimedia
  • 8. HTML5 - O que tem aqui? Connectivity / Realtime CSS3 Device Access 3D, Graphics & Effects Multimedia Performance & Integration
  • 9. HTML5 - O que tem aqui? Connectivity / Realtime CSS3 Device Access 3D, Graphics & Effects Multimedia Performance & Integration Semantics
  • 10. HTML5 - O que tem aqui? Connectivity / Realtime CSS3 Device Access 3D, Graphics & Effects Multimedia Performance & Integration Semantics Offline & Storage
  • 11. “Deixa eu te mostrar esse site...”
  • 12. WWW - Distributed Platform Os recursos DEVEM estar “espalhados” Por que todo mundo fala de “cloud computing” mesmo?
  • 13. HTTP Cache Server A C E B D F Client (browser)
  • 14. HTTP Cache A C B D Server A C E B D F Client (browser)
  • 15. HTTP Cache A C B D HTTP cache A C B D Server A C E B D F Client (browser)
  • 16. HTTP Cache A C B D HTTP cache Server A C E B D F Client (browser)
  • 17. HTTP Cache A C E B D F HTTP cache A E B F Server A C E B D F Client (browser)
  • 18. HTTP Cache A C E B D F HTTP cache Server A C E B D F Client (browser)
  • 19. Sem HTTP, sem HTTP Cache
  • 20. “Só preciso REGISTRAR SEU CONTRATO...”
  • 21. OFFLINE ... Armazenamento de recursos no cliente Permite obtê-los sem conexão Hybrid Apps & Mobile UIWebView (iOS) WebView (Android)
  • 22. ... & STORAGE Evita full HTTP roundtrips Menor consumo de banda STANDALONE* Hybrid Apps & Mobile
  • 23. HTML5 AppCache Define recursos que DEVEM ser armazenados em cache Define recursos que NÃO DEVEM ser armazenados em cache Definição de recursos alternativos
  • 24. AppCache Manifest Arquivo “plain text” Começa com CACHE MANIFEST Os recursos podem ser declarados diretamente na “raiz” ou em um grupo CACHE Adicione um comentário para versionamento e controle de expiração
  • 25. AppCache Manifest offline.appcache CACHE MANIFEST # Version 1 CACHE: # Todas as páginas aqui, por favor img/logo.png css/index.css js/index.js js/cachecontrol.js # Cache de recursos distribuidos (CDN) http://code.jquery.com/jquery.min.js http://yui.yahooapis.com/combo?3.6.0/build/cssfonts/cssfonts-min.css&3.6.0/build...
  • 26. AppCache Manifest Cache de recursos distribuidos Tem parâmetros na URL? Não funcionará. Encontre ou crie URLs sem parâmetro e tudo vai ficar bem
  • 27. AppCache Manifest offline.appcache CACHE MANIFEST # Version 1 CACHE: # Todas as páginas aqui, por favor img/logo.png css/index.css js/index.js # Cache de recursos distribuidos (CDN) http://code.jquery.com/jquery.min.js http://yui.yahooapis.com/3.6.0/build/cssreset/cssreset-min.css http://yui.yahooapis.com/3.6.0/build/cssfonts/cssfonts-min.css http://yui.yahooapis.com/3.6.0/build/cssbase/cssbase-min.css
  • 28. AppCache Manifest Tem algum recurso que NÃO deve ser cacheado? Você pode definir recursos ou “prefixos” que não devem ser adicionados o AppCache Com conexão, o navegador tentará obter o recurso da maneira tradicional Declare em um grupo NETWORK
  • 29. AppCache Manifest offline.appcache CACHE MANIFEST # Version 1 CACHE: # ... # Ainda está tudo aqui :) NETWORK: # A ‘/’ no fim do caminho serve como ‘/*’ (wildcard) realtime/ api/ live/chat.php utils/sendmail.aspx
  • 30. AppCache Manifest Feedback sobre o que não pode ser acessado offline Declare recursos alternativos em um grupo FALLBACK: Qualquer recurso (HTML, CSS, JavaScript) pode ter uma versão alternativa Qualquer “prefixo” pode apontar para um recurso alternativo
  • 31. AppCache Manifest offline.appcache CACHE MANIFEST # Version 1 CACHE: # ... # Ainda está tudo aqui :) NETWORK: # ... # Ainda está tudo aqui :) FALLBACK: chat.jsp offline.html img/top.jpg img/offline_badge_top.jpg events/ notconnected.html http://www.facebook.com/plugins/ notconnected.html http://platform.twitter.com/ notconnected.html
  • 32. AppCache - Utilização Configure seu servidor para responder o manifesto com MIME text/cache-manifest - *.appcache Adicione o atributo “manifest” em todos os HTMLs que devem estar disponíveis offline Cuidado: algum recurso respondeu 404? Nada vai para o cache!
  • 33. AppCache - Utilização index.html <!doctype html> <html manifest="offline.appcache"> <head> <title>QCon 2012 - Offline</title> <link rel="styesheet" href="css/index.min.css"> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> ...
  • 34. AppCache Server A C E M* B D F Client (browser)
  • 35. AppCache A C B D Server A C E M* B D F M* Client (browser)
  • 36. AppCache A C B D HTTP cache A C E B D F A C App Cache B D Server A C E M* B D F M* Client (browser)
  • 37. AppCache A C B D HTTP cache A C E B D F App Cache Server A C E M* B D F M* Client (browser)
  • 38. AppCache A C B D HTTP cache A E C B F D A E App Cache B F Server A C E M* B D F M* Client (browser)
  • 39. AppCache - Expiração Mudou uma imagem? Incremente o número de versão no comentário Detecte alterações no AppCache Manifest e reconstrua o cache Faça isso com JavaScript Assegure-se de recarregar a página para obter os novos recursos
  • 40. AppCache - Expiração js/cachecontrol.js window.applicationCache.addEventListener(‘updateready’, function(event) { if(window.applicationCache.status == window.applicationCache.UPDATEREADY) { // Um novo manifesto foi detectado, vamos pegar os recursos de novo: window.applicationCache.swapCache(); // Já temos os novos recursos. Vamos mostrá-los: if(confirm(‘Nova versão online. Deseja carregar agora?’)) { window.location.reload(); } else { // Merece uma mensagem avisando que a versão é obsoleta, não acham? } } }, false);
  • 41. AppCache - Expiração Cuidado: impeça que o navegador adicione o AppCache Manifesto ao HTTP Cache! “access plus 0 seconds”
  • 42. Online & Offline Events Agumas coisas só devem funcionar com uma conexão ativa. E se a conexão cair? A mudança de status na atividade da conexão deve disparar um evento no navegador Podemos capturar esse evento com JavaScript
  • 43. Online & Offline Events js/cachecontrol.js // Aquele código ainda está por aqui :) window.addEventListener(‘offline’ function(event) { // Event Listeners impedindo novos requests // salvaremos tudo localmente }, false); window.addEventListener(‘online’ function(event) { // Enviar o que está no armazenamento local para o servidor. SYNC! // Remover Event Listeners e deixar novos requests serem feitos }, false);
  • 44. Client-side Storage Local Storage Session Storage Indexed DB
  • 45. Local Storage É como um cookie, só que melhor Para guardar dados não-estruturados “Same origin” http://exemplo.com:80 ≠ http://exemplo.com:8080
  • 46. Local Storage js/cachecontrol.js // Aquele código ainda está por aqui :) // salvaremos tudo localmente COM LOCAL STORAGE // Só podemos salvar Strings (DOMString) localStorage.setItem(‘userId’, ‘77634810’); // Mas isso é uma String não? localStorage.setItem(‘newContractFormData20120605091422’, JSON.stringify({ email : ‘bla@foo.com’, company: ‘Foo Enterprises LLC’, createdAt: ‘2012-6-5 09:14:22’ }));
  • 47. Local Storage - API .setItem ( key, value ); .getItem( key ); .removeItem( key ); .clear( );
  • 48. Local Storage Use .clear( ) e .removeItem( key ) somente se necessário Usuário pode descartar dados armazenados pelas configurações do navegador (limpar dados de aplicações)
  • 49. Session Storage Idêntico ao Local Storage, só que persiste por uma “sessão” Fechou a janela, acabou Fechou a aba, acabou (*)
  • 50. Indexed DB Feito para armazenar dados estruturados (object store) Assíncrono e transacional “Full-featured document based schemaless NoSQL”
  • 51. Indexed DB - Utilização Criaremos a “base” Criaremos um “Object Store” na “base”
  • 52. Indexed DB - Utilização js/cachecontrol.js // Aquele código ainda está por aqui :) var idb = {}; idb.db = null; idb.open = function() { var idbDatabase = indexedDB.open(‘caelum’, ‘Indexed DB Caelum Online’); idbDatabase.onsuccess = function(event) { idb.db = event.target.result; var v = ‘1.0’; if (v != idb.db.version) { var setVersionTransaction = idb.db.setVersion(v); setVersionTransaction.onsuccess = function(event) { var store = idb.db.createObjectStore(‘comentarios’, { keyPath: ‘createdAt’}); } } }; };
  • 53. Indexed DB - Utilização Abriremos a base Vamos inserer um objeto no Object Store
  • 54. Indexed DB - Utilização js/cachecontrol.js // Aquele código ainda está por aqui :) idb.createComentario = function(comentario) { var transaction = idb.db.transaction([‘caelum’], IDBTransaction.READ_WRITE, 0); var store = transaction.objectStore(‘comentarios’); var commit = store.put({ content : comentario, createdAt : new Date().getTime() }); commit.onsuccess = function(event) { // callback } };
  • 55. Indexed DB - Utilizção Vamos fazer um “SELECT *”, mas usando um cursor
  • 56. Indexed DB - Utilização js/cachecontrol.js // Aquele código ainda está por aqui :) idb.getComentarios = function() { var transaction = idb.db.transaction([‘caelum’], IDBTransaction.READ_WRITE, 0); var store = transaction.objectStore(‘comentarios’); var keyRange = IDBKeyRange.lowerBound(0); var cursor = store.openCursos(keyRange); cursor.onsuccess = function(event) { var current = e.target.result; // Paramos o cursor com Explicit Boolean Comparison // para evitar outros valores válidos if(!!current == false) { return; } // callback }; };
  • 57. E quando a conexão voltar? Mande os dados nos callbacks por XHR, por exemplo Cuidado: leitura assíncrona, requisições XHR, callbacks, você sabe onde isso vai parar se não souber muito bem o que está fazendo...
  • 58. Perguntas? Eu tenho... Quanto posso armazenar? App Cache Indeterminado Local Storage 5MB mínimo Session Storage 5MB mínimo Indexed DB Indeterminado
  • 59. Perguntas? Eu tenho... Funciona em que navegador? Internet Chrome Firefox Opera Safari Explorer App 4 3.5 10 10.60 4 Cache Local 4 3.5 8 10.50 4 Storage Session 5 2 8 10.50 4 Storage Indexed 12 16 10 -- -- DB
  • 60. Perguntas? Eu tenho... Mas você citou “MOBILE” Android iOS (Safari) Opera Mini Browser App Cache 3.2 -- 2.1 Local Storage 3.2 -- 2.1 Session 3.2 -- 2.1 Storage Indexed DB -- * -- ? -- *

Editor's Notes

  1. \n
  2. \n
  3. Web Sockets\nServer-side Events (push)\n
  4. gradients\nborder-radius\nbox-shadow\ntext-shadow\ntransform\ntransition\nflexible box\nmedia queries\n
  5. Geolocation\nAudio input\nVideo input\nLocal data (contacts, events)\nTilt orientation\n
  6. SVG\nCanvas\nWebGL\nCSS 3D\nKeyframe animations\n
  7. Audio\nVideo\n
  8. Web workers\nXMLHttpRequest 2\n
  9. &lt;article&gt;\n&lt;section&gt;\n&lt;header&gt;\n&lt;hgroup&gt;\n&lt;footer&gt;\n&lt;nav&gt;\n&lt;aside&gt;\n&lt;figure&gt;\nRDFa\nMicrodata\nMicroformats\n
  10. App Cache\nLocal storage\nIndexed DB\nFile API\n
  11. Mesmo tendo sido visitado antes, com recursos no cache do navegador, a inexist&amp;#xEA;ncia da conex&amp;#xE3;o impede a exibi&amp;#xE7;&amp;#xE3;o da p&amp;#xE1;gina\n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. Mesmo com recursos em cache &amp;#xE9; imposs&amp;#xED;vel obt&amp;#xEA;-los para exibi&amp;#xE7;&amp;#xE3;o, &amp;#xE9; preciso uma conex&amp;#xE3;o ativa para que o navegador fa&amp;#xE7;a a requisi&amp;#xE7;&amp;#xE3;o e s&amp;#xF3; ent&amp;#xE3;o o navegador verifica se o recurso armazenado est&amp;#xE1; em cache para utiliz&amp;#xE1;-lo\n
  20. Quando imaginamos a WWW como a plataforma de aplica&amp;#xE7;&amp;#xF5;es ENTERPRISE do futuro, temos que contornar essa situa&amp;#xE7;&amp;#xE3;o de alguma maneira\nAt&amp;#xE9; aplica&amp;#xE7;&amp;#xF5;es desktop client/server sofrem com isso: &amp;#x201C;Desculpa senhor, estamos sem sistema&amp;#x201D;\n
  21. Viagens, conex&amp;#xF5;es ruins, blind spots\nApps que devem carregar uma p&amp;#xE1;gina mesmo sem conex&amp;#xE3;o\n
  22. Armazenamento local\n
  23. \n
  24. \n
  25. Declare todos as p&amp;#xE1;ginas no manifesto, assim toda sua app &amp;#xE9; cacheada a partir da home\n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. Mesmo com o cache atualizado, a aplica&amp;#xE7;&amp;#xE3;o ainda utilizar&amp;#xE1; o cache antigo se n&amp;#xE3;o chamarmos swapCache\n
  41. \n
  42. \n
  43. \n
  44. \n
  45. Cookie 4095 bytes, enviado em todas requisi&amp;#xE7;&amp;#xF5;es\nlocalStorage no m&amp;#xED;nimo 5MB, n&amp;#xE3;o &amp;#xE9; enviado\n
  46. Foi feito para salvar Strings, mas podemos abusar do JSON Parsing\n
  47. \n
  48. \n
  49. N&amp;#xE3;o &amp;#xE9; consistente at&amp;#xE9; mesmo em um mesmo navegador\n
  50. \n
  51. \n
  52. indexedDB.open(nome, descri&amp;#xE7;&amp;#xE3;o), onsuccess para usar a base\nObject Store +- tabela\nPrecisa mudar a vers&amp;#xE3;o do idb para criar uma\n
  53. \n
  54. indexedDB.open(nome, descri&amp;#xE7;&amp;#xE3;o), onsuccess para usar a base\nObject Store +- tabela\nPrecisa mudar a vers&amp;#xE3;o do idb para criar uma\n
  55. \n
  56. \n
  57. \n
  58. App Cache pode ser limitado a 10% do espa&amp;#xE7;o em disco dispon&amp;#xED;vel\nIndexed DB &amp;#xE9; indeterminado por defini&amp;#xE7;&amp;#xE3;o\n
  59. \n
  60. Voc&amp;#xEA; pode usar UIWebView / WebView e armazenar no device? WebSQL?\n
  61. \n