Jede Woche (ungefähr) veröffentlichen wir den Newsletter, der die besten Links, Tipps und Tricks rund um Webdesign und -entwicklung enthält. Am Ende schreiben wir normalerweise über etwas, das wir in der Woche gelernt haben. Das muss nicht direkt mit CSS oder Front-End-Entwicklung zu tun haben, aber es macht viel Spaß, es zu teilen. Hier ist ein Beispiel für einen dieser Abschnitte aus dem Newsletter, in dem ich über Codequalität schwafle und darauf eingehe, was meiner Meinung nach ein Code Smells in Bezug auf die CSS-Sprache sein sollte.
Viele Entwickler beschweren sich über CSS. Die Kaskade! Die seltsamen Eigenschaftsnamen! Vertikale Ausrichtung! Es gibt viele seltsame Dinge an der Sprache, besonders wenn man mit einer Programmiersprache wie JavaScript oder Ruby vertrauter ist.
Ich denke jedoch, das eigentliche Problem mit der CSS-Sprache ist, dass sie einfach, aber nicht leicht ist. Was ich damit meine, ist, dass es nicht viel Zeit braucht, um CSS zu lernen, aber es außergewöhnlichen Aufwand erfordert, "gutes" CSS zu schreiben. Innerhalb einer Woche oder zwei können Sie wahrscheinlich alle Eigenschaften und Werte auswendig lernen und wirklich schöne Designs im Browser ohne Plugins oder Abhängigkeiten erstellen und all Ihre Freunde beeindrucken. Aber das meine ich nicht mit "gutem CSS".
Um zu definieren, was das ist, denke ich in letzter Zeit viel darüber nach, wie wir zuerst erkennen können, was schlechtes CSS ist. In anderen Bereichen der Programmierung sprechen Entwickler dazu neigen, von Code Smells zu sprechen, wenn sie schlechten Code beschreiben; Hinweise in einem Programm, die darauf hindeuten, dass vielleicht die Sache, die Sie geschrieben haben, keine gute Idee ist. Es könnte etwas Einfaches sein, wie eine Namenskonvention oder ein besonders fragiles Stück Code.
In ähnlicher Weise ist unten meine eigene Liste von Code Smells, die meiner Meinung nach helfen, schlechtes Design und CSS zu identifizieren. Beachten Sie, dass diese Punkte mit meinen Erfahrungen beim Aufbau großer Designsysteme in komplexen Anwendungen zusammenhängen, nehmen Sie dies also bitte mit einer Prise Salz.
Code Smell #1: Die Tatsache, dass Sie überhaupt CSS schreiben
Ein großes Team wird wahrscheinlich bereits über eine Sammlung von Tools und Systemen verfügen, um Dinge wie Buttons oder Stile zu erstellen, um Elemente in einem Layout zu verschieben. Die bloße Tatsache, dass Sie CSS schreiben werden, ist wahrscheinlich eine schlechte Idee. Wenn Sie gerade benutzerdefiniertes CSS für einen bestimmten Sonderfall schreiben wollen, dann hören Sie auf! Sie müssen wahrscheinlich eines der folgenden tun:
- Lernen Sie, wie das aktuelle System funktioniert und warum es die von ihm vorgegebenen Einschränkungen hat, und halten Sie sich an diese Einschränkungen.
- Überdenken Sie die zugrundeliegende Infrastruktur des CSS.
Ich denke, dieser Ansatz wurde hier perfekt beschrieben.
Über die falsche Geschwindigkeit von "schnellen Lösungen". pic.twitter.com/91jauLyEJ3
- Pete Lacey (@chopeh) 2. November 2017
Code Smell #2: Dateinamen und Namenskonventionen
Nehmen wir an, Sie müssen eine Support-Seite für Ihre App erstellen. Als Erstes erstellen Sie wahrscheinlich eine CSS-Datei namens `support.scss` und beginnen, Code wie diesen zu schreiben.
.support {
background-color: #efefef;
max-width: 600px;
border: 2px solid #bbb;
}
Das Problem hier sind also nicht unbedingt die Stile selbst, sondern das Konzept einer "Support-Seite" an sich. Wenn wir CSS schreiben, müssen wir in viel größeren Abstraktionen denken — wir müssen an Vorlagen oder Komponenten denken und nicht an die spezifischen Inhalte, die der Benutzer auf einer Seite sehen muss. Auf diese Weise können wir etwas wie eine "Karte" immer wieder auf jeder Seite wiederverwenden, einschließlich der einen Instanz, die wir für die Support-Seite benötigen.
.card {
background-color: #efefef;
max-width: 600px;
border: 2px solid #bbb;
}
Das ist schon etwas besser! (Meine nächste Frage wäre: Was ist eine Karte, welche Inhalte kann eine Karte enthalten, wann ist es in Ordnung, eine Karte zu verwenden, usw. usw. – diese Fragen werden das Design wahrscheinlich hinterfragen und Sie fokussiert halten.)
Code Smell #3: HTML-Elemente stylen
Meiner Erfahrung nach bedeutet das Stylen eines HTML-Elements (wie ein Section- oder Paragraph-Tag) fast immer, dass wir einen Hack schreiben. Es gibt nur einen geeigneten Zeitpunkt, ein HTML-Element direkt so zu stylen.
section { display: block; }
figure { margin-bottom: 20px; }
Und das sind die globalen, sogenannten „Reset Styles“ der Anwendungen. Andernfalls machen wir unseren Codebase fragmentiert und schwieriger zu debuggen, da wir keine Ahnung haben, ob diese Stile Hacks für einen bestimmten Zweck sind oder ob sie die Standardwerte für dieses HTML-Element definieren.
Code Smell #4: Code einrücken
Das Einrücken von Sass-Code, sodass sich Kindkomponenten innerhalb eines Elternelements befinden, ist fast immer ein Code Smell und ein sicheres Zeichen dafür, dass dieses Design refaktorisiert werden muss. Hier ist ein Beispiel.
.card {
display: flex;
.header {
font-size: 21px;
}
}
Sagen wir in diesem Beispiel, dass Sie eine `.header`-Klasse nur innerhalb einer `.card` verwenden können? Oder überschreiben wir einen anderen CSS-Block irgendwo tief in unserer Codebase? Die Tatsache, dass wir überhaupt solche Fragen stellen müssen, zeigt das größte Problem hier: Wir haben nun Zweifel in die Codebase gesät. Um wirklich zu verstehen, wie dieser Code funktioniert, muss ich Kenntnis von anderen Code-Teilen haben. Und wenn ich Fragen stellen muss, warum dieser Code existiert oder wie er funktioniert, dann ist er wahrscheinlich entweder zu kompliziert oder zukünftig nicht wartbar.
Dies führt zum fünften Code Smell…
Code Smell #5: CSS überschreiben
In einer idealen Welt haben wir eine Reset-CSS-Datei, die alle unsere Standardelemente stylt, und dann haben wir separate, einzelne CSS-Dateien für jeden Button, jeden Formularinput und jede Komponente in unserer Anwendung. Unser Code sollte höchstens einmal durch die Kaskade überschrieben werden. Erstens macht dies unseren gesamten Code vorhersehbarer und zweitens macht es unseren Komponenten-Code (wie `button.scss`) super lesbar. Wir wissen jetzt, dass wir, wenn wir etwas reparieren müssen, eine einzelne Datei öffnen können und diese Änderungen mit einem Schlag in der gesamten Anwendung repliziert werden. Wenn es um CSS geht, ist Vorhersehbarkeit alles.
In derselben CSS-Utopie würden wir dann vielleicht bestimmte Klassennamen mit etwas wie CSS Modules unmöglich zu überschreiben machen. So können wir keine Fehler versehentlich machen.
Code Smell #6: CSS-Dateien mit mehr als 50 Zeilen Code
Je mehr CSS Sie schreiben, desto komplizierter und fragiler wird die Codebase. Wenn ich also ungefähr 50 Zeilen CSS erreiche, überdenke ich normalerweise, was ich entwerfe, indem ich mir ein paar Fragen stelle. Beginnend und endend mit: "Ist dies eine einzelne Komponente oder können wir sie in separate Teile aufteilen, die unabhängig voneinander arbeiten?"
Das ist ein schwieriger und zeitaufwändiger Prozess, der endlos geübt werden muss, aber er führt zu einer soliden Codebase und trainiert Sie, wirklich gutes CSS zu schreiben.
Zusammenfassung
Ich nehme an, ich habe jetzt eine weitere Frage, diesmal an Sie: Was betrachten Sie als Code Smell in CSS? Was ist schlechtes CSS? Was ist wirklich gutes CSS? Hinterlassen Sie unbedingt einen Kommentar unten!
Code Smell #1: Die Tatsache, dass Sie überhaupt CSS schreiben
Wirklich? Genau das mache ich den ganzen Tag, 9 bis 17 Uhr, 5 Tage die Woche. Nur CSS. In einem Team, in dem die anderen Typescript, Java, Management machen... dank der Tatsache, dass sie mich dediziert haben, um die ganze CSS-Arbeit zu erledigen...
Die anderen Code Smells: Sind Sie sicher, dass Sie als CSS-Entwickler erfahren genug sind, um diese Aussagen zu treffen? Ich stimme keiner davon zu...
Mehr als 50 Zeilen CSS sind Code Smell... wirklich? 37.000 Zeilen CSS, das ist Code Smell (und ungefähr die Anzahl der CSS-Zeilen in Angular JS übrigens).
Für #1 ja, der ganze Sinn dahinter ist, dass es eine gängige Praxis ist, eine Pattern Library zu haben, auch wenn das bedeutet, die von jemand anderem zu verwenden, wie Material, Bootstrap, Foundation, etc.
Diese Regel besagt nicht, dass sie immer wahr ist, und ich bin mir nicht sicher, ob sie wirklich gut erklärt. Ein gut durchdachtes System sollte nicht viel CSS erfordern, es sei denn, Sie fügen neue Funktionen hinzu, in diesem Fall sollten Sie in Ordnung sein.
Was die restlichen hier aufgeführten Regeln angeht, würde ich sagen, die meisten davon sind gültig, obwohl sie unter demselben Mangel an besseren Beispielen leiden. Die Regel über 50 Zeilen halte ich für etwas übertrieben und sie kann je nach Art des Systems variieren. Nach 200 Zeilen würde ich vielleicht anfangen zu fragen, warum so viel Styling in einer Datei stattfindet.
(nur weil ich Luke P. nicht antworten kann, ist das für ihn)
Sie sagen also im Grunde, dass wir alle Materialize, MDL, Bootstrap, Foundation oder eines der tausend Frameworks da draußen nutzen sollten, um die Arbeit zu erledigen, und wenn wir zusätzliches CSS schreiben müssen, dann machen wir es im Grunde falsch, es sei denn, wir fügen zusätzliche Funktionen hinzu!? Wirklich!?
Dann sollten Ihrer Meinung nach alle Websites gleich aussehen, kein Unterschied zwischen Codrops, Csstricks oder anderen Websites, weil wir eines der Frameworks ohne Anpassung verwenden sollten, richtig?
Stimme zu. Wenn Sie ein Framework ohne zusätzliche Stilüberschreibungen oder Anpassungen verwenden, erstellen Sie eine langweilige Website. Ich bin mir nicht sicher, was der Autor mit diesem Punkt aussagen möchte.
Was #2 angeht, das höre ich schon seit Jahren. Ich verstehe, dass CSS in einer idealen Welt vollständig abstrahiert wird und ich für alles eine wiederverwendbare Klasse habe. Allerdings hatte ich in meiner Karriere noch nie ein Problem mit einer Klasse wie `.support` für ein bestimmtes Seiten-Element. Wenn dieser Stil auf zukünftige Bereiche ausgedehnt werden muss, kann der Code später refaktorisiert werden, wenn es tatsächlich notwendig wird.
Die meisten dieser Tipps sind nur Wege, viel zu viel Zeit für CSS aufzuwenden und den gesamten Prozess komplizierter zu machen, als er sein muss.
Ich stimme den Antworten an Luke nicht zu. Ich denke, die meisten Punkte in diesem Artikel sind fair. Wenn Sie an einem neuen Projekt oder neuen Funktionen arbeiten, werden Sie offensichtlich CSS schreiben. Wenn nicht, und Sie ändern bestehende Funktionen oder beheben Fehler, dann müssen Sie vielleicht kein CSS ändern (vielleicht). Wenn Sie ein UI-Kit oder Designsystem verwenden, kann dies normalerweise als Entwicklungsabhängigkeit fungieren und wird selten aktualisiert. Wenn nicht und Ihr CSS eng an Ihre Anwendungskomponenten gekoppelt ist, dann werden Sie wahrscheinlich CSS ändern, wenn Sie anderen Code ändern. Da Designsysteme heutzutage ziemlich beliebt sind, wird der Punkt hier in diesem Artikel erwähnt.
Was #2 angeht, stimme ich voll und ganz zu. Wenn Sie eine Klasse namens `.support` für den Container Ihrer Support-Seite erstellen und dann diese Klasse verwenden, um Elemente auf der Support-Seite zu stylen, dann hoffe ich, dass Sie nicht an meinen Projekten arbeiten.
Ich denke, Sie nehmen meinen Kommentar zu Stilrichtlinien etwas aus dem Kontext. Nirgends habe ich gesagt, dass Sie Bootstrap einfach per Drag & Drop in ein Projekt ziehen sollten. Mit diesen Frameworks und auch mit denen, die wir selbst schreiben, kann es sehr einfach sein, vom DRY-Prinzip abzuweichen und einmalige Instanzen für Dinge zu erstellen, die besser als Hilfsklasse dienen könnten. Bevor Sie eine Lösung schreiben, sollten Sie sicherstellen, dass es kein Muster oder keine Klasse gibt, die das tut, was Sie brauchen, oder dass sie den Standards der Musterbibliothek entspricht.
Wenn Sie eine bereits etablierte Musterbibliothek verwenden, ja, werden Sie immer noch CSS schreiben, aber der Punkt ist, dass die Anzahl der Instanzen, für die Sie CSS schreiben müssen, reduziert wird. Das ist der ganze Sinn der ersten Regel: Hinterfragen Sie, ob das, was Sie tun, bereits in den Werkzeugen vorhanden ist, die Sie zur Verfügung haben.
Ich arbeite derzeit an mehreren React-Anwendungen, die alle gemeinsame Komponenten verwenden. Es ist entscheidend, dass die Markenbotschaft im gesamten Ökosystem konsistent ist. Unsere Komponenten haben viele vordefinierte Eigenschaften für Dinge wie Schriftgrößen, Rasterlayouts und viele andere Attribute, um ein hohes Maß an Konsistenz zu gewährleisten. Infolgedessen schreibe ich selten CSS und wenn, dann für sehr spezifische Instanzen, bei denen eine einmalige Situation besteht oder eine neue Komponente benötigt wird.
Genau in diesen Fällen muss ich innehalten und mich fragen, warum ich CSS schreibe. Haben Design/UX vergessen, dass wir bereits eine etablierte Methode zur Verwendung eines Musters haben? Hat jemand anderes diesen Stil bereits in einem anderen Teil erstellt, den ich wiederverwenden kann? Die meisten dieser Fragen helfen uns, unser Design zu straffen, indem wir kleinere Inkonsistenzen entfernen. Manchmal stelle ich fest, dass jemand anderes bereits eine neue Regel für einen Stil/eine Größe erstellt hat, die ich in meiner Komponente wiederverwenden kann.
Immer wenn Sie an einer großen Codebase mit mehreren anderen Entwicklern arbeiten, müssen Sie ein gewisses Maß an Zurückhaltung üben, denn sonst wird Ihre Codebase sehr schnell außer Kontrolle geraten. Ich sehe das oft bei Dingen wie Inline-Menüs, Buttons und der Ausrichtung von Elementen innerhalb von Gittern. Die meisten Stile für diese Elemente können leicht mit ein paar Basis- und Modifikator-Klassen behoben werden. Ein gutes UI hat ein hohes Maß an Konsistenz, das nur sehr wenige oder gar keine einmaligen Anpassungen erfordert.
Was die Behauptung angeht, dass die Anwendung dieser Regeln viel Zeit kostet, ja, das tut sie. Diese Zeit ist jedoch nichts im Vergleich zum Aufwand, eine außer Kontrolle geratene Codebase zu refaktorieren. Es hat auch Auswirkungen auf die Gesamtleistung, egal wie klein das zusätzliche Gewicht in der Größe ist, es zählt alles.
Bedeutet diese Regel, dass Sie niemals CSS schreiben sollten? Absolut nicht, es ist lediglich eine Absicherung, um Sie produktiver zu machen und weniger Zeit mit Refactoring zu verbringen.
Mal im Ernst, wer hier hat schon mal Probleme mit einer Klasse wie `.support` gehabt? Haben Sie ehrlich gesagt schon mal eine Situation erlebt, in der Ihre `.support`-Stile auf eine andere Seite portiert werden mussten und Sie den Code nicht in einer Stunde oder weniger refaktorieren konnten? Wäre es wirklich sinnvoll, die zusätzliche Zeit darauf zu verwenden, etwas 100% skalierbar und unspezifisch zu machen, nur für den Fall, dass Sie es später brauchen, oder macht es mehr Sinn, das zu tun, was Sie jetzt tun müssen, und sich darum zu kümmern, es zu erweitern, wenn und wenn es notwendig wird?
Beachten Sie, dass ich nicht sage, dass eine super spezifische Klasse wie `.support` der perfekte Weg ist, Dinge zu tun. Das ist sie definitiv nicht. Aber Sie reden, als ob es völlig inakzeptabel wäre, Dinge einfach auf pragmatische, effektive Weise zu erledigen. Die Leute werden reeeal wählerisch bei "Code Smells", ignorieren die Tatsache, dass CSS-Frameworks vor nur etwa 10 Jahren kaum existierten, und das Stylen mit einer Klasse wie `.support` wäre der Standardweg gewesen. Klar, das war damals und das ist jetzt. Aber am Ende des Tages garantiere ich, dass der Kunde sich nicht darum kümmert, dass Ihr Code potenziell auf zukünftige Bereiche erweiterbar ist, die möglicherweise existieren oder auch nicht.
Hallo Robin! Schöner Artikel und wirklich gute Punkte, obwohl ich mir nicht wirklich sicher bin, wie man eine button.scss-Datei schreiben könnte, die unter Ihrem ~50-Zeilen-Limit liegt. Können Sie mir vielleicht einen Link zu einem Repo geben, dessen CSS-Teil Sie verwaltet haben? Ich würde gerne mehr über Best Practices lernen :)
#4 ist nur eine Art, eine Komponente zu definieren. Nichts falsch daran, außer der zu breit benannten Header-Klasse.
Was ich höre, ist ein Plädoyer für Resets und Preprozessoren und eine Warnung vor der Komplexität von 50 Zeilen CSS (nach einigen Coding-Standards entspricht dies etwa 12 Deklarationen).
Ich frage mich, ob dies, sind all diese Punkte, im Sinne von Qualität und Verwaltbarkeit? Wie würden wir denen, die sich auf Performance konzentrieren, erklären, dass ein Reset benötigt würde, wenn die Website – fast alle Websites – ohne Reset gut funktioniert [1]? Oder denen, die große Websites betreiben, dass ihre 50.000 Deklarationen [2] in mindestens 1.000 Komponenten aufgeteilt werden sollten?
Ich unterstütze und ermutige die Idee, CSS-Coding-Probleme anzusprechen – aber wir müssen sehr darauf achten, dass die Heilmittel nicht schlimmer sind als die ursprünglichen Probleme und dass wir Features nicht mit Fehlern verwechseln. Das Stylen von Elementen zum Beispiel bedeutet nicht per se "Code Smell". Das ist fast so, als würde man sagen, ein Auto sei kaputt, weil es sich bewegt – wenn der Fahrer nicht fahren kann, mag das sehr wahr erscheinen, aber wir alle wissen, dass es das nicht ist.
[1] https://meiert.com/en/blog/stop-using-resets/
[2] https://meiert.com/en/blog/70-percent-css-repetition/
Ich danke Ihnen, dass Sie sich die Zeit genommen haben, Ihre Gedanken zu Ihrer Interpretation von Code Smells in CSS zu teilen. Ich möchte keine Zeit darauf verwenden, meine Gedanken zu Ihren Smells zu teilen, außer zu #1. Einen Artikel mit der Aussage zu beginnen, dass wir kein CSS schreiben sollten, ist negativ. Warum sollten wir kein CSS schreiben? Sagen Sie, wir sollten uns auf ein Framework verlassen? Bitte erklären Sie genauer, warum Sie nicht denken, dass wir CSS schreiben sollten.
Hallo Rob, ich glaube nicht, dass der Autor wörtlich meinte, dass es keine gute Idee ist, CSS zu schreiben. Ich denke, es war nur eine Möglichkeit, unsere Aufmerksamkeit zu erregen und uns zum Nachdenken anzuregen, bevor wir mit dem Codieren beginnen. Wenn man an einer großen Anwendung arbeitet, hat man oft schon das Nötige getan und kann darauf zurückgreifen. Dies kann in Form einer Hilfsklasse oder einer bereits geschriebenen Komponente geschehen. Meine Interpretation dieses Punktes ist, dass wir sicherstellen sollten, dass wir die Art und Weise verstehen, wie die Anwendung geschrieben ist und welche Konventionen sie befolgt, damit wir auf bestmögliche Weise beitragen und zur Wartbarkeit beitragen können.
Danke, dass Sie diesen Artikel zusammengestellt haben, Robin.
Obwohl viele Code Smells umstritten sind, hat er einem Junior-Entwickler wie mir geholfen zu wissen, auf welche Dinge ich achten sollte – und ich erkenne hier definitiv einige schlechte Verhaltensweisen, die ich in diesem frühen Stadium ausmerzen kann.
Großartige Lektüre!
Was ist die Lösung für #4? Sollte der Header `.card-header` heißen?
Ja, das denke ich.
Nach der OOCSS-Methodik würde ich Klassen wie class=”header card-header” verketten, damit Standard-Header-Stile übernommen werden, gefolgt von benutzerdefinierten Überschreibungen.
Das bedeutet auch, dass man das Sass nicht verschachteln muss.
Ich muss einem anderen Kommentator zustimmen, dass dieser Beitrag und seine "Smells" an Klarheit mangelten.
#1 – CSS schreiben ist Design. Wenn Sie bereits Ihre Basis (was Sie als Reset bezeichnen, das niemals Nicht-Reset-Stile enthalten sollte) geschrieben haben und Komponentenelemente aus anderen Projekten gestylt sind, die in das aktuelle Design passen, dann sollten Sie nicht viel neues CSS außer Layout schreiben müssen. Aber die Implikation, dass wir entweder etwas Vorhandenes zum Wiederverwenden haben oder ein vorformuliertes Framework verwenden müssen, ist absurd.
Wie kommt man aus der Box heraus, wenn man sich weigert, ohne die Box zu arbeiten?
#3 – Wieder sage ich, Reset ist nicht Basis. Sie sollten überhaupt keine Elemente in Ihrem Reset stylen, nur Stile entfernen, um Baselines festzulegen. Abgesehen davon sollte die Basis nur für Stile reserviert sein, die nicht passenderweise in eine andere Stylesheet, für eine bestimmte Komponente, ein Muster usw. gehören.
#4 – Sass-Code ist kein CSS. In CSS existiert dieser "Smell" nur in Media Queries und Animationen, in diesem Fall ist das bereitgestellte Beispiel zutreffend.
#6 – Wie ein anderer Kommentator bemerkte, sind in vielen Fällen 50 Zeilen CSS im Grunde 12 Deklarationen. Wenn Sie Ihren Code in super kleine Chunks aufteilen, wie button.css, dann mag das funktionieren. Sie können jedoch kein Design-Muster für ein einzelnes Element haben. Ein Muster erfordert mehr als eines. Obwohl Sie es so weit aufteilen *können*, erstellen Sie wirklich nur ein Labyrinth von Dateien, das mehr Probleme bereitet als die Lösung, die es zu lösen versucht. buttons.css (Plural) ergibt mehr Sinn. Und es ist so spezifisch, wie die Vernunft eines Designers in den meisten Fällen überleben kann.
Ich schätze den Artikel. Ich habe ihn tatsächlich bis zum Ende gelesen, trotz meiner Vorbehalte. Neue Ansätze sind wertvoll, egal woher sie kommen. Nach dem Lesen glaube ich jedoch, dass dieser Artikel mit Ihrer genauen Sichtweise hätte eingeleitet werden sollen. Das heißt, Sie sind kein CSS-Designer, sondern ein CSS-Präprozessor-Designer, und Sie arbeiten wahrscheinlich in einem etablierten Team, um ein etabliertes Design zu erstellen/verbessern, nicht etwas völlig Neues. Mit anderen Worten, dieser Artikel ist für diejenigen, die Designs anpassen, nicht erstellen. :)
Und da ich Sie ein wenig kritisiert habe, weil Sie es nicht getan haben, werde ich sagen, dass ich Programmierer und Designer bin, freiberuflich und für persönliche Projekte (langfristig, umsatzgenerierende persönliche Projekte). Machen Sie es gut!
Das muss ein schöner Job sein. Ich hingegen darf an einer Website für ein Fortune-100-Technologieunternehmen arbeiten.
#1. Sicher gibt es eine Bibliothek und Werkzeuge für die Arbeit mit dem SCSS der Website. Ich habe keinen Zugriff darauf, da ich ein Auftragnehmer bin. (Keiner der Auftragnehmer hat Zugriff, aber die meiste Arbeit wird von Auftragnehmern erledigt.) Aber es wird trotzdem von mir erwartet, dass ich Dinge repariere.
#2. Dieselbe Website speichert das gesamte CSS in einer einzigen Datei. Ursprünglich war es für die Ladezeiten. Jetzt ist es, weil es zu groß ist, um es fehlerhaft zu machen. Wenn Sie versuchen, generische Klassennamen zu verwenden, werden Sie mit ziemlicher Sicherheit etwas anderes überschreiben.
#3. Frühere Entwickler verwendeten entweder Elementnamen oder gaben keine Klassennamen an. In beiden Fällen müssen wir Elementnamen verwenden. (Normalerweise als Teil einer längeren Regel. Nein, wir können das vorhandene HTML im Allgemeinen nicht ändern, um Klassen hinzuzufügen.)
#4. Dies zeigt ein Missverständnis dessen, worum es beim Sass-Indenting geht.
#5. An diesem Punkt ist das Überschreiben von CSS die einzige Möglichkeit, etwas zu erledigen.
#6. 50 Zeilen? Ernsthaft? Vielleicht, wenn Sie nur ein paar Seiten haben. Was ist mit einer Website mit Tausenden von Seiten? Alle sechs Monate bis ein Jahr wird das Aussehen und Gefühl aktualisiert. Aber sie können die alten Stile nicht brechen, weil es noch Seiten gibt, die sie verwenden. Und sie können nicht nur das CSS laden, das die Vorlage benötigt, weil das CMS dies vor 10 Jahren nicht unterstützte.
Wie auch immer, sicher, wenn Sie eine neue, kleine Website erstellen, sind das vernünftige Richtlinien. Aber für eine Website, die seit Jahrzehnten existiert? Nichts davon ist realistisch. Wir stapeln nur mehr Farbe auf, in der Hoffnung, dass niemand den Sumpf aus Code darunter bemerkt.
Toller Artikel!
Es scheint, als gäbe es einige Missverständnisse bezüglich des ersten Code Smells #1: Die Tatsache, dass Sie überhaupt CSS schreiben. Ich glaube, der Kernsatz hier ist 2. Überdenken Sie die zugrunde liegende Infrastruktur des CSS. Es geht nicht darum, dass wir CSS als Sprache selbst nicht verwenden sollten.
Nehmen wir an, jemand braucht Ihre Hilfe bei einem Projekt, an dem Sie noch nie zuvor gearbeitet haben. Sie benötigen ein Eingabefeld und eine Schaltfläche für eine Newsletter-Anmeldefunktion. Sicher, sagen Sie, bitten Sie um die Designdateien und beginnen Sie, HTML und CSS zu schreiben, um das Design anzupassen. Das ist eine schnelle Lösung!
Was Sie tun sollten, ist die zugrunde liegende Infrastruktur des CSS überdenken. Werden Schaltflächen und Eingabefelder im aktuellen Projekt bereits woanders verwendet? Vielleicht gibt es bereits eine Kontaktseite oder eine ähnliche Formularseite, auf der die beiden Elemente bereits vorhanden sind. Dann könnten Sie diese Teile wiederverwenden, indem Sie die CSS-Klassennamen wiederverwenden, und vielleicht ohne eine einzige Zeile CSS zu schreiben.
Guter Punkt, ronnidc, ich denke, Sie haben den Nagel auf den Kopf getroffen!
Dies sind alles Richtlinien, daher können sie offensichtlich nicht in allen Situationen immer angewendet werden. Was ich jedoch zu #4 sagen würde, ist, dass Verschachtelung eine gute Möglichkeit ist, das Verhalten zu kapseln. Wenn sich .header wirklich anders verhält, weil es sich innerhalb von .card befindet, dann ist es legitim, dass es verschachtelt ist. Das bedeutet, dass Sie alle Ihre Stile für eine Karte in einer Datei kapseln. Wenn Sie die Kartenkomponente jemals entfernen, kann die Klasse .card .header mit ihr gehen.
Die Alternative dazu ist, so etwas wie .header--in-card in der Header-Komponentendatei zu haben, aber es ist auf den ersten Blick schwierig zu erkennen, was genau es tut und wo es sich auswirkt. Würden Sie zuversichtlich sein, diese Klasse zu löschen, wenn Sie die Kartenkomponente löschen?
Es gab bereits einen Kommentar dazu. Ich denke, die Idee wäre, dem Element die vorhandene Klasse zu geben und wenn Sie es anpassen müssten, würden Sie eine zusätzliche Klasse hinzufügen. So etwas:
<div class="header header-in-card">Auf diese Weise erben Sie die vorhandenen Stile und können diese mit den Regeln für die neue Klasse ergänzen oder überschreiben.
#1 Nur wenn Sie kein CSS-Entwickler sind? Als CSS-Entwickler hoffe ich, dass Sie CSS entwickeln, das andere leicht implementieren können, ohne CSS zu schreiben? Nur Bootstrap hinzuzufügen und zu konfigurieren ist keine CSS-Entwicklung. (FE-Entwickler, der CSS macht, nur der Einfachheit halber hier gesagt)
#2 Das hängt total vom Projekt ab. Wenn Sie CSS für die New York Times schreiben, ja. Wenn Sie für einen lokalen Floristen schreiben, warum extreme Abstraktionen verwenden?
#3 Hängt ebenfalls vom Projekt ab, aber meistens nur von Stilklassen, in der Tat
#4 ist ein Code-Smell? Ich würde sagen, es ist eine Best Practice…
#5 CSS überschreiben ist nicht gut? Wie macht man responsives Design? Ich stimme zu, so wenig wie möglich zu überschreiben, aber
#6 50? Haben Sie jemals einen funktionalen Datepicker oder Formulare oder so etwas gestylt? Oder erstellen Sie 500 CSS-Dateien für jede Kleinigkeit?
Etwas verwirrt, warum das Code Smells sind…
Es gibt einige durcheinandergebrachte Kommentare zu diesem Artikel. Ich stimme den meisten Punkten hier zu. Das ist keine Methode, um CSS komplizierter zu machen, als es sein muss. Das sind alles gute, gültige Punkte.
#1 Ich bin CSS-Entwickler und ich liebe es, wenn ich kein CSS schreiben muss. Das bedeutet, dass das CSS, das ich bereits geschrieben habe, gut ist und wiederverwendet werden kann.
#2 Das ist extrem wichtig. Wenn Sie einen technischen Test während eines Vorstellungsgesprächs für mich machen und eine Datei namens support.scss oder eine Klasse namens
.supportverwenden würden, um Komponenten auf Ihrer Support-Seite zu stylen, würde ich Ihnen den Job nicht geben. Weil Sie UI-Komponenten basierend auf ihrem Inhalt stylen, nicht auf ihrem Zweck.#3 Für mich ist das Styling von Elementen nur als Basisstile (oder sogenannte „Reset“-Stile) akzeptabel, wie im Artikel erwähnt. Guter, gültiger Punkt.
#4 Das ist an Punkt #5 gekoppelt. Benennungskonventionen, die etwas wie BEM-Standards folgen, sind viel besser und weitaus wartbarer.
#5 Es hat keinen Sinn, das zu wiederholen, was ich gerade oben gesagt habe. Aber das ist ein guter, gültiger Punkt.
#6 Ich denke, 50 Zeilen sind nur eine Zahl, an die sich der Autor gerne hält. Aber die Idee im Allgemeinen ist wieder ein guter, gültiger Punkt. Nicht zu viel CSS in eine Datei packen. Nicht schwer zu verstehen, oder sogar zuzustimmen.
Ich habe zuvor eine lange Liste spezifischer Kommentare erstellt und den Kommentar gelöscht. Ich habe das Gefühl, dass der größte Fehler dieses Artikels ein Mangel an Kontext ist. Wenn Sie eine kleine Website erstellen, sind fast all diese Punkte keine Code Smells. Wenn Sie an einem riesigen System mit mehreren Entwicklern in einer breiten Codebasis arbeiten, dann sind vielleicht das Code Smells.
Das größte Problem, das ich daraus hatte, war, dass man jeden dazu bringen kann, Ihnen zuzustimmen oder nicht zuzustimmen, wenn Sie mit Ihrem Punkt, Ihren Argumenten oder Ihrem Kontext vage sind.
Außerdem habe ich bemerkt, dass der Autor die Phrase „Anwendung“ eingeschlichen hat, was Kontext impliziert. In einer Anwendungsumgebung können dies Code Smells sein.
Aber auch die meisten von uns Entwicklern müssen damit leben, besonders wenn wir eine alte Codebasis warten, zu der wir nur begrenzten Zugang haben, oder es einfach nicht kosteneffektiv ist, den „Code Smell“ tatsächlich zu „beheben“. Was meiner Meinung nach bei Projekten im Wartungsmodus üblich ist.
Also eine Anmerkung an den Autor, Kontext und Klarheit, die meisten Kritikpunkte hier wären gegenstandslos oder völlig anders, wenn Sie Ihre Perspektive (d. h. „große/mittlere/kleine“ Website/Anwendung, Größe der Entwicklungsgruppe, oder ob Sie an einem Open-Source-Projekt oder einem geschlossenen arbeiten, oder ein Firmenprojekt oder eine gemeinnützige Arbeit usw.) klargestellt hätten.
Ich dachte, der Autor hat gute Arbeit geleistet, um den Kontext zu definieren. Bitte beachten Sie diesen Abschnitt, der sich in der Einleitung des Artikels befand
„Ähnlich ist unten meine eigene Liste von Code Smells, die uns meiner Meinung nach helfen wird, schlechtes Design und CSS zu identifizieren. Beachten Sie, dass diese Punkte mit meinen Erfahrungen beim Aufbau großer Designsysteme in komplexen Anwendungen zusammenhängen, also nehmen Sie dies bitte mit Vorsicht.“
Entweder werde ich verrückt, oder dieser Artikel wurde umgeschrieben. Ich sage, da die Kommentare hier eindeutig auf mangelndem Kontext basieren, dass er umgeschrieben wurde.
Und ich stimme zu, dass der Artikel jetzt besser funktioniert. Aber vielleicht werde ich verrückt.
Code Smell #0: Sie verwenden Normalize oder Reset CSS.
Traurig zu sehen, wie die Web-Technologie in den letzten zehn Jahren abgebaut hat.
Vielen Dank für diesen Artikel. Es ist lange her, seit ich etwas gelesen habe, mit dem ich mich auseinandersetzen wollte. Ich fand, der Artikel war nachdenklich stimmend und bot genau die richtige Menge an Informationen und Kontext. Ich habe ihn wirklich genossen zu lesen und mit anderen Lesern zu interagieren.
Ich denke, es ist erwähnenswert, dass „Einrücken“ etwas anderes ist als „Verschachteln“. Ich stimme zu, dass das Einfügen vieler verschachtelter Stile wie
.content .card .header– einen Standort verlangsamen kann und oft unnötig ist. Aber „Einrücken“ kann verwendet werden, um lesbaren, leicht zu verwaltenden Code zu erstellen. Zum Beispiel kann dieses SCSS gut funktionieren, um BEM-ähnliches CSS zu erstellenIch würde davon abraten, da es die Suche nach .card–header erheblich erschwert. Seien Sie lieber explizit als prägnant.
Ja, James, ich schätze, das könnte ein Problem sein. Ich suche sehr selten, da ich normalerweise einen Inspektor benutze, der Zeilennummern anzeigt, also bin ich damit noch nicht in Berührung gekommen.
Ich stimme dem Autor in allen Punkten zu. Insbesondere nach dem Lesen von Atomic Design, das die Bedeutung von Planung und der Schaffung eines Systems betont – es ist sehr einfach, gedankenlosen CSS zu schreiben, jeder kann es in etwa einer Woche lernen, aber „mit großer Macht kommt große Verantwortung“. Ich arbeite jetzt an einem großen Projekt, das Teil einer großen App ist, und ich musste mein CSS mehrmals refaktorieren, da „Fixing Fixes“ außer Kontrolle geriet. Danke, Chris!
Ich bin keineswegs ein Experte, aber hier ist meine Meinung
#1: Die Tatsache, dass Sie überhaupt CSS schreiben
Entschuldigung, manchmal muss ich eine schnelle Lösung finden, um meinen Job zu behalten. So ist das Leben.
#2: Dateinamen und Benennungskonventionen
Ich wähle das Beste, was ich im Moment kann. Dann hoffe ich auf das Beste. Das funktioniert zu 50%.
#3: HTML-Elemente stylen
Stimme zu. Es sei denn, ich überschreibe das CSS von jemand anderem, das werde ich sicherlich tun. Lesen Sie die Antwort auf #1.
#4: Code einrücken
WTF? . Ich sehe ehrlich gesagt nichts Falsches daran.
#5: CSS überschreiben
Ob wir es mögen oder nicht, es wird Ihnen, mir und allen anderen hier immer wieder passieren. So ist das Leben.
#6: CSS-Dateien mit mehr als 50 Zeilen Code darin
Moment, was? Äh… aber… … äh… … wha whaaat!
Code Smell #3: HTML-Elemente stylen
Die Alternative zum Stylen des Button-Elements ist die Erstellung einer .button-Klasse, die überall im HTML redundant ist.
In einer App, in der ein Button immer ein Button ist, mit einigen Variationen des Basisthemas, ist es sinnlos und unordentlich, eine .button-Klasse zu haben.