Es gibt viele Tools, die darauf abzielen, Ihnen beim Entfernen von "ungenutztem CSS" aus Ihrem Projekt zu helfen. Keine Woche vergeht, in der ich kein Tool dafür sehe, das geteilt oder beworben wird. Es muss bei einigen Entwicklern auf eine Art perfekte Saite treffen. Mir ist Performance wichtig, und ich weiß, dass die Reduzierung von Dateigrößen gut für die Performance ist. In der Tat ist es das. Ich wette, wir haben CSS in unseren Stylesheets, das ungenutzt ist, und wenn wir das entfernen würden, wäre das ein Performance-Gewinn. Ja, wäre es. Wir sollten das automatisieren. Ähhh, da bin ich mir nicht so sicher.
Es gibt wichtige Akteure im Bereich Performance-Tools, die diese Idee hervorheben, wie Lighthouse und wie es Ihnen CSS- und JS-„Abdeckung“ bietet, was Ihnen sicherlich sagen wird, dass Sie Code versenden, den Sie nicht benötigen.
Die Tools, die behaupten, Ihnen bei ungenutztem CSS zu helfen, müssen Analysen durchführen, um Ihnen sagen zu können, was ungenutzt ist und was nicht.
Hier ist eine Möglichkeit, diese Analyse durchzuführen. Rendern Sie eine Seite Ihrer Website und holen Sie sich das vollständige DOM. Holen Sie sich dann auch das vollständige CSSOM, das Ihnen ein Array aller Selektoren in Ihrem CSS liefern kann. Durchlaufen Sie diese Selektoren und führen Sie einen querySelector im DOM durch und prüfen Sie, ob er etwas übereinstimmt. Wenn nicht, ist dieser CSS-Selektor ungenutzt.
Clever, oder?!
Ich denke schon. Aber diese Analyse malt ein ziemlich begrenztes Bild.
Sagen wir, die Analyse läuft zwei Sekunden nach Abschluss der Seite, aber es gibt JavaScript, das nach fünf Sekunden ausgeführt wird und ein Modal einfügt (ugghghk, ich weiß). Die Analyse hätte die HTML-Elemente in diesem Modal verpasst, die wahrscheinlich Stile haben, und hätte diese Stile somit fälschlicherweise als ungenutzt gemeldet.
Das Timing ist also ein Faktor. Hoffentlich hat dieses Analyse-Tool eine Möglichkeit, mehrere Timings zu konfigurieren.
Wir betrachten bisher auch nur eine Seite. Natürlich kann eine Website Dutzende, Hunderte oder Tausende von Seiten haben. Um ganz sicher über ungenutzte Stile zu sein, ist der Blick auf alle davon die sicherste Methode.
Mehrere Seiten sind ein weiterer Faktor. Hoffentlich hat ein Analyse-Tool eine Möglichkeit, so viele Seiten wie Sie ihm sagen, zu betrachten. Vielleicht kann es sich eine Sitemap ansehen?
Erinnern Sie sich an die Sache mit dem Timing? Wir könnten das Timing als eine generische Form von Zustand betrachten. Es gibt unzählige andere Dinge, die zustandsbezogen sein könnten. Ist der Benutzer eingeloggt oder nicht? Welchen Plan hat er? Ist seine Kreditkarte abgelaufen, sodass eine Art Sondernachricht angezeigt wird? Ändern situative Dinge wie Zeit/Datum/Standort den Zustand? Was ist mit Echtzeitdaten? Zeug von einer API?
Anwendungszustand ist eindeutig ein großer Faktor. Hoffentlich kann dieses Analyse-Tool alle möglichen Kombinationen von Zuständen auslösen/festlegen.
Es gibt auch interaktiven Zustand. Was ist mit Modals, die angezeigt werden, weil etwas angeklickt wird? Welcher ist der aktive Tab? Ist dieses Menü geöffnet oder geschlossen? Wo ist die Scrollposition? Es gibt unendliche Permutationen davon. Stellen Sie sich eine Warnleiste vor, die sieben Sekunden nach dem Login des Benutzers angezeigt wird, um den Benutzer vor seiner abgelaufenen Kreditkarte zu warnen, die ein individuell gestaltetes Auswahlelement enthält, das in einem offenen oder geschlossenen Zustand sein kann, aber nur auf der Benutzerseiteneinstellungen-Seite.
Es scheint unwahrscheinlich, dass dieses Analyse-Tool all diese Möglichkeiten bewältigen kann. Selbst mit viel Konfiguration, simulierten Zuständen und Integrationstests könnte es die nahezu unendlichen möglichen Permutationen all dessen nicht abdecken.
Und doch denke ich nicht, dass diese Tools nutzlos sind – sie sind nur...Tools. Ihre Nutzung kann tatsächlich ein positiver Schritt in Richtung besserem Code sein. Ihre Nutzung sagt OK, ich gebe es zu, ich habe ein wenig Angst um mein CSS. Sie könnten dieses Tool verwenden, um ein grobes Bild davon zu erhalten, was Ihr ungenutztes CSS sein könnte, und es dann mit Ihrem eigenen Wissen über Ihre CSS-Codebasis kombinieren, um fundiertere Entscheidungen zu treffen. Oder nehmen Sie einen weiteren technologischen Schritt und tun Sie etwas wie fügen Sie diesen ungenutzten Selektoren ein Hintergrundbild hinzu und überprüfen Sie die Serverprotokolle, um zu sehen, ob sie aufgerufen werden.
Es sei gesagt, dass diese ganze Idee von ungenutztem CSS Teil der CSS-in-JS-Saga ist, die unsere Branche gerade durchmacht. Wenn alle Ihre Stile als Teil von Komponenten geschrieben sind, gibt es irgendwie kein ungenutztes CSS. Entweder wird die Komponente verwendet und die Stile kommen mit ihr, oder sie wird nicht verwendet. Wenn Sie besonders empfindlich auf die Gefahr von ungenutztem CSS reagieren, könnte allein das Sie zu einem CSS-in-JS-Tool bewegen.
Es sei auch gesagt, dass diese DOM- und CSSOM-Analysetechnik nur eine mögliche Methode zur Überprüfung auf ungenutzte Stile ist. Wenn Sie eine Art schickes Tooling hätten, das alle Ihre Vorlagen, Stile und Skripte analysieren könnte, könnte das vermutlich auch ungenutzte Stile ermitteln. Wir sprechen darüber in der jüngsten ShopTalk Show Episode mit Chris Eppstein.
Meine persönliche Erfahrung ist, dass Performance-Bloat durch all die Drittanbieter-Ressourcen verursacht wird, die eine Website lädt (z. B. diese hier ruft laut Privacy Badger 21 auf). Wenn CSS statisch ist und eine angemessene Cache-Lebensdauer hat, ist es nur dann möglicherweise ein Faktor, wenn es noch nicht gecacht wurde. Wenn Sie den Zeitstempel des letzten Änderungsdatums der CSS-Datei beim Einbinden angeben (verwenden Sie mod_rewrite, um die tatsächliche Datei zu liefern), können Sie sie mit einem Header senden, der besagt, dass sie ein Jahr lang gecacht werden soll, aber alle Änderungen sofort ausgeliefert werden, da sich der Zeitstempel geändert hat.
Jedenfalls sollte CSS, das man nie wieder verwenden wird, natürlich entfernt werden, aber automatisches Entfernen, weil es derzeit nicht verwendet wird – schlechte Idee.
Hochwählen +1
Ihr Gedanke ist das, wovor ich Angst hatte, als ich Tools wie Lighthouse benutzte. Meine Schlussfolgerung: Wir können ungenutztes CSS nicht zur Laufzeit erkennen, der einzige Weg, es zu erkennen, ist im Voraus. Wenn Sie Modul-Bundler-Tools wie Webpack verwenden, habe ich ein Plugin geschrieben, das uns hilft, das zu erreichen, was wir brauchen.
https://github.com/MQuy/es6-css-loader
https://github.com/MQuy/webpack-deadcode-plugin
DM, wenn Sie mehr Details besprechen möchten
Komponentenbasierte Assets, wie erwähnt, scheinen mir der Weg nach vorn zu sein – vielleicht nicht so sehr im CSS-in-JS-Bereich, sondern in allen Facetten der Entwicklung?
Das geht irgendwie Hand in Hand mit Critical und Deferred Styles, bei denen Sie ein Framework-Stylesheet haben, das für die Anzeige der Website unerlässlich ist, aber alle anderen nur bei Bedarf geladen und dann nach Ablauf „gelöscht“ werden.
Sobald ein Asset in den Cache geladen wurde, ist es nicht so, als müsste es immer wieder heruntergeladen werden. Ich persönlich glaube, dass das Herunterladen nur dessen, was zu diesem Zeitpunkt für die Seite benötigt wird, der Weg nach vorn ist, während wir immer noch Probleme wie LiFi und 3.14159265358979323846264338327950288419716939937510582097494 G Mobilfunknetze haben! ;-)
Guter Artikel zu allen Punkten, Chris, vielen Dank nochmals, dass Sie so eloquent das ausgedrückt haben, was ich gedacht habe! #h5yr
Das ist ein Grund, warum es einen Trend zu Compiler-Frameworks gibt, die ungenutztes CSS wirklich sicher entfernen können. OptiCSS (das Gegenstück zu CSS Blocks, das im Artikel erwähnt wird) ist ein Beispiel für ein Tooling, das dies tun kann, indem es alles über Ihre Vorlagen und Ihr CSS weiß.
Svelte (Haftungsausschluss: Ich bin der Hauptverantwortliche) ist ein weiteres. Da es die CSS-Elemente einer Komponente analysiert (geparst mit css-tree im Kontext des Markups der Komponente, kann es ungenutzte Stile aus der Ausgabe .css-Datei eliminieren, ohne Fehlalarme und nur mit seltenen Fehlwahrnehmungen (d.h. es kann einige Stile in bestimmten Grenz-fällen beibehalten, aber es wird niemals Stile falsch entfernen). Hier ist eine Demo, um Ihnen eine Vorstellung davon zu geben, wie es funktioniert.
Sieht aus, als hätte Rich einen Link zu einem lokalen Rechner für die Demo eingefügt. Ich glaube, das ist der richtige Link
https://svelte.technology/repl?version=2.7.2&gist=510aaa876132392e69caab6e91f91cf2
Gah, ich bin ein Idiot – danke Louis, das ist die richtige URL!
Ich denke, eine gute Möglichkeit, die Anhäufung von ungenutztem CSS zu verhindern, ist die Erstellung von separaten Stylesheets für jede Komponente und Ansicht, denn wenn eine Markup-Datei aus dem Projekt entfernt wird, wird auch die zugehörige CSS entfernt.
Normalerweise erreiche ich das, indem ich unter dem Styles-Verzeichnis eine Dateisystemstruktur erstelle, die der des Views-Verzeichnisses ähnelt, und jede View-Datei erhält eine entsprechende LESS-Datei. Dann wird alles zu wenigen Entry-Point-Stylesheets zusammengefasst, in die alles importiert wird.
Dann geht es nur noch darum, die Stylesheets zu entfernen, die keine Ansicht mehr haben.
Dem stimme ich zu!
Großartig... ich liebe es, wie diese "nützlichen Tools" Schriftarten oder Hintergrundfarben entfernen, wenn sie auf standardmäßiges Schwarz auf Weiß gesetzt sind, richtig? Nur dass es keine Standard-CSS-Farben gibt. Alles ist browser-, OS- und benutzerspezifisch, sodass Sie niemals eines ohne das andere einstellen können, sonst erhalten Sie Schwarz auf Schwarz oder Weiß auf Weiß und ähnliche unleserliche Kombinationen. Setzen Sie immer beide Farben für alle Elemente, das ist kein ungenutztes CSS!
Und ja, mein OS ist auf Weiß auf Schwarz eingestellt und jeder gängige Browser erkennt das sofort.
Stellen Sie sich vor, Sie schreiben CSS für konsistente Typografie, und dann entfernt dieses Tool Ihre
blockquote-Stile, weil Ihre aktuelle Seite keine Zitate im Artikel enthält.