web-dev-qa-db-ja.com

Yii2アセットのキャッシュのクリア

Infoweb\menu\module\assetsのcssまたはjsファイルを更新するたびに、backend\web\assetsフォルダーを空にする必要があります
資産キャッシュを自動的にクリアする方法はありますか?

28
Ruben

これをビューに追加します。

use vendor\myVendorName\myPackageName\assets\AppAsset;
AppAsset::register($this);

あなたの設定にこれを追加してください:

'components' => [
    'assetManager' => [
        'linkAssets' => true,
    ], 
]  

アセットフォルダーを空にして、更新して完了

14
Ruben

追加のプロパティがあります

if (YII_ENV_DEV) {
       ...;
       ...;
       ...;
       $config['components']['assetManager']['forceCopy'] = true;
       ...;
       ...;
 }

以前に公開されていてもファイルを公開する

15
Denis Rudov

環境が実稼働環境の場合、 Cache Busting を使用することをお勧めします。

return [
 // ...
    'components' => [
        'assetManager' => [
            'appendTimestamp' => true,
        ],
    ],
];

アセットの詳細については、 Assets Yii2 documentation を参照してください。

9
Brand Guy

独自のプラグインを開発している場合は、バンドルごとにアセットを強制的に公開できます(注:$ sourcePathを設定する必要があります)

<?php
   namespace app\components\forms\redactorAssets;

   use yii\web\AssetBundle;

   class RedactorCutAsset extends AssetBundle {
      public $sourcePath = '@app/components/forms/redactorAssets/assets';
      public $js = [
        'cut.js',
      ];
      public $publishOptions = [
        'forceCopy'=>true,
      ];
   }
8
grigson

AssetManagerは、ファイルの変更時間に基づいてハッシュを作成します。ファイルが変更されても、ディレクトリの変更時間は変わりません。 _$sourcePath_というディレクトリを持つAssetBundleがある場合、ディレクトリの変更時間が使用され、ハッシュは変更されず、_web/assets_ディレクトリには何もコピーされません。

サブクラスでAssetManager::hash()をオーバーライドするか、_AssetManager::$hashCallback_の関数を記述することをお勧めします。

_'components' => [
    'assetManager' => [
        'hashCallback' => function($path) { 
             // if: $path is directory: figure out when files were changed in directory 
             // else: use original hash function in \yii\web\AssetManager
        }
    ], 
]
_

バンドル内のすべてのアセットファイルの最大修正日を見つけるためのサンプル実装については、wookie @ http://php.net/manual/en/function.filemtimeでこのコメントを見ることができます。 .php#35779

アセットファイルを変更すると、_web/assets_に新しいディレクトリが作成され、定期的なクリーンアップが必要になることに注意してください。ただし、ブラウザのキャッシュは別として、ページを更新すると最新の変更が反映されます。

1
marvin_x

このような開発環境のmain-local.phpでassetManager::forceCopy=trueを設定します

return [
'components' => [
    ...
    'assetManager' => [
        'forceCopy' => true,
    ]
    ...
],
];
1
Paul Huo

私が使う - CClientScript::registerScriptFile 私のビューファイルのメソッド:

Yii::app()->clientScript->registerScriptFile(
    $this->getAssetsBase() . '/js/script.js'
);

Script.jsを変更した場合、次のページのリロード後にすべての変更が表示されます

Cssファイルの場合- CClientScript::registerCssFile

Yii::app()->clientScript->registerCssFile(
    $this->getAssetsBase() . '/css/style.css'
);

更新:yii 2.0ベータ版を使用する場合、クライアントヘルパーのメカニズムの変更に関する情報をここで読むことができます: link

1
itnelo
Sudo rm -rf frontend/web/assets/*
Sudo chmod 777 frontend/web/assets
./yii cache/flush-all

これが機能しない場合:

Sudo rm -rf vendor/*
composer install
1
Andrey Bessonov