[PHP] HTML Output in TYPO3 komprimieren

[PHP] HTML Output in TYPO3 komprimieren

Wenn du alle überflüssigen Leerzeichen und Umbrüche im HTML deiner TYPO3-Seite entfernen willst, haben wir vielleicht genau das Richtige für dich. Dazu brauchst du keine Extra-Extension, das kannst du mit 2 weiteren Dateien einfach in deinem Sitepackage ergänzen.

Google Pagespeed meckert es ebenfalls von Zeit zu Zeit an: Neben einer empfohlenen GZIP-Komprimierung kann man auch unnötige Zeichen (z.B. Leerzeichen, Umbrüche und HTML-Kommentare) aus dem gerenderten HTML einer TYPO3-Seite entfernen. Zwar gibt es bereits einen ViewHelper (f:spaceless) der einem im Fluid hilft, den Code etwas zu komprimieren, aber dieser kümmert sich in der Regel lediglich um den Body-Bereich eurer Website. Wollt ihr wirklich alles komprimieren, empfiehlt sich der Einsatz von PSR-15 Middleware.

Das Paket wyrihaximus/html-compress hilft uns bei der Komprimierung. Dazuladen kann man das z.B. über die composer.json:

{ "name": "vendor/sitepackage", "description": "Sitepackage extension", "type": "typo3-cms-extension", "homepage": "https://www.in2code.de", "require": { "typo3/cms-core": "^10.4", "wyrihaximus/html-compress": "^1" }, "autoload": { "psr-4": { "Vendor\\Sitepackage\\": "Classes/" } } }

EXT:sitepackage/Configuration/RequestMiddlewares.php:

<?php return [ 'frontend' => [ 'sitepackage-compress-html' => [ 'target' => \Vendor\Sitepackage\Middleware\HtmlCompress::class, 'before' => [ 'typo3/cms-frontend/output-compression' ], 'after' => [ 'typo3/cms-adminpanel/renderer' ] ] ] ];

EXT:sitepackage/Classes/Middleware/HtmlCompress.php:

<?php declare(strict_types=1); namespace Vendor\Sitepackage\Middleware; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use TYPO3\CMS\Core\Http\StreamFactory; use WyriHaximus\HtmlCompress\Factory; /** * Class HtmlCompress */ class HtmlCompress implements MiddlewareInterface { /** * @param ServerRequestInterface $request * @param RequestHandlerInterface $handler * @return ResponseInterface */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $response = $handler->handle($request); if ($this->isTypeNumSet($request) === false) { $stream = $response->getBody(); $stream->rewind(); $content = $stream->getContents(); $newBody = (new StreamFactory())->createStream($this->compressHtml($content)); $response = $response->withBody($newBody); } return $response; } /** * @param string $html * @return string */ protected function compressHtml(string $html): string { $parser = Factory::construct(); $html = $parser->compress($html); $html = $this->removeComments($html); return $html; } /** * Remove all html comments but not "<!--TYPO3SEARCH_begin-->" and "<!--TYPO3SEARCH-end-->" * @param string $html * @return string */ protected function removeComments(string $html): string { return preg_replace('/<!--((?!TYPO3SEARCH)[\s\S])*?-->/', '', $html); } /** * @param ServerRequestInterface $request * @return bool */ protected function isTypeNumSet(ServerRequestInterface $request): bool { return $request->getAttribute('routing')->getPageType() > 0; } }

Hinweis: Wenn ihr HTML-Kommentare entfernt, bedenkt, dass ihr für Solr oder die Indexsuche die Kommentare "TYPO3SEARCH_..." benötigt! Oben stehender Code berücksichtigt dies bereits.

TYPO3: Unbenutzte Dateien im fileadmin finden

Ihr wollt unbenutzte oder verwaiste Dateien im fileadmin oder einer anderen Storage löschen? Leider gibt es hier nichts direkt vom Core. Aber ein kleiner Command in eurem Sitepackage hilft schnell...

Zum Beitrag

TYPO3: Redakteure mit individuellen user_upload Folder

Vielleicht kennt ihr die Kundenanforderung? Redakteure sollen Videos über den Button "Add media by URL" hinzufügen können. Aber die Dateien sollen sich dann nicht in fileadmin/user_upload/ sondern in...

Zum Beitrag

TYPO3: Seiten im Mixed Mode finden

Mixed Mode bezeichnet man in TYPO3 übersetzte Seiten, auf denen sich Seiteninhalte befinden, die nur zum Teil eine Relation auf entsprechende Seiteninhalte in der Hauptsprache haben. Dies wird im...

Zum Beitrag

Extbase Extensions: An Erweiterbarkeit denken mit data, site und language

Heute mal eine kleine Bitte an die TYPO3-Extension-Autoren da draußen: Achtet auf Erweiterbarkeit eurer Extensions. Dies fördert dann auch die Verbreitung der entsprechenden Plugins.

Zum Beitrag

SQL: Zeige alle Tabellen absteigend nach Größe sortiert

Ich brauche in letzter Zeit häufiger den SQL-Befehl, um herauszufinden, welche Tabellen in der TYPO3-Datenbank am größten sind. Ich habe das Snippet einmal veröffentlicht.

Zum Beitrag

TYPO3 12 mit CKEditor 5: Stile als Einfachauswahl

Wenn man im RTE in TYPO3 einen Link setzt, kann es sein, dass man zwischen verschiedenen Link-Klassen auswählen muss, um beispielsweise Buttons im Frontend zu erzeugen. Neu ist in TYPO3 12 dass man...

Zum Beitrag