缓存在SASS文件中链接的破坏图像

AJR*_*ing 12 css sass laravel gulp laravel-elixir

我对Laravel 5.0很新,但不是PHP.我一直在玩Elixir来编译我的SASS,从我的资源目录中复制图像并通过该mix.version函数运行它们以防止缓存.

这适用于CSS,图像和JavaScript; 有没有可能让Elixir缓存 - 破坏我的CSS/SASS中链接的图像?当然,它很容易对图像进行版本控制,但有没有办法调整CSS以反映新的文件名?

我发现了这个:https://github.com/trentearl/gulp-css-url-adjuster ,它允许您将查询参数附加到CSS文件中的文件路径,这样就解决了问题的一半.如果每次gulp运行都可以自动更改查询参数,我会很高兴使用它.

有关如何实现这一目标的任何想法,或者是否有可能实现?

我想这样做的原因是我不断开发我的应用程序,我使用一个大的精灵表,经常重新安排,缓存清除是一个要求,如果它可以自动当吞咽运行,这将节省我很多时间和精力.

谢谢

AJR*_*ing 4

使用 @Amo 的答案作为灵感,我最终使用的解决方案是 a mixin,它利用该unique_id()函数生成随机值。这避免了必须定义自定义SASS函数,因此它更简单,并且正如@Amelia 指出的那样,也更干净一些。

混音

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

例子

.sprite {
    @include background-cache-bust('/build/images/common/sprite.png');
}
Run Code Online (Sandbox Code Playgroud)

结果

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

  • 这怎么会更好呢?浏览器无论如何都会将查询参数视为不同的 URL。通过服务器更改路径和重写会产生额外的复杂性,这是单独使用 Sass 无法实现的。 (2认同)
  • 查询字符串方法不是缓存清除的最佳接受实践,并且在某些情况下可能会失败。某些浏览器不会将不同的查询字符串视为不同的文件,并且某些软件(我听说:Squid)不会缓存带有查询字符串的文件。此外,使用查询字符串方法可以防止 IIS 等 Web 服务器提供 ETag 标头,从而允许浏览器检查缓存有效性,而不是仅仅依赖过期日期/时间。 (2认同)