For coders TYPO3 Tech Corner

[PHP] HTML Output in TYPO3 komprimieren

[PHP] HTML Output in TYPO3 komprimieren

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.

Zurück

Kennst du das: Immer nur schnell schnell?

Wie wäre es einmal mit Zeit und Respekt für Codequalität? Arbeiten im Team? Automatisierte Tests?

Komm zu uns