Posts da tag Web

Evitando o cache no cliente

HTML e CSS nunca foram meu forte, eu sei o que preciso saber para sobreviver, já que trabalho com desenvolvimento web. Não da pra esperar que eu consiga montar uma apresentação fantástica usando HTML5 e CSS3 e ainda por cima pensando fortemente em semântica, organização e melhores práticas, fato!

Não estou aqui criticando HTML e CSS, eu entendo perfeitamente a importância de tudo isso, mas não posso negar que nunca me dediquei muito para aprende-las, até porque nunca tive a necessidade de ser o responsável por esse trabalho. Exatamente por isso eu aprendi algo babacamente simples esses dias, porém extremamente eficiente.

Imagine mudar o CSS, subir pra produção e o cliente simplesmente ver o seu site totalmente quebrado? Pior, mudar uma imagem (um banner ou qualquer outra imagem) e o cliente continuar recebendo a imagem antiga. Quem trabalha com sistemas web e nunca passou por isso?

É muito comum alterarmos qualquer coisa estática como CSS, imagens e até JavaScript e essas alterações não serem interpretadas pelo navegador. O jeito é limpar (ou desligar) o cache do navegador, dar uns 3 ou mais refreshs ou apelar pro CTRL+F5, isso é o que fazemos desenvolvendo. Mas e quando isso acontece em produção, vamos dizer pro usuário/cliente ‘limpar o cache’? Claro que não, temos que dar um jeito então do navegador do cliente reconhecer as alterações logo na primeira visita.

Isso ocorre pois o navegador faz cache local destes recursos e os utiliza quando julga ser a melhor opção. A mesma coisa ocorre com proxy de redes, que também podem fazer cache. O jeito para descartar esse cache é fazer algum malabarismo no servidor web, mas nem sempre isso é possível, então precisamos recorrer à aplicação, onde – geralmente – temos maior domínio.

O cache no navegador tem uma regra básica super simples: o nome do recurso estático. Se mudarmos o nome de um arquivo CSS ou imagem, por exemplo, não teremos problema algum com cache. Se você puder fazer isso na sua aplicação, ótimo, problema resolvido.

Mas se não puder, temos outra opção simples e eficiente, podemos anexar algum parâmetro falso no nome do recurso, por exemplo:

1
<link rel="stylesheet" type="text/css" href="/css/estilo.css" />

Ao atualizar propriedades desta folha de estilo as alterações não serão perceptíveis no navegador enquanto o cache (do navegador) não for atualizado. E isso ou o cliente faz explicitamente ou nós faremos por ele. Então, vamos fazer a nossa parte, vejam:

1
<link rel="stylesheet" type="text/css" href="/css/estilo.css?1" />

O simples parâmetro ?1 cuida disso pra nós. O navegador vai encarar que se trata de uma nova folha de estilos e fará o download do servidor, utilizando esta nova versão no lugar da que ele tem em cache, na próxima visita o ?1 não vai fazer mais nada, já que o navegador já tem a folha de estilo com o ?1 em cache. O parâmetro ?1 pode ser atualizado toda vez que for preciso fazer alguma alteração na folha de estilo, desta forma o cliente terá sempre a versão correta toda vez que ela for atualizada.

Outra saída é usar um parâmetro que nunca será o mesmo, por exemplo: usar a data completa (dia, mês, ano, hora, minuto e segundo). Só que isso fará com que o cliente faça o download do recurso no servidor toda vez que acessar o site, o que pode causar um grande tráfego no servidor, impactando diretamente na performance da sua aplicação. Num captcha faz sentido, mas em outros casos é bom pensar bastante antes.

É isso, dica simples e fácil (e talvez boba), mas que me salvou um dia desses.

Simplicidade, um velho novo conhecido

Muito tem se falado do retorno da simplicidade no desenvolvimento web com Java, simplicidade esta que, diga-se de passagem, nunca deveria ter sido posta de lado da forma que aconteceu. Creio que depois do auge do evento “re-inventando a roda” onde tudo era motivo para um novo framework, e depois da descoberta de que se ater a não cometer anti-patterns é muito mais importante do que se preocupar em desenhar soluções que acumulem o máximo de patterns possíveis, os frameworks e principalmente os desenvolvedores destes estão amadurecendo o suficiente para trazer a tão afastada simplicidade de volta. Parece que a coisa está se estabilizando, menos frameworks estão sendo lançados e os existentes (e até os poucos que estão saindo) estão recebendo um forte certo apelo para a simplicidade no dia-a-dia do desenvolvedor.

Como estou sempre cheio de livros e impressos bagunçados e misturados na mochila e na estante e algumas dezenas de workspaces misturadas entre o desktop e o notebook, resolvi passar para o blog as experiências com alguns frameworks Web que andei estudando e que trazem bastante simplicidade de volta, de onde nunca deviam ter saído. Irei pela ordem:

Comecei com o RIFE há bastante tempo, bem antes de pensar em escrever este post, quando ainda estava lendo a respeito do uso de Continuations. O RIFE não é um framework com a mesma proposta do Wicket ou Waffle (os próximos), ele na verdade é um approach para Ruby on Rails, mas que não deixa de ser uma proposta para simplicidade e produtividade =)

Depois passei para o Apache Wicket, neste aqui tentarei passar mais tempo, pois foi o que mais me chamou a atenção e o que eu mais gostei por diversos motivos que falarei no post sobre Wicket.

O Wicket foi incubado na Apache e em pouco tempo conseguiu ser “promovido” ao top level dos projetos, ficando agora no mesmo nível de Struts, Tomcat, Jakarta, o HTTP Server e muitos outros, vale a pena dar uma olhadinha.

E por último (pelo menos por enquanto) o Waffle, da Codehaus, onde o pessoal da Caelum tem colaborado. Com este ainda não consegui fazer muita coisa, então, certamente será o último post da série que irei apresentar.

Neste final de semana começarei então os posts com os exemplos de aplicação (para aprendizado) com o Wicket e RIFE, espero poder colocar uma a cada dia. Talvez a aplicação com Waffle demore dois dias ou três dias, o que pode fazer com que a análise comparativa de todas as aplicações saia só no próximo final de semana.

Get Adobe Flash playerPlugin by wpburn.com wordpress themes