捆绑Symfony 5资产(管理可重复使用的捆绑资产)

时间:2020-08-09 13:27:22

标签: symfony webpack bundle symfony5

我正在按照此文档构建自己的Symfony 5捆绑包: https://symfony.com/doc/current/bundles/best_practices.html

上面写着:

捆绑软件也不应嵌入编写的第三方库 JavaScript,CSS或任何其他语言。

它没有进一步说明我的捆绑软件如何包含资产(js,图像,css,字体等)。

我可以在EasyAdmin文件中看到它具有自己的webpack.config.js-这是我想要的。这是如何实现的?只是将webpack.config.js放到Bundle文件夹中是不允许在其上运行yarn encore的。

我在这里看到了这个问题,似乎与之相关: Can a Symfony bundle have a own Webpack Encore configuration? 但这并不能回答我的问题-显然EasyAdmin在捆绑包中确实有它自己的webpack.config.js。

1 个答案:

答案 0 :(得分:3)

简单的答案是,您的捆绑软件应包含一个Resources/public/文件夹,其中包含已构建的生产资产。您可以使用assets:install命令将这些文件复制或符号链接到项目的public/目录中,该文件将自动放置在以您的包命名的子目录中,例如public/bundles/appbundle/。然后,在您的捆绑包中,您可以假定此路径存在并从那里加载资产,例如在带有资产助手的树枝模板中:{{ asset('bundles/appbundle/images/my_image.jpg') }}

如果您想使用EasyAdminBundle作为参考,请在此处说明其工作方式:

是的,EasyAdminBundle提供了webpack.config.js,但它主要用于开发,永远不会被您的应用程序使用。取而代之的是,配置会将生产资产写入捆绑包(即src/Resources/public)内的适当位置:

Encore
    .setOutputPath('./src/Resources/public/')
    .setManifestKeyPrefix('bundles/easyadmin')

    .enableSourceMaps(false)
    .enableVersioning(false)
    .disableSingleRuntimeChunk()

这些已构建资产是捆绑软件的一部分(请参阅上面的链接),并且始终随捆绑软件一起分发,因此使用捆绑软件时无需自己构建前端资产。然后,您可以通过运行Symfony命令将那些生产资产直接由您的应用程序使用,该命令将前端资源复制到项目的public/-目录中:

php bin/console assets:install

assets:install命令将捆绑资产安装到给定中 目录(例如公共目录)。

php bin/console assets:install public

将在目标目录内创建一个“捆绑”目录,并且 每个捆绑软件的“资源/公共”目录将被复制到其中。

在模板中,您可以在需要这些资产时使用捆绑前缀来依赖这些资产,例如用于app.css(您可以在EasyAdminBundle的layout.html.twig中看到它的使用):

{{ asset('bundles/easyadmin/app.css') }}

如果您想执行类似操作,则可能必须确保webpack设置不会中断直接访问css文件的操作,例如运行时块或版本控制,如EasyAdminBundle一样。或者,您可以要求捆绑软件的用户在其资产配置中也引用捆绑软件中的manifest.json,但随后您可能不得不依靠软件包命名,而这并不是您想要的。

相关问题