2015-09-29 5 views
12

Ich bin ziemlich neu zu Laravel 5.0, aber nicht zu PHP. Ich habe mit Elixir herumgespielt, um meine SASS zu kompilieren, Bilder aus meinem Ressourcenverzeichnis zu kopieren und sie über die Funktion mix.version auszuführen, um Zwischenspeichern zu verhindern.Cache-Busting-Bilder, die in SASS-Dateien verknüpft sind

Dies funktioniert jedoch hervorragend für CSS, Bilder und JavaScript; ist es möglich, dass Elixir auch die in meiner CSS/SASS verlinkten Bilder cachebastet? Sicher, es ist einfach genug, die Bilder zu versionieren, aber gibt es eine Möglichkeit, das CSS so anzupassen, dass es die neuen Dateinamen wiedergibt?

Ich entdeckte dies: https://github.com/trentearl/gulp-css-url-adjuster , die Sie einen Abfrageparameter an die Dateipfade in einer CSS-Datei anhängen können, so dass die Hälfte des Problems gelöst ist. Ich würde mich sehr freuen, dies zu verwenden, wenn es möglich wäre, den Abfrageparameter jedes Mal automatisch zu ändern, wenn der Schluck ausgeführt wird.

Irgendwelche Gedanken darüber, wie dies erreicht werden kann, oder wenn es überhaupt möglich ist?

Die Gründe, warum ich das tun möchte, ist, ich entwickle ständig meine App und ich benutze ein großes Sprite-Blatt, das oft neu angeordnet wird, Cache-Busting ist eine Voraussetzung, und wenn es automatisch sein könnte, wenn Schluck läuft würde das sparen Ich habe viel Zeit und Mühe.

Dank

Antwort

2

Verwenden der Antwort her m @Amo zur Inspiration, die Lösung, die ich am Ende benutzte, war ein mixin, der die unique_id() Funktion verwendet, um einen zufälligen Wert zu erzeugen. Dies vermeidet, eine benutzerdefinierte SASS Funktion zu definieren, so dass es einfacher ist und @ @ Amelia wies darauf hin, ein bisschen sauberer auch.

Die mixin

@mixin background-cache-bust($url) { 
    background-image: #{'url('} + $url + #{'?v='} + unique_id() + #{')'}; 
} 

Beispiel

.sprite { 
    @include background-cache-bust('/build/images/common/sprite.png'); 
} 

Ergebnis

.sprite { 
    background-image: "url(/build/images/common/sprite.png?v=u95ab40e0)"; 
} 
+0

Es wäre besser, den Pfad zu ändern, anstatt eine Abfragezeichenfolge zu verwenden, und den Pfad auf dem Webserver neu zu schreiben. – Hades

+1

Wie wäre das besser? Browser behandeln Abfrageparameter ohnehin als eine andere URL. Das Ändern des Pfades und das Neuschreiben über den Server erzeugt eine zusätzliche Komplikationsstufe, die mit Sass alleine nicht erreicht werden kann. – AJReading

+2

Die Query-String-Methode ist nicht die am besten akzeptierte Methode für Cache-Busting und kann unter bestimmten Umständen fehlschlagen. Einige Browser sehen keine andere Abfragezeichenfolge als eine andere Datei und einige Software (ich habe gehört: Squid) werden keine Dateien mit Abfragezeichenfolge zwischenspeichern. Mit der Query-String-Methode verhindern Sie auch, dass Web-Server wie IIS ETag-Header bereitstellen, die es den Browsern ermöglichen, nach der Cache-Gültigkeit zu suchen, anstatt sich ausschließlich auf Ablaufdatum/-zeiten zu verlassen. – Hades

3

Wie Sie SASS verwenden, ist es möglich, eine benutzerdefinierte Variable in der SASS Dateien zu definieren, die für den Cache verwendet werden könnten, Zerschlagung und dann diese Variable auf ein beliebiges Bild URL-Pfade anhängen.

Die Variable muss nur einen Verweis auf den aktuellen Zeitstempel enthalten.

Um dies zu tun, werden Sie zu create a new function in SASS benötigen einen Zeitstempel zu belichten, die wie folgt durchgeführt werden kann:

module Sass::Script::Functions 
    def timestamp() 
     return Sass::Script::String.new(Time.now.strftime("%Y%m%d%H%M")) 
    end 
end 

Dann Sie den Zeitstempel zugreifen können wie folgt:

$cacheVersion = timestamp() 

.someClass { 
    background-image: url('your/path/file.jpg?cacheversion='$cacheVersion); 
} 

Wenn kompiliert, wird dies etwas wie produzieren:

.someClass { 
    background-image: url('your/path/file.jpg?cacheversion=201510091349'); 
} 
+2

Wahrscheinlich besser machen funktioniert hier eine mixin und Rückkehr der angegebene Link als 'URL ($ link? v = $ timestamp) ' – Amelia

+0

Das ist eigentlich eine gute Idee. Ich habe dies als ein Problem angesprochen, das ich mit 'elixir' oder' gulp' lösen könnte, aber tatsächlich würde ein Zeitstempel bedeuten, dass es sich jedes Mal ändert, wenn das SASS kompiliert wird (was während der Entwicklung viel passieren würde), aber es wäre nicht wirklich wichtig Sobald die neuesten Änderungen in ihrer Umgebung implementiert sind. – AJReading

0

Ich bin mit großen Schluck-Sass und @AJRead mixin ing nicht concantenate Zeichenfolge richtig, die kompiliert:

background-image: url(+ "$url" + ?v= + u2f58eec1 +); 

Hier ist, was in meinem Fall

Mixin

@mixin background-cache-bust($url) { 
    background-image: unquote('url(' + $url + '?v=' + unique_id() + ')'); 
}