HTML5 Application Cache

AppCache,HTML5
27, outubro 2011

Tudo em torno do HTML5 é muito promissor e excitante.
Umas das coisas que acho mais legal é a possibilidade “Offline”.
Estranho pensar nisso logo em 2011, com a evolução que temos, com cada vez mais serviços na Internet, Cloud, etc., não é?
A resposta é NÃO.
HTML5 Offline é muito mais do que apenas trabalhar Offline, são várias possibilidades que antes só eram possíveis com workarounds, ou impossíveis.
Hoje vou falar sobre uma dessas possibilidades: o AppCache.

Ao meu ver o AppCache não tem tido tanta atenção quanto outras features do HTML5, mas com certeza tem um grande potencial.
O primeiro ponto que deve ser esclarecido é que o AppCache não serve apenas para rodar uma aplicação Offline.
AppCache pode ser utilizado para uma das questões mais importantes no desenvolvimento Web: Performance.
Sim, utilizando o AppCache é possível reduzir drasticamente o número de requisições de uma aplicação.
Querem saber o mais legal?
Chrome Firefox Safari Opera IE iOS Safari Android Opera Mini Opera Mobile
Data courtesy of caniuse.com and Chrome Platform Status
4+ 4+ 4+ 11+ 10 5+ 3+ 11+

Esta é a tabela de compatibilidade dos Browsers.
Ou seja, já é possível, desenvolver aplicações web utilizando esta feature.
E notem que os principais browsers mobile também estão na lista.
Sobre o IE, bom… somente na versão 10. Mas nem perderei tempo falando sobre isso.

>> Como fazer?
  • Um arquivo manifest
    Precisamos entregar um arquivo com o MIME type text/cache-manifest
    Por convenção, a extenção do arquivo é .appcache
    O manifest tem 3 seções opcionais:
    CACHE – Todos os arquivos que devem ser armazenados no cache
    NETWORK – Todas URLs que precisam ser acessadas pela Internet
    FALLBACK – Lista de URLs que devem ser usadas caso a Internet esteja indisponível
  • Um atributo na tag HTML
    Na tag <html> basta indicar onde esta o seu manifest:
    <html manifest=”manifest.appcache”> 
  • Um pouco de JavaScript
    Temos um objeto para tratar o cache, ele é o window.applicationCache
    Com este objeto é possível monitorar o estado do cache
    Eventos: cached,checking,downloading,error,noupdate,obsolete,progress,updateready
Alguns detalhes interessante sobre o AppCache:

* Os arquivos listados no manifest não estão sobre a regra de same origin policy, ou  seja, podemos listar URLs Crossdomain.
Mas… isso não vale para SSL, ou seja, se estiver utilizando HTTPS, os arquivos listados no manifest devem obedecer a regra same origin policy.
Mas… O Google Chrome ignora esta especificação, ou seja, independente de estar utilizando SSL ou não, é possível adicionar URLs Cross-Domain.

* O Browser só irá atualizar o cache caso o manifest tenha sido modificado.
Por convenção, utiliza-se um comentário com a versão no manifest.
Detalhe importante:
Após a detecção de que o cache deve ser atualizado, o browser precisa buscar os novos arquivos.
Ou seja, o usuário precisa atualizar a página 2 vezes.
Para isso, se utiliza uma técnica JavaScript que detecta se existe uma nova versão, e então decide se quer baixar esta nova versão.

&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;  // Check if a new cache is available on page load.&amp;lt;br /&amp;gt;window.addEventListener('load', function(e) {&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;  window.applicationCache.addEventListener('updateready', function(e) {&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;    if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;      // Browser downloaded a new app cache.&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;      // Swap it in and reload the page to get the new hotness.&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;      window.applicationCache.swapCache();&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;      if (confirm('A new version of this site is available. Load it?')) {&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;        window.location.reload();&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;      }&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;    } else {&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;      // Manifest didn't changed. Nothing new to server.&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;    }&amp;lt;br /&amp;gt;&amp;lt;%%KEEPWHITESPACE%%&amp;gt;  }, false);&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;}, false);&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;


*
A página onde esta definido que a aplicação utilizará o manifest, mesmo não estando listada no manifest, será armazenada no cache.
Isso pode gerar alguns problemas, dependendo do tipo de cache sua aplicação precisa. Para isso, existe na especificação uma regra que diz que arquivos com a diretiva “no-store” definida no HEADER http sobrescreverá o cache local.
(Obrigado ao @miketaylr que me passou essa especificação)

Bom pessoal, por hoje é isso.
Espero ter passado de forma clara o que é, e para que serve o AppCache.
Referências deste artigo:

7 Respostas para “HTML5 Application Cache”

    • admin

      Coloca o link da tua palestra sobre Storage aqui para quem quiser se aventurar mais um pouco.

      Responder
  1. Leo Balter

    Com certeza é muito bom, mas cuidado na hora de utilizar isso junto com o mod de apache do Pagespeed, da uma zica desgraçada com arquivos cacheados, principalmente os css e js.

    Responder
    • admin

      Tudo ainda é muito novo, e isso é o mais legal.
      Enfrentei varios problemas ao utilizar o AppCache, mas a grande dificuldade é realmente o “novo”.
      Ja existe bastante material para pesquisa, mas nao se compara com o que estamos acostumados.

      Responder

Deixar uma Resposta