Chaque fois que je mets à jour mes fichiers css ou js dans infoweb\menu\module\assets, je dois vider le dossier backend\web\assets
Y at-il un moyen de vider automatiquement le cache des actifs?
Ajoutez ceci dans votre vue:
use vendor\myVendorName\myPackageName\assets\AppAsset;
AppAsset::register($this);
Ajoutez ceci dans votre configuration:
'components' => [
'assetManager' => [
'linkAssets' => true,
],
]
Vider le dossier des ressources et actualiser, c'est terminé
il y a des biens supplémentaires comme
if (YII_ENV_DEV) {
...;
...;
...;
$config['components']['assetManager']['forceCopy'] = true;
...;
...;
}
pour publier des fichiers même là sont publiés avant
Si vous développez votre propre plug-in, vous pouvez forcer la publication d'actifs par groupe .__ (note: $ sourcePath doit être défini)
<?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,
];
}
Si votre environnement est en production, je vous recommande d’utiliser Cache Busting :
return [
// ...
'components' => [
'assetManager' => [
'appendTimestamp' => true,
],
],
];
pour plus d'informations sur les actifs, lisez la Documentation Actifs Yii2 .
AssetManager créera un hachage basé sur l'heure de modification du fichier. L'heure de modification d'un répertoire ne change pas lorsqu'un fichier est modifié. Si vous avez un AssetBundle dont le répertoire est le $sourcePath
, l'heure de modification du répertoire est utilisée, le hachage ne changera pas et rien ne sera copié dans le répertoire web/assets
.
Je suggère de remplacer AssetManager::hash()
dans une sous-classe ou d'écrire une fonction pour 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
}
],
]
Pour un exemple de mise en œuvre permettant de trouver la date de modification maximale sur tous les fichiers d'actif d'un ensemble, vous pouvez consulter ce commentaire de wookie @ http://php.net/manual/en/function.filemtime.php#35779
Notez que la modification de tout fichier d'actif créera un nouveau répertoire dans web/assets
et qu'un nettoyage régulier restera nécessaire. Cependant, mis à part le cache du navigateur, l'actualisation de la page suivra les dernières modifications.
Je configure le assetManager::forceCopy=true
dans main-local.php pour l'environnement dev, comme ceci
return [
'components' => [
...
'assetManager' => [
'forceCopy' => true,
]
...
],
];
J'utilise la méthode CClientScript::registerScriptFile
dans mes fichiers de vue:
Yii::app()->clientScript->registerScriptFile(
$this->getAssetsBase() . '/js/script.js'
);
Si j'ai modifié script.js, après le rechargement de la page suivante, je verrai tous les changements
Pour les fichiers CSS - CClientScript::registerCssFile
Yii::app()->clientScript->registerCssFile(
$this->getAssetsBase() . '/css/style.css'
);
UPDATE: si vous utilisez la version bêta 2.0 de yii, vous pouvez lire des informations sur les changements de mécanique des assistants client ici: link