3

我正在尝试使用 Symfony2 构建一个项目,并包括所有可能的优化。其中之一是优化 html 中使用的图像。Symfony2 有一个 Assetic 包,它允许使用来自 Twig 模板的例如 optipng 来实现这一点。文档在这里:http ://symfony.com/doc/2.0/cookbook/assetic/jpeg_optimize.html

我遇到的问题是一切都在开发环境中工作(所有资产都通过控制器提供服务),但是 CLI 命令转储到文件中,而不是在呈现的模板中使用。

这是转储资产时的输出,文件随后在 /web/assetic 中可用

Dumping all prod assets.
Debug mode is off.

[file+] /home/projects/dashboard/data/dashboard/app/../web/js/4a3b4dc.js
[file+] /home/projects/dashboard/data/dashboard/app/../web/css/9640074.css
[file+] /home/projects/dashboard/data/dashboard/app/../web/assetic/1d666d2.png
[file+] /home/projects/dashboard/data/dashboard/app/../web/assetic/dfaa6c9.png
[file+] /home/projects/dashboard/data/dashboard/app/../web/assetic/5f2dd31.png

当我查看页面时,这些 url 被称为

<img src="/assetic/ad39e3f.png">
<img src="/assetic/69fbd4a.png">
<img src="/assetic/e4a4ede.png">

然而,Css 和 js 确实有效。

我的配置文件:

# Assetic Configuration
assetic:
    debug:          %kernel.debug%
    use_controller: false
    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
        optipng:
            apply_to: "\.png$"
            level:    3
        jpegoptim:
            apply_to: "\.jpe?g$"
            strip_all: true
    twig:
        functions:
            jpegoptim: { output: images/*.jpg }
            optipng: { output: images/*.png }

我的树枝模板:

 <img src="{{ optipng('@KunstmaanDashboardBundle/Resources/public/images/foursquare-logo.png') }}" style="margin-bottom: 0;" />
4

2 回答 2

4

我解决了这个问题,使用两种可能的 twig 语法进行了一些测试。

<!-- standard syntax: -->
{% image 'img/promo/widget.autopromo.testimonial.jpg' filter='jpegoptim' output='img/*.js' %}
    <img src="{{ asset_url }}" alt="Example"/>
{% endimage %}

<!-- twig function: -->
<img src="{{ jpegoptim('img/promo/widget.autopromo.activity.jpg') }}" />

我从以下配置开始

assetic:
  debug:          %kernel.debug%
  use_controller: %kernel.debug%
  read_from:      %kernel.root_dir%/../web/static/
  write_to:       %kernel.root_dir%/../web/static/optimasset

  filters:
    jpegoptim:
      bin: /usr/bin/jpegoptim
      apply_to: "\.jpe?g$"
      strip_all: true
  twig:
    functions:
        jpegoptim: ~

在每次更改之间,我运行以下命令以确保缓存已清除并且新文件正在转储。

rm -Rvf app/cache/* # yes I wanted to make that sure cache is cleared
rm -Rvf web/static/optimasset; 
app/console cache:clear --no-warmup; 
app/console assetic:dump


00首先转储输出是

web/static/optimasset/images/e749c9f.jpg
web/static/optimasset/images/e749c9f_widget.autopromo.testimonial_1.jpg
web/static/optimasset/assetic
web/static/optimasset/assetic/bb69582.jpg
web/static/optimasset/assetic/bb69582_widget.autopromo.activity_1.jpg

并生成html

<img src="/static/images/e749c9f_widget.autopromo.testimonial_1.jpg" alt="Example">
<img src="/static/assetic/c03bc54.jpg">

笔记:

  • twig 函数生成错误的文件名。
  • 转储资产时都考虑config.ymlwrite_to中的参数,但仍创建默认文件夹(或)。assetic/images
  • 两者在生成 html 时都忽略该write_to参数,但使用它们指定的文件夹后面的默认文件夹framework.templating.assets_base_urls.http
  • Twig 函数生成带有错误文件名的 html


01 在config.yml中指定输出目录

filters:
    jpegoptim:
        bin: /usr/bin/jpegoptim
        apply_to: "\.jpe?g$"
        strip_all: true
        output:'img/*.jpg' # just a test
twig:
    functions:
        jpegoptim: {output:'img/*.jpg'} # according to documentation

注意:您将得到完全相同的结果。两种语法都不能处理配置中的“输出”(仅在树枝中)。


02 在树枝模板中指定输出

顺便说一句,我添加optimasset/到输出路径是因为渲染不考虑 ``write_to``` 值。

{% image 'img/promo/widget.autopromo.testimonial.jpg' filter='jpegoptim' output='optimasset/img/*.jpg' %}
    <img src="{{ asset_url }}" alt="Example"/>
{% endimage %}

<img src="{{ jpegoptim('img/promo/widget.autopromo.activity.jpg', {output:'optimasset/img/*.jpg'}) }}" />

倾倒:

web/static/optimasset/optimasset/img
web/static/optimasset/optimasset/img/974c414.jpg
web/static/optimasset/optimasset/img/974c414_widget.autopromo.testimonial_1.jpg
web/static/optimasset/optimasset/img/c230e9e.jpg
web/static/optimasset/optimasset/img/c230e9e_widget.autopromo.activity_1.jpg

呈现为:

<img src="/static/optimasset/img/974c414_widget.autopromo.testimonial_1.jpg" alt="Example">
<img src="/static/optimasset/img/080b62e.jpg">

注意:渲染是正确的,但转储路径不正确。为了解决这个问题,我必须删除write_to参数。


结论

  • {{ optipng(...) }}因为{{ jpegoptim(...) }}从不输出好的文件名。使用语法{% images ... %}
  • 如果您使用资产过滤图像,则不应该使用{% images %} 在渲染 html时write_to不考虑它,只考虑它。{% javascripts %}{% stylesheets %}
于 2013-07-18T20:38:20.100 回答
1

你是否已经阅读了在 Symfony2 中使用 Assetic 进行 CSS 压缩?这可能是他们正在谈论的奇怪行为,因此请跳到该页面上的第 4 点并查看提到的拉取请求 (https://github.com/symfony/symfony/pull/509)。它可能会解决您的问题:p。

于 2011-11-22T10:24:09.747 回答