首页 > 解决方案 > Symfony 和 Encore 在页面中打印关键路径的 css

问题描述

是否可以在页面中打印 css 而不是生成链接标签{{ encore_entry_link_tags('app') }}?或者是否有其他解决方案来整合关键路径?

标签: symfonywebpack-encore

解决方案


由于声誉低,我无法添加评论,但是看看symfonycasts 有完整的解决方案。

基本上你应该解析entrypoints.json文件,找到你需要的合适的 css 文件。你可以使用EntrypointLookupInterface它。然后获取该文件的内容并通过漂亮的自己的 twig 扩展将其返回到模板。

class AppExtension extends AbstractExtension implements ServiceSubscriberInterface
{

    private $publicDir;
    public function __construct(ContainerInterface $container, string $publicDir)
    {
        $this->publicDir = $publicDir;
    }

    public function getFunctions(): array
    {
        return [
            new TwigFunction('encore_entry_css_source', [$this, 'getEncoreEntryCssSource']),
        ];
    }

    public function getEncoreEntryCssSource(string $entryName): string
    {
        $files = $this->container
            ->get(EntrypointLookupInterface::class)
            ->getCssFiles($entryName);
        $source = '';
        foreach ($files as $file) {
            $source .= file_get_contents($this->publicDir.'/'.$file);
        }
        return $source;
    }

    public static function getSubscribedServices()
    {
        return [
            EntrypointLookupInterface::class,
        ];
    }
}

您还必须将 publicDir 添加到您的config/services.yaml文件中

services:
    _defaults:
        bind:
            string $publicDir: '%kernel.project_dir%/public'

然后在树枝模板中

{% apply inky_to_html|inline_css(encore_entry_css_source('email')) %}
{% endapply %}

推荐阅读