捆绑 Symfony 5 资产(管理可重复使用的捆绑资产)
Bundling Symfony 5 assets (managing reusable bundle assets)
我正在按照此文档为 Symfony 5 构建自己的 Bundle:
https://symfony.com/doc/current/bundles/best_practices.html
上面写着:
A bundle should also not embed third-party libraries written in
JavaScript, CSS or any other language.
它没有进一步解释我的 Bundle 如何包含资产(js、图像、css、字体等)。
我可以在 EasyAdmin 文件中看到它有自己的 webpack.config.js - 这正是我想要的。这是如何实现的?仅将 webpack.config.js 放入 Bundle 文件夹不允许在其上 运行 yarn encore。
我在这里看到这个问题,似乎是相关的:
Can a Symfony bundle have a own Webpack Encore configuration?
但它没有回答我的问题 - 显然 EasyAdmin 在 Bundle 中确实有它自己的 webpack.config.js。
简短的回答是,您的包应该包含一个 Resources/public/
文件夹,其中包含构建的生产资产。您可以使用 assets:install
命令将这些文件复制或 symlink 到项目的 public/
目录中,它将自动放置在以您的包命名的子目录中,例如 public/bundles/appbundle/
。然后在您的包中,您可以假设此路径存在并从那里加载资产,例如在 twig-template 和 asset-helper 中:{{ 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()
这些构建的资产是捆绑包的一部分(参见上面的 link)并且始终与捆绑包一起分发,因此在使用捆绑包时无需自己构建前端资产。然后,您的应用程序可以通过 运行 一个 Symfony 命令直接使用这些生产资产,该命令将前端资源复制到项目的 public/
-目录:
php bin/console assets:install
The assets:install command installs bundle assets into a given
directory (e.g. the public directory).
php bin/console assets:install public
A "bundles" directory will be created inside the target directory and the
"Resources/public" directory of each bundle will be copied into it.
在您的模板中,您可以在需要这些资产时使用 bundle-prefix 依赖这些资产,例如对于 app.css
(您可以在 EasyAdminBundle 的 layout.html.twig 中看到它被使用):
{{ asset('bundles/easyadmin/app.css') }}
如果你想做类似的事情,你可能必须确保 webpack-settings 不会中断直接访问 css 文件,例如运行时块或版本控制,就像 EasyAdminBundle 所做的那样。或者,您可以要求您的包的用户在他们的 assets-config 中也引用您的包中的 manifest.json,但是您可能不得不依赖包命名,这可能不是您想要的。
我正在按照此文档为 Symfony 5 构建自己的 Bundle: https://symfony.com/doc/current/bundles/best_practices.html
上面写着:
A bundle should also not embed third-party libraries written in JavaScript, CSS or any other language.
它没有进一步解释我的 Bundle 如何包含资产(js、图像、css、字体等)。
我可以在 EasyAdmin 文件中看到它有自己的 webpack.config.js - 这正是我想要的。这是如何实现的?仅将 webpack.config.js 放入 Bundle 文件夹不允许在其上 运行 yarn encore。
我在这里看到这个问题,似乎是相关的: Can a Symfony bundle have a own Webpack Encore configuration? 但它没有回答我的问题 - 显然 EasyAdmin 在 Bundle 中确实有它自己的 webpack.config.js。
简短的回答是,您的包应该包含一个 Resources/public/
文件夹,其中包含构建的生产资产。您可以使用 assets:install
命令将这些文件复制或 symlink 到项目的 public/
目录中,它将自动放置在以您的包命名的子目录中,例如 public/bundles/appbundle/
。然后在您的包中,您可以假设此路径存在并从那里加载资产,例如在 twig-template 和 asset-helper 中:{{ 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()
这些构建的资产是捆绑包的一部分(参见上面的 link)并且始终与捆绑包一起分发,因此在使用捆绑包时无需自己构建前端资产。然后,您的应用程序可以通过 运行 一个 Symfony 命令直接使用这些生产资产,该命令将前端资源复制到项目的 public/
-目录:
php bin/console assets:install
The assets:install command installs bundle assets into a given directory (e.g. the public directory).
php bin/console assets:install public
A "bundles" directory will be created inside the target directory and the "Resources/public" directory of each bundle will be copied into it.
在您的模板中,您可以在需要这些资产时使用 bundle-prefix 依赖这些资产,例如对于 app.css
(您可以在 EasyAdminBundle 的 layout.html.twig 中看到它被使用):
{{ asset('bundles/easyadmin/app.css') }}
如果你想做类似的事情,你可能必须确保 webpack-settings 不会中断直接访问 css 文件,例如运行时块或版本控制,就像 EasyAdminBundle 所做的那样。或者,您可以要求您的包的用户在他们的 assets-config 中也引用您的包中的 manifest.json,但是您可能不得不依赖包命名,这可能不是您想要的。