it-roy-ru.com

Yii2 активы очистить кеш

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

27
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

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

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

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

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

6
Brand Guy

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

1
marvin_x

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

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