Der folgende Beitrag ist ein Gastbeitrag von Tom Genoni. Tom hat eine Open-Source-Chrome-Erweiterung zur Analyse von CSS entwickelt. Ich überlasse ihm die Vorstellung.
Es ist ein neues Webprojekt. Sie beginnen bei Null. Das Frontend wird sauber und ordentlich sein. Sie haben Ihre Standardeinstellungen vorgenommen. Ihre CSS-Dateien sind organisiert. Sie haben ein System! Dieses Mal wird es anders sein. Was kann schon schiefgehen?
Wenn Ihnen das bekannt vorkommt, wissen Sie, wie es normalerweise endet: Langsam, unvermeidlich, der Code beginnt anzuschwellen und Sie verlieren die Kontrolle. Er wird komplex und verschlungen. Sie überschreiben Stile, die Benennung ist inkonsistent, magische Zahlen und Hacks sind allgegenwärtig. Älterer Code ist schwer zu analysieren, schlecht dokumentiert und viel Glück, wenn neue Kollegen ihn verstehen.
Entschlossen, dieses Schicksal zu vermeiden, recherchierte ich Refactoring-Techniken, aufkommende Best Practices und entwickelte schließlich CSS Dig. In diesem Beitrag werde ich drei Bereiche hervorheben, in denen CSS Dig helfen kann, und einige Refactoring-Tipps geben.
Den Audit starten
In Nicolle Sullivans Präsentation über ihr Refactoring von Trulia empfiehlt sie, Screenshots von jeder Nische und Ecke Ihrer Website zu machen und die Designelemente zusammenzufassen, um das Universum der Schriftgrößen, Schaltflächen, Hintergründe, Ränder usw. zu sehen. Allein diese Übung deckt oft viele Inkonsistenzen auf (und eine beträchtliche Menge an Stöhnen) und bietet einen Ausgangspunkt für die Standardisierung.
Nachdem Sie erkannt haben, dass Sie zu viele Schaltflächenvariationen haben, besteht der nächste Schritt darin, Ihre Stile zu "durchsuchen": Untersuchen Sie Ihr CSS auf die gleiche Weise, und Sie werden oft eine breite Palette von Eigenschaften und Werten finden, die für eine Konsolidierung in Frage kommen. Hier kann CSS Dig helfen.
Nach der Installation der Chrome-Erweiterung sehen Sie deren Symbol in der oberen rechten Ecke Ihres Browsers. Navigieren Sie zu einer Website, die Sie untersuchen möchten, und klicken Sie auf das Symbol. Einige Vorbehalte
- Bei Websites mit viel CSS und je nach Ihrer Verbindungsgeschwindigkeit kann es einige Sekunden dauern, bis CSS Dig abgeschlossen ist.
- Websites mit strengen "Content Security Policies" können dazu führen, dass CSS Dig fehlschlägt. Zum Beispiel facebook.com und github.com.
- Per
@importreferenziertes CSS wird ignoriert. Es gilt als schlechte Praxis und die meisten Websites vermeiden es mittlerweile.
Dinge beschleunigen
Das erste, was Sie sehen werden, ist ein Dialog, der alle CSS-Dateien und Stilblöcke auflistet, die auf der Seite gefunden wurden. Beachten Sie, dass einige Remote-Dateien, wie z. B. Schriftanbieter, nicht zugänglich sind und als "Undiggable" aufgeführt werden. Sie können Elemente, wie z. B. Drittanbieter-Bibliotheken, die Sie nicht in die Analyse einbeziehen möchten, deaktivieren. Bevor Sie jedoch mit dem "Graben" beginnen, werfen Sie einen genauen Blick auf die Liste. Die Reduzierung von HTTP-Anfragen ist die wichtigste Regel für die Leistung, daher ist die Kombination von CSS in weniger Dateien ein guter Ausgangspunkt.

Sobald Sie das zu untersuchende CSS ausgewählt haben, klicken Sie auf "Start Digging". Sie werden dann auf den Hauptbildschirm von CSS Dig weitergeleitet. Auf der linken Seite sehen Sie die Eigenschaften und ihre Anzahl. Ein Klick auf diese zeigt die tatsächlich im CSS verwendeten Deklarationen an. Und ein Klick auf die einzelnen Deklarationen isoliert die Regelsets in der rechten Spalte.
Zu viele Farben
Eines der ersten Dinge, die ich gerne untersuche, sind die Farben. Hohe Zahlen hier sind oft ein Vorbote von Problemen in anderen Bereichen. Vor einiger Zeit habe ich CSS Dig auf huffingtonpost.com laufen lassen. Sie haben seitdem einiges aufgeräumt, aber zu dieser Zeit war das, womit sie arbeiteten
Verschiedene Websites haben unterschiedliche Bedürfnisse und Einschränkungen – aber vergleichen Sie das mit den Farben von apple.com
Da CSS Dig Ihnen die Anzahl der Verwendungen einer Farbe anzeigt, können Sie ziemlich schnell identifizieren, welche Farben konsolidiert werden sollen. Wählen Sie ein dominantes Blau (oder Rot oder Grün) und machen Sie es zum Standard. Wenn Sie einen Präprozessor verwenden, erstellen Sie Variablen und halten Sie sich daran. Ihre Benutzer erhalten eine konsistentere Erfahrung und es ist für Sie einfacher zu warten. Sass-Maps eignen sich hervorragend dafür.
$ui-color: (
brand : #0081BA,
brand-light : #9ACCE2,
brand-dark : #036,
bad-news : #C60C0C,
good-news : #97C70A
);
Und dann eine Farbe referenziert mit
.foo {
color: map-get($ui-color, brand);
}
Abstände
Weitere Bereiche für die Standardisierung sind Abstände und Ränder. Es ist nicht ungewöhnlich, eine große Bandbreite an Werten zu haben, manchmal in verschiedenen Einheiten, insbesondere wenn verschiedene Teams an separaten Teilen einer Website arbeiten. Aber wenn Komponenten gemischt und angepasst werden müssen, können Inkonsistenzen schnell offensichtlich werden.
Eine Möglichkeit, dies anzugehen, ist die Einrichtung eines globalen Abstandsrasters, das für alle Elemente gilt (mit gelegentlichen Ausnahmen). In der UI-Bibliothek bei Optimizely verwenden wir eine Abstandseinheit, derzeit 10 Pixel, und alle Komponentenabstände basieren darauf. Dies hilft, "magische Zahlen" auszuschließen und gibt dem CSS-Autor dennoch etwas Ermessensspielraum.
Zum Beispiel der folgende Code
.foo {
padding: spacer(1);
margin: spacer(1.5) 0;
}
kompiliert zu
.foo {
padding: 10px;
margin: 15px 0;
}
unter Verwendung von
@function spacer($value) {
@if ($value * 2) % 1 != 0 {
@warn 'Spacer value must be a multiple of 0.5';
@return 'Spacer value must be a multiple of 0.5';
} @else {
@return $spacer-unit * $value;
}
}
Wenn unsere Spacer-Funktion einen Wert sieht, der kein Vielfaches von 0,5 ist, gibt sie einen Fehler zurück. Nichts hindert den Autor daran, eine fest codierte Zahl zu verwenden, aber Ausnahmen können in einer Code-Überprüfung besprochen werden. Ich habe festgestellt, dass dies häufig zu serendipitärer Harmonie über Komponenten hinweg führt.
Spezifitätskriege
Als Sass an Popularität gewann, war es nicht ungewöhnlich, dass Entwickler versuchten, die verschachtelte Struktur des HTML, das sie stylten, nachzubilden. Es scheint eine gute Idee zu sein. Ich habe es versucht. Aber es stellt sich heraus, dass dies alle möglichen Komplikationen mit sich bringt und es jetzt verpönt ist.
Zu den Schmerzen, die es verschlimmert, gehört der seit langem bestehende Kampf mit der CSS-Spezifität. Das Überschreiben langer Selektoren, um eine hochspezifische Komponente wiederzuverwenden, ist eine verwirrende und ärgerliche Erfahrung, die oft zu mehr Selektoren und (gasp) !important Regeln führt und zu Code, auf den Sie hoffen, niemals jemandem erklären zu müssen.

Im Selektoren-Tab eines CSS Dig-Berichts sehen Sie alle Selektoren mit Optionen zum Sortieren nach Länge und Spezifität. Diese werden mit dem Specificity Calculator von Keegan Street berechnet. Dies hilft, potenzielle Selektor-Zeitbomben zu identifizieren und hoffentlich den Prozess zu beginnen, die Stile weniger verschachtelt, wiederverwendbarer und einfacher zu warten zu machen. Ich empfehle auch die Verwendung des CSS Specificity Graph Generator, um einen Überblick über Ihren Code zu erhalten.
Weitermachen
Wenn Sie nach der Überprüfung Ihres eigenen Codes feststellen, dass Sie ein tieferes Refactoring durchführen möchten, hier sind noch ein paar weitere Schritte zu beachten.
- Wählen Sie einen kurzen Codenamen für das Refactoring. Dies hilft, dem Projekt Bedeutung zu verleihen und, was noch wichtiger ist, eine Möglichkeit zur Benennung neuer Klassen zu bieten. Bei Optimizely verwenden wir
lego-als Präfix für alle Klassen (ja, ich weiß, super origineller Name), aber es war von unschätzbarem Wert, eine klare Trennung zwischen neuen und alten Klassen zu schaffen. - Übernehmen Sie einen modularen, objektorientierten Ansatz, wie BassCSS, SMACSS oder Harry Roberts bevorstehende Auffrischung seines Inuitcss. Dies hat die Menge des von uns geschriebenen neuen Codes erheblich reduziert und die Entwicklungszeit erheblich beschleunigt.
- Verwenden Sie einen Linter (wie CSS lint oder SCSS-lint). Dieser erzwingt automatisch eine lange Liste gängiger Code-Standardisierungen und hält Ihren Code sauber und konsistent.
Beitragen
Der Quellcode von CSS Dig ist auf GitHub verfügbar. Ihre Vorschläge, Anfragen und Fehlerberichte sind willkommen.
Außerdem arbeite ich bei Optimizely – schauen Sie bei uns vorbei. Wir arbeiten an einigen interessanten Dingen.
Wie haben Sie ein Diagramm der auf einer Website verwendeten Farben erhalten? Das sehe ich in Ihrer CSS-Dig-Erweiterung nicht.
Hallo Tim, CSS Dig hat keine solche Ansicht (obwohl es vielleicht eine haben sollte). Ich habe nur den HTML-Code der Ergebnisse manuell kopiert und ihn etwas bearbeitet. Wenn Sie eine solche Gruppierung sehen möchten, empfehle ich http://cssstats.com/.
Ich habe für meinen Blog ein kostenloses Bootstrap-Theme übernommen und kann verstehen, was Sie mit Standardisierung meinen.
*.background-color hat 18
während
background-color hat 313!! (obwohl einige davon mehrmals verwendet werden, sehe ich, was Sie mit zu vielen Schattierungen/Tönen von Blau meinen).
Zur Verwirrung werden sowohl HTML-Codes als auch RGB-Codes verwendet.
:-(
Ich schätze, ich muss das manuell bereinigen.
Vielen Dank für die großartigen Einblicke.
Das ist ziemlich cool, danke, dass du es erstellt hast, Tom. Mir gefällt, wie es
#333333von#333von#333 !importantunterscheidet. Das erleichtert die Fehlersuche.Eine Sache, die mich verwirrt hat, ist jedoch
{ font-weight: bold; { margin-bottom: 10px; }im Code-Vorschaufenster nach dem Klicken auf einige Eigenschaften. Eine Art falsch-positiver Fund, nehme ich an. Außerdem wird, wenn Sie erneut auf den Erweiterungsbutton klicken, wenn er bereits geöffnet ist, eine weiße Überlagerung angezeigt, ohne Möglichkeit, fortzufahren/zu schließen (Chrome 41.0.2272.118 m). Ich nörgle nicht, ich dachte nur, Sie würden es wissen wollen.Hallo DH, freut mich, dass es Ihnen gefällt. Zu Ihrer ersten Frage würde ich Ihr CSS durch einen Validator laufen lassen. Ich habe festgestellt, dass die Wurzel der meisten Probleme im Code-Vorschaufenster auf etwas im Quell-CSS zurückzuführen ist. Wenn es keine Validator-Fehler gibt, eröffnen Sie bitte ein Problem auf Github und fügen Sie die URL hinzu, die Sie testen. Zu Ihrem zweiten Punkt, ja, das ist ein bekannter Fehler. Den muss ich irgendwann angehen.
Die vom Tool angebotenen Informationen sind wertvoll, jedoch wird es bei der Verwendung auf einer einzelnen Seite einer großen Webanwendung wiederholt unresponsive. Dies ist die Art von Anwendung, die wirklich ein Audit-Tool wie dieses benötigt.
Vielleicht gibt es eine Möglichkeit, Einstellungen einzugeben, um den Umfang in mundgerechte Stücke zu unterteilen, um die nicht reagierenden Fehler zu vermeiden.
Mein aktuelles Projekt hat 72.000 Zeilen CSS und es wächst. Ich brauche dieses Tool, damit es reagiert.
Es tut mir leid zu hören, dass es auf Ihrer Website nicht reagiert. Welche URL versuchen Sie zu testen? Wenn ich herausfinden kann, wie ich Langsamkeit bei sehr hohen CSS-Zeilenanzahlen verhindern kann, werde ich die Erweiterung aktualisieren. Sie könnten die Python-Version von CSS Dig ausprobieren oder vielleicht http://cssstats.com/.
Die Anwendung ist noch nicht live. Wenn sie es wäre, könnte ich sie aus Sicherheitsgründen nicht teilen.
Eine meiner aktuellen Aufgaben zur Überprüfung des CSS ist es, nach einem bestimmten Selektor zu suchen und alles CSS zu finden, das ihn verwendet und die Stile ändert. Ich hoffe, jeden Stil zu sehen, der einen Klassenselektor verwendet, zum Beispiel ".specificSelectorInAudit". Vielleicht gibt es eine Möglichkeit für CSS Dig, die Eingrenzung auf ein bestimmtes Audit-Subjekt zu ermöglichen.
Ich habe damit begonnen, eine Tabellenkalkulation zu verwenden, und ich stelle fest, dass es manuell ein Albtraum ist.
Single-Page-Webanwendungen werden immer komplexer. Einige, wie die, an der ich arbeite, haben eine große Anzahl von Entwicklern. Tools zur Prüfung werden notwendig sein.
Ich werde versuchen, alle CSS-Dateien von Drittanbietern mit CSS Dig abzuwählen, um zu sehen, ob die Reduzierung ausreicht, damit es reagiert. Wenn das nicht hilft, werde ich versuchen, die Python-Version herauszufinden.