Symfony2,如何在不使用缓存的情况下加载CSS文件

3

目前我正在设计基于Symfony2的网站,问题是如何禁用CSS文件的缓存?现在,如果我更改CSS文件中的内容-浏览器中什么都不会改变。当我尝试进行cache:clear时-仍然没有改变。

config.yml

# Assetic Configuration
assetic:
debug:          "%kernel.debug%"
use_controller: true
#bundles:        [ ]
#java: /usr/bin/java
filters:
    cssrewrite: ~
    #closure:
    #    jar: "%kernel.root_dir%/Resources/java/compiler.jar"
    yui_css:
        jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"

twig 中:

    {% stylesheets filter="cssrewrite" output="css/general.css"
        "@EveCommonBundle/Resources/public/css/main.css" 
        "@EveCommonBundle/Resources/public/css/another.css" %}
    <link rel="stylesheet" type="text/css" href="{{ asset_url }}" />
    {% endstylesheets %}

我该如何才能在浏览器中获取“最新”的CSS文件?
问题是,当我更改@EveCommonBundle/Resources/public/css/main.css文件时,web/css目录下仍然存在旧文件(由终端命令生成),并且没有被重新创建,这就是为什么浏览器不显示“新更改”的原因。我只能通过终端重新创建该文件... 如何在每次刷新浏览器时(在web/css文件夹中)让sf2重新创建CSS文件呢?
4个回答

4
在你的开发环境中,也就是通过app_dev.php访问你的网站时,资源路径是动态生成的,因此每个更改都应该立即可见。你可以使用以下命令自动创建资产(有关详细信息,请参阅下面的链接),但一般情况下这不是必需的。
php app/console assetic:dump --watch

当使用assetic并且想要在生产环境中看到更改时,您需要首先转储资产以使其可访问:

php app/console assetic:dump --env=prod --no-debug

如需更多信息,请阅读食谱中的 How to use Assetic for Asset Management 章节中的Dumping Asset Files部分。

如果其他方法都失败了,您可能想在模板中使用以下内容:

{% if app.environment == 'prod' %}{% else %}{% endif %}

仅在生产环境下使用assetic。


如果您正在使用开发环境,且资产未能自动刷新,那么很可能是缓存问题。您是否检查了响应头?您尝试过使用ctrl+shift+r重新加载页面(忽略缓存)吗? - dbrumann
"php app/console assetic:dump --env=prod --no-debug" 这将会生成并写入每个所需的文件(例如/js/abcd123.js)。如果您更新了任何资产,您需要再次运行此命令以重新生成文件。http://symfony.com/doc/current/cookbook/assetic/asset_management.html#cookbook-assetic-dumping =\ - user1954544
你尝试过使用ctrl+shift+r(忽略缓存)重新加载页面了吗? -- 没有,文件还是一样的。 - user1954544
问题在于当我更改"@EveCommonBundle/Resources/public/css/main.css"时,web/css文件夹中仍然保留旧的文件(由终端转储),并且没有被重新创建,这就是为什么浏览器中没有显示“新更改”的原因,而我只能通过终端重新创建该文件...如何让sf2在每次F5刷新浏览器时重新创建css文件(在web/css文件夹中)? - user1954544
我遇到了与OP相同的问题。你声称app_dev.php可以立即显示所有更改,但这在一般情况下是错误的。对于Bundles内部的CSS资源而言,这只适用于web\resources\css\style.css - Timwi
显示剩余2条评论

4

问题是...嗯,不知道具体是什么。 当前的config.yml和控制台命令已经完成了它们的工作。(这意味着无论我在CSS中做出哪些更改,都会在浏览器中显示为“在线模式”)

assets:install web --symlink
assetic:dump web

config.yml文件中的部分内容

# Twig Configuration
twig:
    cache:            false

# Assetic Configuration
assetic:
    assets: 
        default_css:
            inputs:
                - '%kernel.root_dir%/Resources/public/css/default.css'

    debug:          "%kernel.debug%"
    use_controller: true
    bundles:        []
    #java: /usr/bin/java
    filters:
        cssrewrite: ~

还有一些帮助(也许,不确定)

// If you don't want to setup permissions the proper way, just uncomment the following PHP line
// read http://symfony.com/doc/current/book/installation.html#configuration-and-setup for more information

umask(0000);

在Twig中,它看起来像这样:
{% stylesheets "@default_css" filter="cssrewrite" %}
    <link href="{{ asset_url }}" type="text/css" media="all" rel="stylesheet" />
{% endstylesheets %}   

使用这组参数,我可以在浏览器中即时创建、编辑、删除CSS数据并立即显示。
附注:我展示了一段"不常见"的代码,其他配置文件中的设置我认为与基础设置相同。

1
缓存是标准浏览器行为。您可以每次手动清除它,或设置缓存清单:https://developer.mozilla.org/en-US/docs/HTML/Using_the_application_cache?redirectlocale=en-US&redirectslug=Offline_resources_in_Firefox。但这只适用于HTML5,并非在所有地方都得到支持。
禁用文件缓存的简单方法是每次更改文件时更改URL:您可以将随机字符串或版本号附加到href中:
<link rel="stylesheet" type="text/css" href="{{ asset_url }}?{{some_random_string_goes_here}}=0" />

or

<link rel="stylesheet" type="text/css" href="{{ asset_url }}?VERSION={{version_number}}" />

随机字符串更适用于调试,因为你不需要每次更改CSS时手动更新版本号。但是,根据字符串的大小,你可能会不幸地得到相同的字符串两次...

{% stylesheets '@EveCommonBundle/Resources/public/css/*' %} <link rel="stylesheet" type="text/css" href="{{ asset_url }}?version={{ random() }}" /> {% endstylesheets%} 没有任何变化 =
我知道浏览器缓存的问题,但这不是它,sf2只是使用“旧编译的CSS文件”,而不是重新创建新的。
- user1954544
嗯,我猜你正在使用sass,这似乎是一个已知的问题:https://github.com/symfony/symfony/issues/5713。我在stakcoverflow上找到了另一篇帖子,可能会对你有所帮助:https://dev59.com/KWgu5IYBdhLWcg3wTVc6 - Alexandre de Champeaux

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接