web-dev-qa-db-fra.com

Yii2 actifs effacer le cache

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?

27
Ruben

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é

14
Ruben

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

15
Denis Rudov

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,
      ];
   }
7
grigson

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 .

6
Brand Guy

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.

1
marvin_x

Je configure le assetManager::forceCopy=true dans main-local.php pour l'environnement dev, comme ceci

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

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

1
itnelo