Подтвердить что ты не робот

Кэш Yii2 очищает кеш

Каждый раз, когда я обновляю свои файлы css или js в infoweb\menu\module\assets, я должен очистить папку backend\web\assets
есть ли способ автоматического сброса кеша активов?

4b9b3361

Ответ 1

Добавьте это в ваш взгляд:

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

Добавьте это в свою конфигурацию:

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

Пустая папка с ресурсами и обновление, выполненное

Ответ 2

существует дополнительное свойство как

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

чтобы публиковать файлы, даже опубликованные до

Ответ 3

Если вы разрабатываете свой собственный плагин, вы можете принудительно опубликовать активы на пакет (примечание: $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,
      ];
   }

Ответ 4

Если вы работаете в области разработки, я рекомендую использовать Cache Busting:

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

для получения дополнительной информации об активах, прочитайте Документация по активам Yii2.

Ответ 5

Я использую 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'
);

UPDATE: если вы используете бета-версию yii 2.0, вы можете прочитать некоторую информацию об изменениях в механике клиентских помощников здесь: link

Ответ 6

AssetManager создаст хэш на основе времени изменения файла. Время изменения каталога не изменяется при изменении любого файла. Если у вас есть AssetBundle с каталогом как $sourcePath, используется время модификации каталога, хеш не изменится, и ничего не будет скопировано в каталог 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, и регулярная очистка останется необходимой. Однако кеширование браузера, обновление страницы будет следовать последним изменениям.

Ответ 7

Я настраиваю assetManager::forceCopy=true в main-local.php для среды dev, такой как

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