Cache busting images which are linked inside SASS files Cache busting images which are linked inside SASS files laravel laravel

Cache busting images which are linked inside SASS files


As you're using SASS, it's possible to define a custom variable in your SASS files which could be used for cache busting, and then append that variable to any image url paths.

The variable just needs to hold a reference to the current timestamp.

To do this, you'll need to create a new function in SASS to expose a timestamp, which can be done as follows:

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

Then you can access the timestamp as follows:

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

When compiled, this will produce something like:

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


Using the answer from @Amo for inspiration, the solution I ended up using was a mixin, which makes use of the unique_id() function to generate a random value. This avoids having to define a custom SASS function, so it's simpler and as @Amelia pointed out, a bit cleaner too.

The mixin

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

Example

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

Result

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


I'm using gulp-sass and @AJReading mixin doesn't concantenate string correctly, which compiles to:

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

Here is what works in my case

Mixin

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