クライアント側でCSSキャッシュを強制的にフラッシュするにはどうすればよいですか?


61

モジュールの多くの機能(テンプレート、レイアウト、CSS)を変更し、これらの変更を本番サイトに移動するとしますが、多くのお客様がブラウザーにCSSをキャッシュしているとします。そこで質問があります。クライアントのCSSキャッシュを強制的にフラッシュし、ファイルの名前変更を回避する方法(styles.css-> styles-v2.css)。1つの論理的な方法がありますが、Magentoでは機能しません。既存のファイルをチェックするためです(この方法はJSファイルに対して機能します)。以下を参照してください。

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

何か案は?

回答:


37

これに対処する1つの方法は、CSSのマージを有効にすることです。次に、キャッシュをクリアするだけで、新しいファイル名で新しいマージファイルが作成されます。

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

私の知る限り、マージされたCSSファイルのハッシュコードは、基になるファイルが変更されても同じままです。新しいファイルがマージされたファイルのセットに追加された場合にのみ、ハッシュが変更されます。-@Alex

これに対処する別の方法は、layout.xmlを使用する代わりに、

ちょうどあなたにそれらを置きます page/html/head.phtml

または<style>、バージョン番号のタグを含むブロックを作成し、それを頭のXMLに配置して、特定のページのみにロードし、XMLレイアウトの使用に固執するようにします。


10
私の知る限り、マージされたCSSファイルのハッシュコードは、基礎となるファイルが変更されても同じままです。マージされたファイルのセットに新しいファイルが追加された場合のみ、ハッシュが変更されます。
アレックス

@Alexはそれを知りませんでした、理にかなっています。
リックカイパーズ

4
最近これを見たことはありませんが、過去に異なるページに異なるCSS / JSをロードすると、CSS / JSのコンパイルが実際にサイトに余分な「重み」を追加するようです。独自のスクリプトセットごとに異なるコンパイルバージョンを作成しました。これは、コンパイルされる大きなファイルが本質的に複数回ダウンロードされることを意味します。
ピーターオキャラハン

@cags-はい、基本的に、これらの条件下では、すべてのCSS / JSファイルを1回ダウンロードすることを縮小して許可することが、動作する唯一の速度強化です。
フィアスコラボ

Magento 1.9.2.1
Goose


10

github 'Magento Cachebuster'には、まさにこれを行う無料の拡張機能があります。再

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

このモジュールは、ファイルのタイムスタンプをファイル名に追加することにより、Magentoが静的ファイル用に作成したURIを自動的に変更することにより、キャッシュ無効化を提供します。

変更前:http : //www.example.com/js/varien/js.js変更 後:http : //www.example.com/js/varien/js.1324429472.js


2
このモジュールは、応答ごとにHTMLを解析してタイムスタンプを追加します。これにより、パフォーマンスが低下する可能性があります。github.com/fbrnc/Aoe_JsCssTstampはより高性能な方法で同じことを行いますが、それを実現するためにデザインパッケージモデルを書き換える必要がありますが、Cachebusterはオブザーバーのみを使用します。
ファビアンシュメングラー

10

これには、独自の拡張機能Speedster Advancedを使用します。しかし、基本的な原則は、マージされたcssファイルとjsファイルの名前には、最後に変更されたファイルのタイムスタンプが含まれることMage_Core_Model_Design_Package::getMergedCssUrl()です。cssファイルのいずれかを編集するたびに、新しいファイル名が作成され、ブラウザーはキャッシュバージョンを再利用する代わりに新しいファイルを要求します。ヘッドブロックがキャッシュされる可能性があるため、Magentoキャッシュの更新が必要です。


Foomanスピードスターは、私のアップは素晴らしい拡張子投票を取得
Bobadevv

8

また、cssファイルのキャッシュバスターも実装しました。私が推測する最良の方法は、Mage_Page_Block_Html_Headを拡張し、以下の関数をオーバーライドして、希望する変更で$ skinItems配列を更新することです。

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);

}

ここからインスピレーションを得ました。ソース


1
これは機能しません。スキンファイルは、追加されたクエリ文字列ではファイル名が見つからないため、常にbase / defaultにフォールバックします。
BlueC

あなたのコメント「クエリ文字列が付加されたファイル名は見つかりません」、それがキャッシュを無効にし、キャッシュサーバーに強制的に新しいコピーを取得させることです。
アハドアリ

1
いいえ、それはまったく機能しません。$ skinItems配列内の要素の値を変更し、それらを親の_prepareStaticAndSkinElements()メソッドに返しています。この親メソッドは、変更された各アイテムでMage :: getDesign()-> getSkinUrl()を呼び出します。ファイルシステム上で?fmt = xxxが付加されたファイルを見つけることができないため、常にbase / defaultにフォールバックします。
BlueC

彼の実装については定かではありませんが、下部にあるインスピレーションは、希望通りに動作
Goose

8

プラグインを必要とせず、組み込みのMagento機能を使用するだけの簡単だが厄介な回避策があります。これ以上コードをインストールするリスクを冒すことなく、既存のサイトで迅速に行う必要がある場合に便利です。

考えは、マージされたCSSシステムを使用して、キャッシュ無効化ファイル名を生成できるということです。

マージされたCSSファイル名は一緒にマージされたすべてのファイルのハッシュなので、名前の日付スタンプを付けてテーマに追加の空のcssファイルを追加するだけです。

そう:

  1. [構成]> [詳細]> [開発者]で[CSSファイルのマージ]をオンにします。
  2. テーマレイアウトで、CSSファイルをヘッドに追加する場所(通常はpage.xml)を見つけ、余分なスタイルシートファイルを追加します。名前が一意である限り、任意の名前を付けます。 <action method="addCss"><stylesheet>css/cachebust_091014.css</stylesheet></action>
  3. スキンCSSフォルダーに、その名前で新しいcssファイルを作成します。ファイルの内容については、ファイルの目的を示すコメントを追加します

ライブをプッシュしてmagentoキャッシュをフラッシュすると、マージされたcssファイルの名前が変わり、キャッシュが無効になります!

キャッシュを無効化するたびにそのファイル名を変更する必要があるため面倒ですが、Magento機能に組み込まれている以外に何も必要ないので、立ち往生してすぐに修正する必要がある場合に便利です!


7

=>このコードを使用する代わりに:

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

=>このコードを使用してみてください:

<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>

しかし、それはあまり良くありません...


興味深いアイデア:)
ニック

これは、短期チェックのための優れたアイデアです。
ジェイエルカーケ

4

XMLレイアウトのすべてのCSSとJSの最後にクエリ文字列を追加するモジュールを見つけました。クエリ文字列は管理者から設定可能です。

https://github.com/mklooss/Loewenstark_Head

基本的な考え方は_prepareStaticAndSkinElements、以下に示すモジュールで行われるように、オーバーライドしてクエリ文字列を含めることです。

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

あなたの質問で提案された解決策を理解したら、コアファイルにわずかな変更を加えてそれを行うことができます(実際にコアファイルを編集しないでください):

Mage / Page / Block / Html / Head.php

?v = 1のようなものを198行目に追加して、すべてのcssファイルに以下を追加します。

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


2

このための無料のモジュールを作成しました:

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

期待どおりに動作しない場合はお知らせください。連結ファイルの1つのコンテンツが変更された場合に、jsファイルとcssファイルを組み合わせたハッシュが異なるハッシュになるように作成しました。デフォルトでは、Magentoは、含まれているファイルの1つのファイル名が変更された場合にのみ、結合されたファイルのハッシュを変更します。

更新

また、私はそれを信じているあなたのために無料でシンプルな縮小モジュールを作りました。

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


このモジュールは機能していません...
SIBHI S

2

Fabrizio Brancaによって作成された、本当に興味のあることを正確に実行する素晴らしいモジュールがあります。これはAOE_JsCSSTStampと呼ばれます。それは何ですか?CSSリソースとJSリソースの両方にタイムスタンプを追加します。CSS / JSキャッシュをフラッシュすると、タイムスタンプが再作成されます。

ブラウザには異なるファイル名が表示されます。そのため、リソースが再度ダウンロードされ、ブラウザにキャッシュされるのではなく、最新のものが提供されます。


1

ただ、この方法で編集getCssJsHtmlMage_Page_Block_Html_Headを、CSSの編集後数日間は、このような文字列を追加し、それがすべてです...それは単に動作します

// 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

数年後、ファイルをマージせず、簡単な便利な拡張子を見つけられなかったので、自分で作成しました。主なアイデアは、キャッシュをフラッシュした後、タイムスタンプを更新することです。つまり、一部を変更するとcss/js、キャッシュをフラッシュするだけでタイムスタンプが更新されます。

ソースコードはこちら-> https://github.com/archonkulis/ANSolutions_CssJsTimestamp

上の作品1.9+バージョン。ただし、古いバージョンについてはわかりませんが、ほとんどの場合同様に機能するはずです。


-2

新しい名前(themev2)でテーマのコピーを作成します-スキンとアプリ/デザインなどの両方。次に、管理者で新しいテーマを選択します。


いいえ、あなたはそれを決してしません。それは本当に悪い方法です
マリウス

何故なの?このようにして、新しいバージョンで何か問題が発生した場合、すぐに古いバージョンに戻ることができます。長いブラウザキャッシュ時間やCDNを使用してcss(およびフラッシュ/無効化が必要なjs)を提供している場合、これがはるかに簡単な方法です。
フィル・リー

何か問題が発生した場合は、別の(古い)ファイル名を含める必要があるため、ロールバックします。したがって、構成(パッケージ/テーマとして読み取る)を変更する必要はありません
Fabian Blechschmidt 14

展開の方法がわかりませんが、この方法では、パッケージ/テーマの値を変更するか、インストール時に値を更新するスクリプトを作成するまで、古いテーマフォルダーを保持する必要があります。また、異なる期間に異なるテーマが設定されている場合、影響を受ける可能性があります。大量のファイルを複製するのは、ボットが最も簡単な方法です。たとえば、これをインストールする場合:github.com/jreinke/magento-suffix-static-filesははるかに簡単です。あなたがしなければならないのは、各展開後にバックエンドで数字を変更するだけです。
マリウス

そんなことを考えないでください!
リントジョージ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.