Como forçar a descarga do cache CSS no lado do cliente?


62

Suponha que alteramos muitas funcionalidades do módulo (modelos, layouts, CSS) e vamos mover essas alterações para o site de produção, mas muitos clientes armazenaram o CSS em cache em seus navegadores. Então aqui está uma pergunta. Como forçar a descarga do cache CSS do cliente e evitar a renomeação de arquivos ( styles.css-> styles-v2.css). Existe uma maneira lógica, mas ela não funciona no Magento, porque verifica o arquivo existente (pela maneira como esse método funciona para arquivos JS), veja abaixo:

<action method="addCss">
    <stylesheet>css/styles.css?1</stylesheet>
</action>  

Alguma ideia?

Respostas:


37

Uma maneira de lidar com isso é permitir a mesclagem de CSS. Em seguida, basta limpar o cache e um novo arquivo mesclado será criado com um novo nome de arquivo.

System -> Configuration -> Developer -> CSS settings -> Merge CSS Files

Até onde eu sei, o código de hash do arquivo CSS mesclado permanece o mesmo, mesmo que os arquivos subjacentes tenham sido alterados - somente se novos arquivos forem adicionados ao conjunto de arquivos mesclados, o hash será alterado. - @Alex

Outra maneira de lidar com isso é em vez de usar o layout.xml,

basta colocá-los no seu page/html/head.phtml

Ou crie um bloco que contenha uma <style>tag com o número da versão e coloque-o no XML em sua cabeça para que você possa carregá-lo apenas em páginas específicas e continuar usando os layouts de XML.


10
Até onde eu sei, o código de hash do arquivo CSS mesclado permanece o mesmo, mesmo que os arquivos subjacentes tenham sido alterados - somente se novos arquivos forem adicionados ao conjunto de arquivos mesclados, o hash será alterado.
23413 Alex

@ Alex não sabia disso, faz sentido.
Rick Kuipers

4
Eu não olhei para isso recentemente, mas no passado a compilação de CSS / JS parece realmente adicionar 'peso' adicional ao seu site se você carregar CSS / JS diferente em páginas diferentes. Ele criou uma versão compilada diferente por conjunto exclusivo de scripts. Isso significa que arquivos maiores compilados são basicamente baixados várias vezes.
Peter O'Callaghan

@cags - Sim, basicamente, nessas condições, reduzir e permitir que todos os arquivos CSS / JS sejam baixados uma vez é o único aprimoramento de velocidade que funciona.
Fiasco Labs

Isto às vezes pode mudar o comportamento CSS, pelo menos para mim em Magento 1.9.2.1
Goose

19

Você pode usar o Módulo OpenSource Aoe_JsCssTstamp, que adiciona informações de registro de data e hora aos arquivos CSS mesclados. Os carimbos de data e hora para arquivos CSS simples (não mesclados) ainda não são suportados, mas isso seria fácil de implementar.


10

Existe uma extensão gratuita no github 'Magento Cachebuster' que faz exatamente isso. É re

https://github.com/gknoppe-guidance/magento-cachebuster

O módulo fornece armazenamento em cache, alterando automaticamente o URI criado pelo Magento para arquivos estáticos, adicionando o registro de data e hora do arquivo ao nome do arquivo:

Antes: http://www.example.com/js/varien/js.js Depois: http://www.example.com/js/varien/js.1324429472.js


2
Este módulo analisa o HTML de cada resposta para adicionar os registros de data e hora, o que pode prejudicar o desempenho. O github.com/fbrnc/Aoe_JsCssTstamp faz o mesmo de maneira mais eficiente , mas precisa reescrever o modelo de pacote de design para realizá-lo, enquanto o Cachebuster usa apenas um observador.
Fabian Schmengler

10

Eu uso minha própria extensão Speedster Advanced para isso. Mas o princípio básico é que o nome dos arquivos css e js mesclados inclui o registro de data e hora do último arquivo modificado - consulte Mage_Core_Model_Design_Package::getMergedCssUrl(). Sempre que você edita um dos arquivos css, um novo nome de arquivo é criado, fazendo com que os navegadores solicitem o novo arquivo em vez de reutilizar a versão em cache. Como seu bloco principal pode ser armazenado em cache, é necessária uma atualização do cache do Magento.


Fooman Speedster tem o meu até votar grande extensão
Bobadevv

8

Também implementei um cache buster para arquivos css. A melhor maneira, eu acho, é estender Mage_Page_Block_Html_Head e percorrer a função abaixo e atualizar o array $ skinItems com as alterações desejadas.

protected function &_prepareStaticAndSkinElements($format, array $staticItems, array $skinItems, $mergeCallback = null)
{
    $designPackage = Mage::getDesign();
    //$skinItems: contains all css
    foreach ($skinItems as $params => $rows) {
        foreach ($rows as $key=>$name) {
            $file = $designPackage->getFilename($name, array('_type' => 'skin'));
            $skinItems[$params][$key] = $name . "?fmt=" . filemtime($file);
        }
    }
    return parent::_prepareStaticAndSkinElements($format, $staticItems, $skinItems, $mergeCallback);

}

Tenho a inspiração daqui. Fonte


1
Isso não funcionará, os arquivos de capa sempre voltarão à base / padrão porque o nome do arquivo não será encontrado com a cadeia de caracteres de consulta anexada.
BlueC

seus comentários "O nome do arquivo não será encontrado com a string de consulta anexada" é o que queremos e o que interrompe o cache e força o servidor de cache a buscar uma nova cópia.
Ahad Ali

1
Não, não é assim que funciona. Você está alterando os valores dos elementos na matriz $ skinItems e depois transferindo-os de volta para o método pai _prepareStaticAndSkinElements (). Esse método pai chamará Mage :: getDesign () -> getSkinUrl () em cada item modificado, que sempre retornará à base / padrão porque não pode localizar os arquivos com o? Fmt = xxx anexado no sistema de arquivos.
BlueC 23/09/16

Não tenho certeza sobre a sua implementação, mas a inspiração originária na parte inferior definitivamente funciona exatamente como você esperaria, github.com/mklooss/Loewenstark_Head
Goose

8

Existe uma solução alternativa simples, mas complicada, que não requer plugins e apenas utiliza recursos internos do Magento - útil se você precisar fazer isso rapidamente em um site existente sem correr o risco de instalar mais código.

A ideia é que você possa usar o sistema CSS mesclado para gerar um nome de arquivo com impedimento de cache.

Como o nome do arquivo CSS mesclado é um hash de todos os arquivos que são mesclados, basta adicionar um arquivo css em branco extra ao tema com um carimbo de data para um nome.

Assim:

  1. Ative Mesclar arquivos CSS em Configuração> Avançado> Desenvolvedor
  2. Nos layouts de seu tema, encontre onde você adiciona arquivos CSS ao cabeçalho (normalmente page.xml) e adicione um arquivo de folha de estilo extra, chame-o como quiser, desde que o nome seja único, por exemplo <action method="addCss"><stylesheet>css/cachebust_091014.css</stylesheet></action>
  3. Na pasta CSS da sua pele, crie um novo arquivo css com esse nome. Para o conteúdo do arquivo, basta colocar um comentário dizendo para que serve o arquivo

Agora empurre isso ao vivo e limpe o cache do magento, o arquivo css mesclado agora terá um nome diferente e seus caches serão eliminados!

É complicado, pois toda vez que você deseja interromper o cache, é necessário alterar o nome do arquivo, mas não requer nada além de recursos internos do Magento; portanto, é útil se você ficar preso e precisar de uma solução rápida!


7

=> Em vez de usar este código:

<action method="addCss">
    <stylesheet>css/styles.css?1</stylesheet>
</action>

=> Tente usar este código:

<reference name="head">
    <block type="core/text" name="foocss">
        <action method="setText">
            <css><![CDATA[<link rel="stylesheet" type="text/css" href="foo.css?1" media="all" />]]></css>
        </action>
    </block>
</reference>

Mas não é muito legal ...


Idéia interessante :)
Nick

Essa é uma excelente idéia para uma verificação de curto prazo.
Jay El-Kaake

4

Encontrei um módulo que anexará uma string de consulta ao final de todos os CSS e JS nos layouts de XML. A sequência de consultas é configurável a partir do administrador.

https://github.com/mklooss/Loewenstark_Head

A idéia básica é substituir _prepareStaticAndSkinElementspara incluir uma string de consulta, conforme feito no módulo, mostrado abaixo.

protected function &_prepareStaticAndSkinElements($format, array $staticItems, array $skinItems, $mergeCallback = null)
{
    $version = Mage::getStoreConfig("design/head/meta_version_tag");
    $format = sprintf($format, "%s?v{$version}", "%s");
    return parent::_prepareStaticAndSkinElements($format, $staticItems, $skinItems, $mergeCallback);
}

3

Se eu entendo a solução proposta em sua pergunta, você pode fazer isso com um leve mod para um arquivo principal ( na verdade, não edite o arquivo principal ):

Mago / Página / Bloco / Html / Head.php

Adicione algo como? V = 1 à linha 198 para que todos os arquivos css tenham este anexo:

$html .= $this->_prepareStaticAndSkinElements('<link rel="stylesheet" type="text/css" href="%s?v=1"%s />' . "\n",


2

Eu construí um módulo gratuito para isso:

http://www.magentocommerce.com/magento-connect/frontend-flush-2048.html

Informe-me se ele não funcionar conforme o esperado, mas eu o criei para que os arquivos js e css combinados tenham um hash diferente se o conteúdo de um dos arquivos concatenados for alterado. Por padrão, o Magento altera apenas o hash do arquivo combinado se o nome do arquivo de um dos arquivos incluídos tiver sido alterado.

ATUALIZAR

Também criei um módulo minify gratuito e simples para aqueles que acreditam nele.

http://www.magentocommerce.com/magento-connect/minify-7771.html


Este módulo não está funcionando ...
SIBHI S

2

Existe um módulo muito bom, criado por Fabrizio Branca, que faz exatamente o que você está interessado. É chamado AOE_JsCSSTStamp . O que faz? Ele adiciona um carimbo de data / hora nos recursos CSS e JS. Quando você libera o cache CSS / JS, os carimbos de data e hora são recriados.

O navegador verá um nome de arquivo diferente - é por isso que fará o download novamente dos recursos e será servido com o mais novo, em vez de armazenado em cache no navegador.


1

Apenas edite o método getCssJsHtml em Mage_Page_Block_Html_Head , adicione uma string como essa por alguns dias após a edição do css e é tudo ... simplesmente funciona

// static and skin css
        $html .= $this->_prepareStaticAndSkinElements('<link rel="stylesheet" type="text/css" href="%s?foo=WHAT_YOU_WANT_HERE"%s />' . "\n",
            empty($items['js_css']) ? [] : $items['js_css'],
            empty($items['skin_css']) ? [] : $items['skin_css'],
            $shouldMergeCss ? [Mage::getDesign(), 'getMergedCssUrl'] : null
        );

1

Poucos anos depois, e não encontrando nenhuma extensão útil que não mesclasse arquivos e seja simples, criei minha própria. A idéia principal é que, após liberar o cache, ele atualizará o carimbo de data / hora. Portanto, em outras palavras - quando você alterar algumas css/js, limpe o cache e o Timestamp será atualizado.

O código fonte está aqui -> https://github.com/archonkulis/ANSolutions_CssJsTimestamp

Funciona na versão 1.9+ . Não tenho certeza sobre as versões mais antigas, porém, mas provavelmente também deve funcionar.


-2

Faça uma cópia do seu tema com um novo nome (themev2) - skin e app / design, etc. Em seguida, escolha o novo tema em admin.


não, você nunca faz isso. isso é realmente uma má maneira de fazê-lo
Marius

Por que não? Dessa forma, se algo der errado com a nova versão, você poderá voltar rapidamente à versão antiga. Se você estiver usando longos tempos de cache do navegador e / ou CDNs para exibir seus css (e js que também precisam ser liberados / invalidados), essa é de longe a maneira mais fácil.
Phil Lee

Se algo der errado, você reverter, o que deve incluir outro (o velho) nome de arquivo, portanto, alterar a configuração (leia-se package / tema) não é necessário
Fabian Blechschmidt

Não sei como você faz as implantações, mas dessa forma tenho que manter a pasta antiga do tema até alterar o valor do pacote / tema ou criar um script que atualize o valor na instalação. Além disso, se eu tiver temas diferentes definidos por períodos diferentes, eles poderão ser afetados. Duplicar muitos arquivos é, de longe, o bot da maneira mais fácil. Por exemplo, instalar isso: github.com/jreinke/magento-suffix-static-files é muito mais fácil. Tudo o que você precisa fazer é alterar um número no back-end após cada implantação.
Marius

Nem pense assim!
Rinto George
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.