Ungenutzte Klassen erkennen in… HTML

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Wenn von „ungenutzt“ im Zusammenhang mit CSS die Rede ist, geht es meist darum, CSS-Teile zu entfernen, die auf Ihrer Website nicht verwendet werden oder zumindest die Stile, die auf einer bestimmten Seite nicht aktuell genutzt werden. Möglichst wenig CSS ist am besten! Ich habe schon früher darüber geschrieben, wie das ein schwieriges Problem ist. Im JavaScript-Bereich entspricht dem Tree Shaking (Entfernen von ungenutztem JavaScript).

Aber was ist mit dem umgekehrten Weg, dem Erkennen von Klassen in HTML, die in Ihrem CSS nicht verwendet werden? Wenn Sie das mit Sicherheit wüssten, könnten Sie Ihren Markup bereinigen und Klassen entfernen, die nichts bewirken.

Ich habe neulich Robert Kieffer einen Gist posten sehen, der eine interessante Lösung enthielt. Die Idee ist, document.styleSheets zu laden und *alle* Regeln zu finden (die, die Klassen sind). Dann wird ein MutationObserver verwendet, um den DOM auf alles HTML zu überwachen und die classList jedes Knotens zu überprüfen, ob sie mit einer aus einer Stylesheet übereinstimmt. Wenn das HTML eine Klasse hat, die in keiner Stylesheet gefunden wird, wird sie gemeldet.

Ich habe es kurz ausprobiert und es funktioniert und meldet korrekt ungenutzte Klassen

Ihre Erfahrungen können variieren. Zum einen ist dieses Skript als ES-Modul eingerichtet. Das bedeutet, wenn Sie es einfach importieren und auf einem ganz normalen HTML-Dokument ausführen, findet es nichts, da Ihr <script type="module"> verzögert geladen wird und der MutationObserver nichts erfassen kann. Ich habe es für meine Demo entmodult und in den <head> gestellt, um sie zum Laufen zu bringen.

Ich habe die Site auf Netlify Dropped online gestellt, falls Sie sie sich genauer ansehen möchten. Ich hätte CodePen verwendet, aber CodePen verknüpft Ihre Stile standardmäßig nicht als <link>ed Stylesheets (aber Sie könnten externe Ressourcen verwenden, um das zu tun). Ich dachte einfach, es wäre als bereitgestellte Website klarer.

Vorsicht jetzt.

Genauso wie ungenutztes CSS ein schwieriges Problem ist, weil es schwer zu wissen ist, ob eine Regelgruppe ungenutzt ist, könnte dieser Ansatz ein *noch schwierigeres* Problem sein. Erstens könnten Klassen als JavaScript-Hooks für Dinge verwendet werden. Stile könnten auf der Seite in <style>-Blöcken eingefügt werden, die dieses Skript nicht prüft. Man könnte sogar Integrationstests haben, die in CI ausgeführt werden und Klassen für Testzwecke verwenden.

Ich würde sagen, dass diese Art von Funktion ein nützliches Werkzeug ist, um einen Blick auf Klassen zu werfen, von denen Sie vermuten, dass sie ungenutzt sein könnten. Aber ich würde nicht sagen, dass Sie die Erlaubnis haben, dieses Ding auszuführen und dann jede gemeldete Klasse ohne weitere Untersuchung zu entfernen.