TYPO3 Css/Js-Spam verhindern

veröf­fent­licht am 25 April 2018
zuletzt bearbeitet am 30 July 2018

TYPO3 kombi­niert norma­ler­weise alle css/js Dateien zu einer Datei. Dies hat jedoch einen großen Hacken.

Das Problem

Im Normal­fall ist alles einfach. Man inklu­diert alle Ressourcen via TypoS­cript in ‘page.in­clu­deCss’ und ‘page.in­clu­de­Js­Foo­ter’. TYPO3 generiert jeweils eine CSS und JS Datei und alle sind glücklich.

Dann gibt es aber noch Erwei­te­run­gen. Viele davon fügen gerne mal CSS und JavaS­cript über den ‘Page­Ren­de­rer’ via ‘addCss­File’ und ‘addJs­Foo­ter­File’ hinzu (ganz böse Erwei­te­rungen fügen auch mal JS im head hinzu). Das Problem: Der Parameter ‘exclu­de­F­rom­Con­ca­te­n­a­tion’ ist Standard­mäßig ‘false’. Das heißt das auf der Seite, auf der das Plugin vorhanden ist, TYPO3 ein komplett neues Css/Js Bundle erstellen muss. Jedes Bundle enthält dann alle bishe­rigen Ressourcen die der Nutzer eigent­lich bereits hat.

Workaround

Da ich nicht jede Erwei­te­rung (es sind viele ~ ich zeig aber mal keine Finger) anpassen will hab ich einen schnellen fix imple­men­tiert: Ich hab den ‘Page­Ren­de­rer’ überschrieben und einfach den ‘exclu­de­F­rom­Con­ca­te­n­a­tion’ Parameter geändert. Das sieht dann so aus:

namespace Vendor\Extension\Override;

/**
 * Default $excludeFromConcatenation = true
 */
class PageRenderer extends \TYPO3\CMS\Core\Page\PageRenderer
{
    public function addJsLibrary(
        $name,
        $file,
        $type = 'text/javascript',
        $compress = false,
        $forceOnTop = false,
        $allWrap = '',
        $excludeFromConcatenation = true,
        $splitChar = '|',
        $async = false,
        $integrity = '')
    {
        parent::addJsLibrary($name, $file, $type, $compress, $forceOnTop, $allWrap, $excludeFromConcatenation, $splitChar, $async, $integrity);
    }

    public function addJsFooterLibrary(
        $name,
        $file,
        $type = 'text/javascript',
        $compress = false,
        $forceOnTop = false,
        $allWrap = '',
        $excludeFromConcatenation = true,
        $splitChar = '|',
        $async = false,
        $integrity = '')
    {
        parent::addJsFooterLibrary($name, $file, $type, $compress, $forceOnTop, $allWrap, $excludeFromConcatenation, $splitChar, $async, $integrity);
    }

    public function addJsFile(
        $file,
        $type = 'text/javascript',
        $compress = true,
        $forceOnTop = false,
        $allWrap = '',
        $excludeFromConcatenation = true,
        $splitChar = '|',
        $async = false,
        $integrity = '')
    {
        parent::addJsFile($file, $type, $compress, $forceOnTop, $allWrap, $excludeFromConcatenation, $splitChar, $async, $integrity);
    }

    public function addJsFooterFile
        $file,
        $type = 'text/javascript',
        $compress = true,
        $forceOnTop = false,
        $allWrap = '',
        $excludeFromConcatenation = true,
        $splitChar = '|',
        $async = false,
        $integrity = '')
    {
        parent::addJsFooterFile($file, $type, $compress, $forceOnTop, $allWrap, $excludeFromConcatenation, $splitChar, $async, $integrity);
    }

    public function addCssFile
        $file,
        $rel = 'stylesheet',
        $media = 'all',
        $title = '',
        $compress = true,
        $forceOnTop = false,
        $allWrap = '',
        $excludeFromConcatenation = true,
        $splitChar = '|')
    {
        parent::addCssFile($file, $rel, $media, $title, $compress, $forceOnTop, $allWrap, $excludeFromConcatenation, $splitChar);
    }

    public function addCssLibrary
        $file,
        $rel = 'stylesheet',
        $media = 'all',
        $title = '',
        $compress = true,
        $forceOnTop = false,
        $allWrap = '',
        $excludeFromConcatenation = true,
        $splitChar = '|')
    {
        parent::addCssLibrary($file, $rel, $media, $title, $compress, $forceOnTop, $allWrap, $excludeFromConcatenation, $splitChar);
 }
}

Und in der ext_localconf.php dann einfach:

$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][\TYPO3\CMS\Core\Page\PageRenderer::class]['className'] = \Vendor\Extension\Override\PageRenderer::class;

Das ist immer noch nicht so geil, da man schließ­lich eigent­lich nur eine Datei am Ende haben will, aber es ist um Welten besser als das Standardverhalten.