wake-up-neo.net

Yii2 Assets leeren den Cache

Jedes Mal, wenn ich meine CSS- oder JS-Dateien in Infoweb\menu\module\assets aktualisiere, muss ich den Backend\web\assets-Ordner leeren
Gibt es eine Möglichkeit, den Cache der Assets automatisch zu löschen?

27
Ruben

Fügen Sie dies Ihrer Ansicht hinzu:

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

Fügen Sie dies in Ihrer Konfiguration hinzu:

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

Leeren Sie den Ordner für die Assets und aktualisieren Sie ihn

14
Ruben

es gibt zusätzliche eigenschaften als 

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

dateien zu veröffentlichen, auch da vorher veröffentlicht

15
Denis Rudov

Wenn Sie ein eigenes Plugin entwickeln, können Sie Publizierungsassets für jedes Bündel erzwingen. (Hinweis: $ sourcePath sollte festgelegt werden)

<?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

Wenn Sie in der Produktion sind, empfehle ich die Verwendung von Cache Busting :

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

weitere Informationen zu Assets finden Sie in der Dokumentation Assets Yii2 .

6
Brand Guy

Der AssetManager erstellt basierend auf der Änderungszeit der Datei einen Hash. Die Änderungszeit eines Verzeichnisses ändert sich nicht, wenn eine Datei geändert wird. Wenn Sie ein AssetBundle mit einem Verzeichnis als $sourcePath haben, wird die Änderungszeit des Verzeichnisses verwendet, der Hash ändert sich nicht und nichts wird in das web/assets-Verzeichnis kopiert. 

Ich schlage vor, AssetManager::hash() in einer Unterklasse zu überschreiben oder eine Funktion für AssetManager::$hashCallback zu schreiben: 

'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
        }
    ], 
]

Eine Beispielimplementierung zum Ermitteln des maximalen Änderungsdatums über alle Asset-Dateien in einem Bundle finden Sie in diesem Kommentar unter wookie @ http://php.net/manual/de/function.filemtime.php#35779 .

Beachten Sie, dass durch die Änderung einer Asset-Datei ein neues Verzeichnis in web/assets erstellt wird und eine regelmäßige Bereinigung erforderlich ist. Wenn Sie den Browser-Cache jedoch nicht verwenden, wird die Aktualisierung der Seite den neuesten Änderungen folgen.

1
marvin_x

Ich konfiguriere den assetManager::forceCopy=true in main-local.php für die Entwicklungsumgebung wie folgt

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

Ich verwende CClientScript::registerScriptFile in meinen Ansichtsdateien:

Yii::app()->clientScript->registerScriptFile(
    $this->getAssetsBase() . '/js/script.js'
);

Wenn ich script.js geändert habe, sehe ich nach dem Neuladen der nächsten Seite alle Änderungen

Für CSS-Dateien - CClientScript::registerCssFile

Yii::app()->clientScript->registerCssFile(
    $this->getAssetsBase() . '/css/style.css'
);

UPDATE: Wenn Sie die Beta 2.0 von yii 2.0 verwenden, können Sie hier einige Informationen über Änderungen in der Funktionsweise der Client-Helfer lesen: link

1
itnelo
Sudo rm -rf frontend/web/assets/*
Sudo chmod 777 frontend/web/assets
./yii cache/flush-all

Wenn das nicht funktioniert:

Sudo rm -rf vendor/*
composer install
1
Andrey Bessonov