Qual é a melhor maneira de versão URLs CSS e JS?

26

De acordo com as melhores práticas do Yahoo para acelerar o seu site , fornecemos conteúdo estático de uma CDN usando cabeçalhos de expiração de cache futuros. Obviamente, precisamos ocasionalmente atualizar esses arquivos "estáticos"; portanto, atualmente adicionamos uma versão infix como parte do nome do arquivo (com base na soma SHA1 do conteúdo do arquivo). Portanto:

styles.min.css

Torna-se:

styles.min.abcd1234.css

No entanto, gerenciar os arquivos com versão pode se tornar entediante, e eu queria saber se uma notação de argumento GET pode ser mais limpa e melhor:

styles.min.css?v=abcd1234

Qual você usa e por quê? Existem considerações relacionadas a navegador ou proxy / cache que devo considerar?

David Eyk
fonte
A razão pela qual pergunto é que me lembro de ter ouvido uma razão para NÃO usar o estilo de argumento GET, mas não me lembro por quê.
precisa saber é o seguinte
O uso do argumento GET não exige veiculação da folha de estilo com algum tipo de script do lado do servidor (e não seria mais estático)?
Lotus Notes
@ Lotus: Você pode enviar os argumentos GET e eles serão silenciosamente ignorados se nada estiver procurando por eles.
David Eyk

Respostas:

10

De acordo com o Make the Web Faster , do Google , as páginas com parâmetros de consulta não são armazenadas em cache por muitos proxies HTTP.

A maioria dos proxies, principalmente o Squid up pela versão 3.0, não armazena em cache os recursos com um "?" no URL deles, mesmo que um Cache-control: publiccabeçalho esteja presente na resposta. Para habilitar o cache de proxy para esses recursos, remova as cadeias de consulta das referências a recursos estáticos e, em vez disso, codifique os parâmetros nos nomes dos arquivos.

Assim styles.min.abcd1234.cssé a solução preferida. Você pode usar um mecanismo de reescrita de URL apropriado para se tornar styles.min.abcd1234.csso mais fácil de implementar de forma styles.min.css?v=abcd1234transparente.

Se você suporta apenas HTTPS, esse conselho não se aplica, porque os proxies normalmente não podem armazenar em cache as páginas que são veiculadas por SSL.

Till Ulen
fonte
2
Gostaria de saber se as informações sobre cache de string de consulta e servidores proxy estão um pouco datadas? Os documentos do Google não fazem mais referência a cadeias de consulta e servidores proxy nesse contexto. Embora os exemplos ainda envolvam a alteração do próprio nome do arquivo. O Squid 2.7 (2008) e 3.1 (2010) supostamente suportam o cache de strings de consulta por padrão, e versões anteriores podem ser configuradas para oferecer suporte a isso.
MrWhite
15

Usando o controle de versão no estilo GET, a partir de um cache em branco, vários URLs - por exemplo, style.css?v=123e style.css?v=456- retornariam o mesmo conteúdo. No entanto, não vejo como isso seria problemático, especialmente porque você vincularia apenas um por vez.

Acho que você achará o estilo GET muito mais fácil de manter. Você não precisa de arquivos separados: basta alterar o URL e os navegadores buscarão o CSS novamente.

ATUALIZAÇÃO: em pesquisas adicionais, parece que o uso de uma string de consulta pode impedir que os navegadores armazenem em cache os arquivos. No entanto, se você estiver retornando cabeçalhos adequados, Expiresisso não é um problema.

ATUALIZAÇÃO 2: a resposta aceita indica que alguns proxies não armazenam em cache arquivos com uma sequência de consultas. No entanto, isso é baseado em informações antigas; o problema específico que eles mencionam no Squid foi corrigido há 7 anos. Webs impressionantes escreveram bem sobre isso.

DisgruntledGoat
fonte
Essa é a ressalva que eu estava tentando lembrar. Obrigado pelo link.
10139 David David Eyk
1

Ambos funcionarão igualmente bem, pois uma string de consulta é considerada parte da URL e, alterando-a, você efetivamente altera o nome do recurso, fazendo com que o navegador obtenha uma nova cópia do arquivo.

Eu digo usar qualquer método que seja mais fácil para você manter.

John Conde
fonte
0

isso não é uma resposta para a pergunta acima , quero uma solução melhor, então estou perguntando aqui

Ambos os métodos exigiriam modificação nos arquivos onde os arquivos css e js são referidos. Portanto, seria necessário reiniciar o servidor de aplicativos após fazer as alterações.

Existe uma maneira melhor de lidar com a versão de arquivos estáticos sem precisar reiniciar o servidor de aplicativos?

o seguinte é descartado na solução

  • alterando os nomes de arquivos css e js
  • passando um parâmetro de consulta no URL

a solução também não deve afetar a configuração do controle de cache ou expira.

obrigado

Santhosh S
fonte
11
parece que você é novo aqui. Essa é uma boa pergunta. Você deve publicá-lo como tal, talvez ligando de volta a esta pergunta para referência. Sinalizei isso para atenção do moderador, para que eles possam ajudá-lo.
precisa saber é o seguinte
como David apontou, este site não é como outros sites de fórum. Se você tem uma nova pergunta a fazer, fique à vontade para clicar no botão "pedir um botão pergunta"
Mark Henderson
Este é um esclarecimento útil. Se você alterar sua folha de estilo, seria preferível manter o nome e a referência iguais, em vez de atualizar centenas de referências a ela no site.
Mark Stosberg