我正在按照此文档构建自己的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。
答案 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,但随后您可能不得不依靠软件包命名,而这并不是您想要的。