使用 Assetic / Twig / Symfony2,我可以定义前端库吗?

Posted

技术标签:

【中文标题】使用 Assetic / Twig / Symfony2,我可以定义前端库吗?【英文标题】:With Assetic / Twig / Symfony2, can I define front end libraries? 【发布时间】:2012-06-05 12:07:46 【问题描述】:

我正在使用 Symfony2、Assetic 和 Twig。我有各种前端库——Backbone、jQuery、jQuery UI 和 Bootstrap。 Bootstrap 和 jQuery UI 都包含 CSS 和 JS 文件。

有没有一种方法可以定义它们需要包含的资源(包括依赖项),然后在 Twig / Assetic 中将所有这些资源包含在一个标签中?我希望拥有的是这样的:

// config.yml <!-- DOES NOT WORK -->
assetic:
  resources:
    jquery:
      js: /filepath/to/jquery.js
    jquery_ui:
      dependencies: jquery
      css: /filepath/to/jqueryui.css
      js: /filepath/to/jqueryui.js
    less:
      js: /filepath/to/less.js
    bootstrap:
      dependencies:  less, jquery 
      js: /filepath/to/bootstrap.js
      css: /filepath/to/bootstrap.css
    backbone:
      dependencies:  jquery 
      js:  /filepath/to/underscore.js, /filepath/to/backbone.js 

// view.html.twig
% use jquery_ui %
% use bootstrap % 

// outputs all js and css for jQuery, jQueryUI, Less, Backbone, and Bootstrap

我发现了几个相关的问题:

How to define Assetic resources in Symfony 2 yml or xml configuration file? Symfony2 Assetic + Twig Template javascript Inheritance

但似乎都不涉及在 config.yml 中定义资源。相反,他们在 base.html.twig 中定义它们,但这是我要避免的。

我尝试在 Twig 中使用use 标记,方法是定义一个名为“jquery_ui”的模板并在该块中使用% stylesheets %% javascripts %,然后在base.html.twig 中放置% use "jquery-ui.html" %。但是,use 不会导入模板,因为它有正文。

【问题讨论】:

【参考方案1】:

虽然确实支持定义前端库,但遗憾的是不支持依赖解析。您还必须分别定义 CSS 和 JavaScript。

我一直在做的是在 /app/config/ 中创建一个名为 assets.yml 的单独文件,并将其包含在主配置中以保持干净。

assetic:
    assets:
        jquery:
            inputs:
                - '%kernel.root_dir%/Resources/public/js/jquery.js'
                - '%kernel.root_dir%/Resources/public/js/jquery-ui.js'
        my_lib:
            inputs:
                - '%kernel.root_dir%/Resources/public/js/my-custom-lib.js'
                - ...

注意 '%kernel.root_dir%' 在 Symfony2 中默认解析为 app 目录。您现在可以在 Twig 模板中使用这些资源了。

% block javascripts %
    % javascripts '@jquery' '@my_lib' output="js/jquery.js" %
        <script type="text/javascript" src=" asset_url "></script>
    % endjavascripts %
% endblock %

对 CSS 文件也可以这样做。该示例还演示了为什么不能将 CSS 和 JavaScript 定义为单一资产。

【讨论】:

我建议在项目的根目录中使用package.json,并记录如何在项目根目录的文件中重建工作区。有时我也会在app/ 目录中添加脚本。 我该如何使用 package.json 呢? 这看起来很棒。但是,我对扩展模板的 % block javascripts %? 时会发生什么有疑问。大概你需要在孩子中使用 parent() 占位符。在% block javascripts % 之外定义% javascripts % 标记以避免每次都输入此标记会更好吗?子模板还可以包含% javascripts % 标签吗? Assetic 是否仍然足够聪明,只编译一个 css/js 文件?还是为“全球”站点编译一个,为扩展包编译另一个? @cartbeforehorse 好吧。如果您正在扩展模板并希望向页面添加更多脚本,则必须使用 parent() 。 Assetic 不会将扩展模板中的父脚本和脚本编译为单个文件,我认为这很好——客户端将缓存常用脚本并下载页面的唯一脚本。或者,如果您不想每次都写 parent() ,您可以定义一个单独的块。 @gilden 在问我的问题之前我应该​​先做更多的测试。我的困惑源于我没有完全理解% javascripts % 标签。我做了更多的研究,现在理解得更好了。不过感谢您的回复——它也证实了我发现的所有其他内容,这令人放心。【参考方案2】:

最简单的解决方案是将它们放在 web/ 目录中的适当目录中,因为这是为所有 Symfony 包提供服务的站点的根目录。

【讨论】:

【参考方案3】:

您可能想查看 Cartero,它允许您定义“资产包”,包括依赖项,然后将这些包包含在您的页面中。

https://github.com/rotundasoftware/cartero

您需要编写一个 Symfony2 Hook,但这不会太难。

【讨论】:

以上是关于使用 Assetic / Twig / Symfony2,我可以定义前端库吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Silex/SilexExtensions 和 Assetic 在 Twig 中动态 CSS/Javascript

尝试在我的项目中实现没有 Symfony2 的 Twig 和 Assetic

Assetic 找不到文件

在 Symfony2 中使用 Twig 作为 JavaScript 的资产过滤器

忽略树枝中的未知标签

使用 png 优化的静态资产转储引用了错误的文件