Каждый раз, когда я обновляю свои файлы css или js в infoweb\menu\module\assets, я должен очистить папку backend\web\assets
есть ли способ автоматического сброса кеша активов?
Кэш Yii2 очищает кеш
Ответ 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,
]
...
],
];