【问题标题】:Difference between assetic:dump and assets:installassets:dump 和 assets:install 之间的区别
【发布时间】:2014-05-17 09:05:44
【问题描述】:

在 Symfony2 中,assetic:dumpassets:install 有什么区别?这些命令应在哪些场景下使用,以及以什么顺序(如果顺序相关)?

【问题讨论】:

    标签: symfony assetic


    【解决方案1】:

    实际上,我在一篇关于 OroCRM 的文章中wrote about this recently,该文章基于 Symfony 2。如果您想要了解不同命令的一些上下文/原因,您可能会发现它很有趣。

    在 Symfony 应用程序中包含前端文件(javascript、css、图像等)有两种不同的系统。 assets:install 命令首先出现。该命令将搜索应用程序中的所有 Symfony Bundle 以查找

    Resources/public
    

    文件夹。如果找到,assets:install 命令会将文件从Resources/public 复制或符号链接到web/public/bundle/[bundle-name]。这是使用 twig assets 函数创建的链接将查找这些文件的位置。这个

    <script src="{{ asset('js/script.js') }}" type="text/javascript"></script>
    

    变成这样

    <script src="/bundles/[bundle-name]/js/script.js" type="text/javascript"></script>
    

    这就是assets 系统所做的一切。它使您可以将前端文件与捆绑包一起存储。

    assetic 系统不同。使用assetic,您可以链接到这样的文件。

    {% javascripts '@AcmeFooBundle/Resources/public/js/foo.js' %}
        <script type="text/javascript" src="{{ asset_url }}"></script>
    {% endjavascripts %}
    

    样式表和图像有类似的标签。请注意,assetic 允许您链接到 any 包中的文件。 (@AcmeFooBundle)。 Assetic 还允许您使用通配符链接到文件夹中的多个文件。

    {% javascripts '@AcmeFooBundle/Resources/public/js/*' %}
        <script type="text/javascript" src="{{ asset_url }}"></script>
    {% endjavascripts %}
    

    assetic 的另一个区别在于生成的链接。在dev 环境中,它们看起来像这样。

    <script type="text/javascript" src="/app_dev.php/js/foo.js"></script>
    <script type="text/javascript" src="/app_dev.php/js/bar.js"></script>
    

    也就是说,对这些文件的请求将通过 PHP 前端控制器 (app_dev.php) 通过 assetic 包中的特殊路由设置运行。这意味着,当您处于dev 模式时,您永远不需要转储资产。它们会自动包含在内。它还允许您对文件应用过滤器。例如,以下将cssrewrite 过滤器应用于拉入的文件。

    {% stylesheets 'bundles/acme_foo/css/*' filter='cssrewrite' %}
        <link rel="stylesheet" href="{{ asset_url }}" />
    {% endstylesheets %}
    

    如果您想以编程方式更改前端资产的输出,assetic 可让您通过编写自定义 twig 过滤器来实现。

    但是,这是性能密集型的。在生产中,不是通过 PHP 前端控制器文件单独链接每个文件,生成的 HTML 将如下所示

    <script type="text/javascript" src="/js/as5s31l.js"></script>
    

    as5s31l.js 来自哪里?这就是assetic:dump 命令的作用。它合并所有单独的 javascript/css 文件(在应用过滤器之后)并创建一个漂亮的、静态的、可缓存的文件用于生产。

    你需要做什么

    除非项目特别告诉您,否则您应该始终运行 assets:installassetic:dump,因为您永远不会知道您的哪些第三方捆绑包使用这些命令。在prod模式下部署或查看应用程序之前,只需要运行assetic:dump。顺序无关紧要。

    至于您的捆绑包应该使用哪个系统 - 如果您已阅读上述内容并且不确定 assetic 可以为您做什么,请使用 assets。你会没事的。

    【讨论】:

    • 这是一个很棒的答案,谢谢。我不相信 Symfony 文档中的任何地方都没有区分,您的回答可以解决问题。
    • 感谢您澄清这一点。你在哪里说&lt;script type="text/javascript" src="app_dev.php/js/as5s31l.js"&gt;&lt;/script&gt; 你真的是说&lt;script type="text/javascript" src="app.php/js/as5s31l.js"&gt;&lt;/script&gt;
    • @Sam 可能——尽管我的意思可能是“/js/as5s31l.js”——我不记得 Symfony 生成了什么,并且手头没有活动项目要测试。
    • 也感谢您的回答。如果文件通过 dev 前端控制器单独提供,这是否意味着无法设置 sass 过滤器来处理 dev env 中的 scss 文件?
    • @Stphane 我不熟悉您所说的特定前端工具链,但该系统背后的想法是可以修改或扩展资产以包括 SCSS 处理。
    猜你喜欢
    • 2014-10-29
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    • 2015-10-04
    • 2012-08-12
    • 2011-02-18
    相关资源
    最近更新 更多