Ich war in letzter Zeit von CSS-Modulen fasziniert. Wenn Sie noch nichts davon gehört haben, ist dieser Beitrag für Sie. Wir werden uns das Projekt und seine Ziele und Absichten ansehen. Wenn Sie neugierig sind, bleiben Sie dran, denn der nächste Beitrag wird sich damit befassen, wie man mit dieser Idee anfängt. Wenn Sie Ihre Nutzung implementieren oder verbessern möchten, wird Teil 3 die Verwendung in einer React-Umgebung behandeln.
Artikelserie
- Was sind CSS-Module und warum brauchen wir sie? (Hier sind Sie!)
- Getting Started with CSS Modules
- React + CSS-Module = 😍
Was sind CSS-Module?
Laut dem Repo sind CSS-Module
CSS-Dateien, in denen alle Klassennamen und Animationsnamen standardmäßig lokal verkapselt sind.
CSS-Module sind also keine offizielle Spezifikation oder Implementierung im Browser, sondern vielmehr ein Prozess in einem Build-Schritt (mit Hilfe von Webpack oder Browserify), der Klassennamen und Selektoren so verändert, dass sie verkapselt sind (d. h. so etwas wie namensraumbezogen sind).
Wie sieht das aus und warum sollte man es tun? Dazu kommen wir gleich. Erinnern Sie sich zunächst, wie HTML und CSS normalerweise funktionieren. Eine Klasse wird in HTML angewendet
<h1 class="title">An example heading</h1>
Und diese Klasse wird in CSS gestylt
.title {
background-color: red;
}
Solange dieses CSS auf das HTML-Dokument angewendet wird, wäre der Hintergrund dieses <h1> rot. Wir müssen das CSS oder das HTML nicht verarbeiten. Der Browser versteht beide Dateiformate.
CSS-Module verfolgen einen anderen Ansatz. Anstatt reines HTML zu schreiben, müssen wir unseren gesamten Markup-Code in einer JavaScript-Datei schreiben, z. B. index.js. Hier ist ein Beispiel dafür, wie das funktionieren könnte (ein realistischeres Beispiel sehen wir uns später an)
import styles from "./styles.css";
element.innerHTML =
`<h1 class="${styles.title}">
An example heading
</h1>`;
Während unseres Build-Schritts würde der Compiler die importierte styles.css-Datei durchsuchen, dann das geschriebene JavaScript durchgehen und die Klasse .title über styles.title zugänglich machen. Unser Build-Schritt würde dann beides in neue, separate HTML- und CSS-Dateien verarbeiten, wobei eine neue Zeichenkette sowohl die HTML-Klasse als auch die CSS-Selektorklasse ersetzt.
Unser generiertes HTML könnte so aussehen
<h1 class="_styles__title_309571057">
An example heading
</h1>
Unser generiertes CSS könnte so aussehen
._styles__title_309571057 {
background-color: red;
}

Das Klassenattribut und der Selektor .title sind vollständig verschwunden und wurden durch diese völlig neue Zeichenkette ersetzt; unser ursprüngliches CSS wird überhaupt nicht an den Browser ausgeliefert.
Wie Kitty Giraudel in ihrem Tutorial zu diesem Thema sagte
[die Klassen] sind dynamisch generiert, einzigartig und den richtigen Stilen zugeordnet.
Das ist es, was mit "Styles sind verkapselt" gemeint ist. Sie sind auf bestimmte Vorlagen beschränkt. Wenn wir eine buttons.css-Datei hätten, würden wir sie nur in eine buttons.js-Vorlage importieren, und eine Klasse .btn darin wäre für eine andere Vorlage (z. B. forms.js) unzugänglich, es sei denn, wir würden sie dort explizit importieren.
Warum sollten wir das CSS und HTML verändern, um das zu erreichen? Warum zum Teufel sollten wir auf diese Weise arbeiten?
Warum sollten wir CSS-Module verwenden?
Mit CSS-Modulen ist garantiert, dass alle Stile für eine einzelne Komponente
- An einem Ort liegen
- Nur auf diese Komponente angewendet werden und nichts anderes
Außerdem kann jede Komponente eine echte Abhängigkeit haben, wie z.B.
import buttons from "./buttons.css";
import padding from "./padding.css";
element.innerHTML = `<div class="${buttons.red} ${padding.large}">`;
Dieser Ansatz wurde entwickelt, um das Problem des globalen Geltungsbereichs in CSS zu lösen.
Waren Sie jemals versucht, aus Zeit- oder Ressourcenmangel einfach so schnell wie möglich CSS zu schreiben, ohne darüber nachzudenken, was Sie noch beeinflussen könnten?
Haben Sie jemals zufällige Teile und Junk am Ende eines Stylesheets angehängt, in der Absicht, es später zu organisieren, aber es nie getan?
Sind Sie jemals auf Stile gestoßen, bei denen Sie nicht ganz sicher waren, was sie tun oder ob sie überhaupt verwendet werden?
Haben Sie sich jemals gefragt, ob Sie einige Stile entfernen könnten, ohne etwas zu beschädigen? Sich gefragt, ob die Stile für sich allein standen oder von anderen Dingen abhingen? Oder Stile anderswo überschrieben?
Das sind Fragen, die zu großen Kopfschmerzen, aufgeblähten Projektfristen und traurigen, sehnsüchtigen Blicken aus dem Fenster führen können.
Mit CSS-Modulen und dem Konzept des **standardmäßigen lokalen Geltungsbereichs** wird dieses Problem vermieden. Sie sind immer gezwungen, über die Konsequenzen nachzudenken, während Sie Stile schreiben.
Wenn Sie beispielsweise random-gross-class in HTML verwenden, ohne es als CSS-Module-Stilklasse anzuwenden, wird der Stil nicht angewendet, da der CSS-Selektor in ._style_random-gross-class_0038089 umgewandelt wird.
Das Schlüsselwort composes
Nehmen wir an, wir haben ein Modul namens type.css für unsere Textstile. In dieser Datei hätten wir Folgendes
.serif-font {
font-family: Georgia, serif;
}
.display {
composes: serif-font;
font-size: 30px;
line-height: 35px;
}
Wir würden eine dieser Klassen in unserer Vorlage so deklarieren
import type from "./type.css";
element.innerHTML =
`<h1 class="${type.display}">
This is a heading
</h1>`;
Dies würde zu folgendem Markup führen
<h1 class="_type__display_0980340 _type__serif_404840">
Heading title
</h1>
Beide Klassen wurden durch die Verwendung des Schlüsselworts composes an das Element gebunden und vermeiden so einige der Probleme ähnlicher Lösungen wie Sass' @extend.
Wir können sogar von einer bestimmten Klasse in einer separaten CSS-Datei kompilieren
.element {
composes: dark-red from "./colors.css";
font-size: 30px;
line-height: 1.2;
}
BEM nicht erforderlich
Wir müssen BEM nicht verwenden, wenn wir ein CSS-Modul erstellen. Das hat zwei Gründe
- Einfache Analyse – Code wie
type.displayist für Entwickler genauso lesbar wie das BEM-mäßige.font-size__serif--large. Wahrscheinlich sogar leichter zu erfassen, wenn die BEM-Selektoren lang werden. - Lokaler Geltungsbereich – Sagen wir, wir haben eine Klasse wie
.bigin einem Modul, die diefont-sizeändert. In einem anderen verwenden wir dieselbe Klasse.big, diepaddingundfont-sizein einer anderen Menge erhöht. Das spielt einfach keine Rolle! Sie werden nicht kollidieren, da die Stile sehr bewusst verkapselt sind. Selbst wenn ein Modul beide Stylesheets importiert, hat es einen benutzerdefinierten Namen, den unser Build-Prozess speziell für diese Klasse erstellt. Mit anderen Worten, **Spezifitätsprobleme verschwinden mit CSS-Modulen.**
Cool, oder?
Dies sind nur einige der Vorteile des Schreibens von CSS-Modulen.
Wenn Sie mehr erfahren möchten, hat Glen Madden ausführlich über einige der anderen Vorteile dieses Ansatzes geschrieben.
Der nächste Artikel in dieser Reihe befasst sich damit, wie man ein Projekt mit Webpack und CSS-Modulen zum Laufen bringt. Wir werden die neuesten ES2015-Funktionen verwenden, um dies zu tun, und uns einige Beispielcodes ansehen, die uns durch den Prozess führen.
Weitere Lektüre
- CSS-Module: Willkommen in der Zukunft
- Kitty Giraudels CSS-Module-Tutorial auf Sitepoint
- Verständnis von ES6-Modulen
- Lasst uns ES2015 lernen
- Kurze Übersicht über die ES6-Modulsyntax
Artikelserie
- Was sind CSS-Module und warum brauchen wir sie? (Hier sind Sie!)
- Getting Started with CSS Modules
- React + CSS-Module = 😍
Wenn das CSS so eng an das Element gebunden ist, dann sollte es im Style-Attribut des Elements platziert werden.
Ich stimme zu. Das scheint eine unnötige Komplizierung zu sein. Der Sinn der Verwendung externer CSS ist ein saubereres HTML. Ich versuche sogar, die übermäßige Verwendung des Klassenattributs zu vermeiden. Fügen Sie einfach
<section class="newsList">hinzu und stylen Sie nach Elementnamen im Baum.Inline-CSS hat einige Einschränkungen, wie z. B. keine Unterstützung für Pseudo-Selektoren…
Das dachte ich auch. Das einzige ist, dass Sie den Stilteil einmal schreiben würden.
Ich stimme Richard zu. Das scheint meiner Meinung nach ein Rückschritt zu sein.
Es ist tatsächlich benutzerfreundlicher, ich muss Robin in diesem Punkt zustimmen, es würde auch in IE6 funktionieren, glauben Sie es, obwohl eine Seite, auf der ich neulich war, dies anscheinend auf ihrer gesamten Website verwendet http://www.skyblueoceanmedia.com/ .. Sie verwenden auch die Section-Class-Module? Ich bin immer noch ziemlich verwirrt, wie das in IE6, geschweige denn in neuen Browsern, funktioniert?
Ich sehe mich nicht gezwungen, das gesamte HTML in JS zu schreiben, nur um CSS-Module zu verwenden… Entschuldigung, das ist eine clevere Idee, aber ich glaube nicht, dass sie praktikabel ist.
Ich stimme zu!
Das klingt unnötig kompliziert. Vor allem, wenn man Scope-CSS mit einem Polyfill verwenden kann.
Meine erste Reaktion war WTF!
Und ich dachte mir: „Vielleicht bin ich besonders begriffsstutzig und verstehe den Punkt gar nicht.“
Deshalb habe ich auch http://glenmaddern.com/articles/css-modules gelesen
Ja, die aktuelle Implementierung von CSS-Modulen sieht für mich wirklich unordentlich aus, aber ich sehe, warum sie gut sein könnten.
Ich könnte meine Meinung im Laufe der Zeit ändern, aber das scheint unnötig kompliziert zu sein.
Das ganze „Lass uns alles in JavaScript verwandeln“ gerät außer Kontrolle. Ich liebe React & Freunde genauso wie der Nächste, aber eine Grenze muss gezogen werden. Dies ist etwas, das gute, aufgeräumte und gut gestaltete Sass-Dateien leicht erreichen können, ohne den lächerlichen Mehraufwand.
Es gibt viele andere Möglichkeiten, Ihren Geltungsbereich zu kontrollieren, als auf dies zurückzugreifen. Ich nehme an, diese Methode wäre nützlich, wenn Sie bereits ein Werkzeug wie React verwenden, wo alles in JS erledigt wird, aber mit Werkzeugen wie LESS oder PostCSS (mit Add-ons) kann eine solch präzise Kapselung bereits innerhalb des Bereichs und mit besserer Semantik erreicht werden.
Es gibt zwei wichtige Dinge, die ich an CSS-Modulen wirklich mag
Sie können die Rolle von BEM (oder einer anderen Namenskonvention/Methodik) übernehmen/ergänzen, aber sie können als Teil Ihres Builds automatisiert werden. Für große Projekte/Teams kann dies äußerst hilfreich sein, um alles richtig zu kapseln.
Sie ermöglichen einige coole Innovationen in Ihrem Build. Zum Beispiel habe ich mit PostCSS-Modules und SweatMap (ein kleines Github-Projekt von mir) all meine super semantischen BEM-Klassennamen wie
.hello__greetingin.averschleiern und diese in alle relevanten JS- und HTML-Dateien einfügen können, während sie trotzdem richtig verkapselt sind.Das andere, was ich kommentieren wollte, war diese Aussage im Artikel
Um klarzustellen, wir müssen unseren Markup-Code nicht in JavaScript schreiben. Der Markup-Code kann in jeder beliebigen Form erstellt werden, wir müssen lediglich in der Lage sein, unsere CSS-Module-Daten während des Builds zu übergeben. Ich habe kürzlich ein statisches Website-Projekt in Handlebars + PostCSS-Modules durchgeführt und es fühlte sich natürlicher an, meinen Markup-Code in einer JavaScript-Datei zu erstellen. Wenn ein Projekt React erfordert, fühlt sich JSX auch ziemlich gut an :)
Gute Zusammenfassung, Robin! Ich freue mich auf den Tag, an dem wir eine native Möglichkeit haben, unser CSS richtig zu kapseln, die keinen Build-Prozess oder „okkulte“ Namenskonventionen erfordert.
Ihr SweatMap-Tool sieht fantastisch aus – ich habe mir den Quellcode von Google angesehen und angenommen, dass sie einen ähnlichen Build-Prozess haben.
Wie sehen Sie diesen Prozess in Entwicklungsteams, in denen Front-End-Code an Back-End-Entwickler weitergegeben wird?
Danke, Dean! PostCSS-Modules verarbeitet Back-End-Templating, indem es eine JSON-Datei aller geänderten Module generiert. Solange Ihr Front-End-Build vor Ihrem Back-End-Build läuft, würden Sie diese JSON-Datei einfach an das übergeben, was Sie für Back-End-Templating verwenden (wirklich schick in React-zentrierten Produkten).
Die Koordination zwischen Front-End und Back-End ist immer eine Herausforderung, aber ich habe festgestellt, dass dies in jedem Projekt unabhängig von der Toolchain gilt.
Nun, ja, ich stimme den meisten Kommentaren hier zu. Nein, ich werde definitiv kein neues Framework in JavaScript entwickeln, das HTML-Code generiert, nur weil das CSS modular ist.
Aber ich habe mir gedacht: „Was, wenn mir die Aufgabe gegeben würde, das perfekte Szenario dafür zu finden?“ – Meiner Meinung nach ist das gut für dynamisch generierte Seiten. Höchstwahrscheinlich benutzergenerierte Inhalte in Szenarien, in denen Sie Profilbereiche für jeden Benutzer haben, wo sie das Layout und die Struktur ihrer Profilseite ändern können. Möglicherweise möchten Sie nicht alle Module dieser Seite laden. Früher gab es iGoogle (jetzt: http://www.igoogleportal.com/).
Ich vermute, das ist ein Szenario?
Nur zur Info, CSS-Scoping ist etwas, das Angular 2 out-of-the-box macht. Es ist gut, um saubere wiederverwendbare Komponenten zu erstellen.
„Anstatt reines HTML zu schreiben, müssen wir unseren gesamten Markup-Code in einer JavaScript-Datei schreiben, wie index.js.“
Nein. Ich werde nicht meinen gesamten Markup-Code in JS schreiben und einen Kompilierungsschritt hinzufügen, der mit semantisch bedeutungslosen Klassennamen endet, nur um das Scoping zu adressieren.
Und ich hoffe wirklich, dass die Frontend-Entwickler-Community ihre Faszination verliert, alles mit JS zu machen. Es ist unglaublich nützlich, aber alles auf eine JS-Denkweise zu zwängen, fängt wirklich an, nervig zu sein.
Ich stimme vollkommen zu, dass die Bewegung hin zu JS-Lösungen mit rasantem Tempo voranschreitet – und vielleicht zu schnell für unser eigenes Wohl.
Gleichzeitig könnte es auch zu unserem Nachteil sein, die Idee gänzlich abzulehnen. Ich glaube fest daran, das richtige Werkzeug für eine bestimmte Aufgabe zu wählen, und JS-Templating (einschließlich CSS-Module) könnte eine solide Lösung für Anwendungen sein, denen Sie noch nicht begegnet sind.
Es ist möglich, dass JS-Templating eine Nische hat. Ich mag einfach nicht, dass es als Lösung beworben wird, die wir zuerst anstreben. Chris hat gerade einen Link zu einem Vortrag von Jeremy Keith veröffentlicht (https://css-tricks.de/resilience/), der meiner Meinung nach den Ansatz einfängt, den ich auch bevorzuge
Identifizieren Sie die Kernfunktionalität Ihrer Website.
Machen Sie diese mit der einfachsten Technologie verfügbar.
Verbessern Sie!
Verwenden Sie auf jeden Fall JS, wo es echten Mehrwert bietet. Wenn das beim Templating für ein bestimmtes Projekt der Fall ist, dann nutzen Sie es. Aber drängen Sie mir JS-Templating nicht als gute allgemeine Praxis auf.
Einverstanden!!
Meinen gesamten Markup-Code in reinem JS zu schreiben, würde mich und meine Frontend-Entwickler umbringen…. :(
CSS-Module scheinen eine großartige Idee zu sein, aber ich denke, sie sind noch nicht so weit, wenn wir uns für JS-Markup entscheiden müssen…
Nicht technisch gesehen. Sie benötigen lediglich einen Mechanismus, um den automatisch generierten CSS-Klassennamen in das endgültige HTML-Markup zu bekommen.
Wenn Sie JSX oder ES2015-Vorlagen verwenden, ist JavaScript dieser Mechanismus.
Aber der CSS-Module-Ansatz funktioniert auch mit Angular 1, das HTML-Vorlagen verwendet, einwandfrei.
Bitte schrecken Sie die Leute nicht von CSS-Modulen ab. :)
Ron.
Gibt es eine Chance, dass Sie erklären könnten, wie man CSS-Module mit Angular verwendet?
Ich bin überrascht über die Anzahl der Kommentare, die den Punkt dieses Artikels verfehlen. Ich kann mir vorstellen, dass viele Leute die Nase rümpfen, wenn ihnen gesagt wird, sie sollen JavaScript verwenden, um HTML auszugeben. Daher sollte diese Art der CSS-Verwendung ähnliche – wenn nicht sogar schlechtere – Reaktionen hervorrufen.
Aber die Zeiten und Techniken in der Webentwicklung ändern sich schnell, und Dinge wie React, die bei ihrer Einführung abgelehnt und sogar verspottet wurden, sind jetzt die am meisten diskutierten Technologien.
Und sehen Sie mal – im dritten Teil werden wir die Integration von CSS-Modulen mit React sehen, wo sie meiner Meinung nach wirklich glänzen werden. Natürlich ist es für kleinere Projekte, die vielleicht nicht einmal eine Kompilierung benötigen, unpraktisch, aber kommt schon Leute, ihr müsst ihnen eine Chance geben.
Ich werde nicht für andere sprechen, aber es ist die in Ihrem Kommentar implizite Vorstellung – dass Dinge im Web in React oder etwas Ähnlichem geschrieben werden sollten –, gegen die ich mich wehre. Es gibt sicherlich Fälle, in denen React oder Ähnliches das absolut Richtige ist. Das ist jedoch nicht in 100 % der Fälle so, und es scheint, dass viele Leute nach einem JS-Framework als Standard greifen, ohne zu fragen, ob das Projekt, an dem sie arbeiten, es wirklich benötigt. Apps? Ja. Viele viele Websites? Wahrscheinlich nicht.
Ich denke, das Web besteht aus HTML/CSS/JS und dass wir zuerst die einfachsten, schnellsten und grundlegendsten Technologien verwenden und zu komplexeren Dingen erst wechseln, wenn wir sie wirklich brauchen.
Oder vielleicht hat der Artikel den eigentlichen Sinn von CSS-Modulen verfehlt. Vielleicht scheitern solch alberne Beispiele daran, einen bedeutenden Anwendungsfall zu demonstrieren, insbesondere als Einführung für neue Anwender.
Auch „am häufigsten verwendet“ oder „diskutiert“ bedeutet nicht „am besten“. Popularität ist kein Validierer und garantiert auch keine Eignung.
Die Förderung der Akzeptanz erfordert bessere Anwendungsfälle, denn (im besten Fall) sollten Entscheidungen auf der Grundlage von Bedarf und nicht von Einfluss getroffen werden.
Ich verstehe es einfach nicht! Das scheint eine weitere Möglichkeit zu sein, wie wir es geschafft haben, den Entwicklungsprozess für keinen wirklichen Gewinn massiv zu komplizieren. Das Verkaufsargument für die Verwendung externer CSS-Dateien war früher, dass Sie Komponenten Ihrer Website global stylen konnten. Dies führt nur zu einem lächerlichen Maß an Spezifität, das CSS-Bloat erzeugt, und um dies zu erreichen, müssen Sie Ihr HTML und CSS in einer JS-Datei codieren!
Dämlich, wenn Sie mich fragen, aber jeder nach seiner Façon.
LIEBE, wie das erste Beispiel selbst etwas ist, das nach logischen Strukturregeln (aka etwas, das wir vor der HTML-5-Asshatterie hatten, die nummerierte Überschriften überschwemmte) etwas ist, das es aus legitimen Gründen niemals gibt… Klasse bei einer nummerierten Überschrift? Das ist eine gute.
Aber wenn man dann die aufgeblähten idiotischen halbhirnigen dummen Abfall-Klassen bedenkt, die der Präprozessor/Include-Kram ausspuckt und die Kühnheit hat, Markup zu nennen, dann ist so ein idiotischer „Wie schwer können wir etwas Einfaches machen“-Ansatz der Entwicklung wohl kaum ein Schock; wenn man bedenkt, dass jeder DUMM genug ist, diese Art von Dingen freiwillig zu benutzen — genau wie SCSS, OOCSS und ihre Art (ja, der archaische Plural von Kuh ist hier wirklich angemessen) — wahrscheinlich nicht genug über HTML, CSS, JavaScript, Bandbreitenbeschränkungen, Beschränkungen des Mediums, Barrierefreiheit, Nachhaltigkeit oder Benutzererfahrung weiß, um Webseiten zu erstellen!
Mein Gott, je mehr Artikel ich über diese „neuen“ Ansätze zum Erstellen von HTML und CSS lese, die sinnlos kryptischer und schwieriger zu warten sind, desto erschreckender wird es. Ernsthaft, wenn Sie irgendeinen Vorteil in Ansätzen wie diesem beim Schreiben von HTML und CSS finden, tun Sie der Welt einen Gefallen, treten Sie vom Keyboard weg und nehmen Sie etwas an, das etwas weniger detailorientiert ist, wie Makramee!!!
Aber ich schätze, bei all den Leuten, die dumm genug sind, ihren Code mit Mundatmungs-Short-Bus-Idiotie wie Bootcrap und jQuery aufzublähen, sind die Samthandschuhe abgelegt, um Webseiten so schmerzhaft aufgebläht und qualvoll schwer zu warten wie möglich zu machen!
Vielleicht möchten Sie einige dieser Meinungen mit Beispielen Ihrer Arbeit untermauern?
Ich würde wetten, Ihre Websites sehen wahrscheinlich aus wie die Yahoo-Homepage um 1996, da Sie anscheinend denken, dass sich Webtechnologien seit den ursprünglichen grundlegenden Dokumenten-Markup- und Styling-Tools von vor 20 Jahren nicht weiterentwickelt haben sollten.
Oder vielleicht liegt der Grund, warum Sie SASS, Modul-Laden, JS-Frameworks usw. hassen, darin, dass Sie einfach nicht die Fähigkeit haben, sie richtig zu verstehen?
Wenn Sie all diese neuen Technologien so sehr hassen, sind Sie meiner Meinung nach in der falschen Branche.
Unterstützt das Plugin ‚textExtract‘ dies? Sieht in Ihrem Debugger-Fenster wie ein Inline-Stylesheet aus.
http://www.xanthir.com/blog/b49w0
Das ist, was ich mir unter CSS-Modulen vorstelle. Ich werde einfach warten, bis es in nativem CSS implementiert ist oder es einen Polyfill dafür gibt. Ich sehe mich nicht dabei, das zu tun, was Sie hier getan haben.
Einerseits bin ich versucht, der Skeptiker zu sein, der ich normalerweise bin, und etwas Ähnliches zu schreiben, wie alle anderen bereits geschrieben haben…
Andererseits ist das irgendwie faszinierend. Im einfachsten Sinne scheint es darauf hinauszulaufen, nachdem man all den JS-Kram entfernt und etwas Pseudocode geschrieben hat
foo.css
bar.css
index.html
Während, wenn beide Stylesheets einfach verkettet (oder einfach zusammen eingebunden) würden,
foosowohl die Stile ausfoo.cssals auch ausbar.cssanwenden würde, ohne Trennmöglichkeit.Außer… warum nicht den ganzen Vor-/Nachbearbeitungsschritt aufgeben und einfach Ihre CSS-Klassen benennen?
foo_fooist genauso einfach zu tippen wiefoo.foo, und es erfordert viel weniger Aufwand für die Einrichtung (keine Vor-/Nachbearbeitung, kein unnötiges HTML-Templating usw.).Und keine schrecklichen, hässlichen, was-zur-Hölle-passiert-Klassennamen.
Also, kurz gesagt, es klingt, als ob das, was dieser Artikel beschrieben hat, CSS-Namespacing ist, aber unter Verwendung von Dateinamen anstatt etwas in die CSS-Bezeichner voranzustellen. Verpasse ich etwas?
Nun, ich denke, was ich verpasse, ist die enge Kopplung zwischen CSS und HTML. Mit CSS-Modulen wird es einfacher zu analysieren, welche CSS-Regeln tatsächlich verwendet werden, welche Regeln toter Code sind usw.
Aber, Moment mal… wie zum Teufel benutzt man diese Klassen aus dynamischem Code? Z.B.
foo.toggleClass('active')? Müssen wir uns mit komplizierten JS-Maps von Stilen herumschlagen wiefoo.toggleClass(compiledStylesMap['active']), wobeicompiledStylesMap['active']zu'active_fileName_1234'wird?Mein Kopf tut ein bisschen weh.
Yep! CSS Modules sind im Grunde genommen Build/automatisierte Namensräume.
Das ist eine gute Idee, wenn man in einem kleinen Team arbeitet oder alleine ist und gute Konventionen (BEM, ACSS usw.) praktiziert. Das Problem beginnt, wenn man Entwickler zum Team hinzufügt, die sich nicht daran halten oder keine guten Praktiken haben. CSS Modules erzwingen Namensräume, egal ob das Team es tut oder nicht.
Wie die Klassennamen erscheinen, liegt ganz bei Ihnen. Was oben angezeigt wird, ist nur der Standard oder was auch immer der Autor für dieses Projekt gewählt hat. Sie könnten CSS Modules verwenden und etwas wie
[Dateiname]_[Klassenname]ausgeben und einen Klassennamen genau wie oben beschrieben generieren, ohne darüber nachzudenken oder zusätzliche Arbeit zu leisten, sobald der Build eingerichtet ist. Sie könnten die Namen sogar verschleiern (wie ich oben in meinem Kommentar erwähnt habe) und ein paar Bytes sparen, indem Sie.my-semantic-classfür die Produktion in.aumwandeln, während Sie sicherstellen, dass es immer noch eindeutig ist.Während des Builds. Die Github-Seiten für CSS Modules und PostCSS-Modules gehen detaillierter auf die Dinge ein.
„Das Problem beginnt, wenn man anfängt, Entwickler zum Team hinzuzufügen, die sich nicht daran halten oder keine guten Praktiken haben.“
Das ist ein Versagen im Engineering-Management/Lead und ich bin mir nicht sicher, ob es eine gute Idee ist, eine Technologie wie diese zu verwenden, um die Faulheit und die Unfähigkeit oder mangelnde Bereitschaft der Leute, sich zu organisieren, zu beheben.
Das geht nicht nur um Faulheit oder Unfähigkeit. Leute können auch Fehler machen.
Mit dem Risiko, selbst dogmatisch zu klingen, würde ich argumentieren, dass Automatisierung und Werkzeuge, die unsere Optimierungen für uns erledigen, *immer* eine gute Idee sind. Warum etwas manuell tun und damit das gesamte Team etwas manuell tun lassen, was man automatisch und perfekt konsistent zur Build-Zeit erledigen könnte? Ja, es erhöht die Komplexität, aber wir sprechen hier von Teamprojekten, die es rechtfertigen.
Wenn Sie in einem Team sind, nehme ich an, dass Sie auch andere Optimierungen an Ihrem HTML, JS und CSS wie Minifizierung und Verschleierung automatisch durchführen. Was macht das Benennen Ihrer Klassen während eines Builds zu einem „Versagen im Engineering-Management/Lead“?
Benjamin, kannst du mir ein Beispiel geben, wie man mit den Klassen dynamisch interagiert? Entschuldigung, ich konnte nicht finden, worauf Sie sich bezogen.
Klar, @Agop, schau dir das an -> https://github.com/outpunk/postcss-modules#integration-with-templates
Es enthält einige Beispiele für die Verwendung von Jade (jetzt Pug) und direktem HTML mit PostHTML. Die gleichen Prinzipien gelten für jedes Templating-Setup, das zur Build-Zeit ein JSON-Objekt als Werte aufnehmen kann. Ich persönlich habe es mit JSX und Handlebars verwendet, um statisches HTML zu rendern. Lassen Sie mich wissen, wenn das nicht funktioniert!
Ich habe mich bei „white HTML in javascript“ verloren, lol, komm schon.
Schreibe *
Es tut mir leid, ich verstehe immer noch nicht den Wert von „CSS Modules“. Der Hauptgrund, der hier beworben wird, ist die Vermeidung der Kaskade, was einfach nicht möglich ist, wenn man einen ordentlichen Markup wünscht und CSS auf diesem Markup verwenden möchte. Ich habe meine „Probleme“ hier zusammengefasst: https://helloanselm.com/notes/on-css-modules/.
Wenn Sie reale Erfahrungen mit CSS Modules haben, würde ich gerne wissen, ob meine Punkte im Artikel wahr sind und was Ihr Hauptvorteil bei der Verwendung der Technik/des Tools ist. Danke im Voraus.
Anselm, tolle Antwort. Du hast die gleichen Dinge aufgegriffen wie ich.
Ich habe versucht, aufgeschlossen gegenüber diesem Artikel zu sein, aber ich glaube, ich habe herausgefunden, warum ich mich damit nicht identifizieren kann, als ich den verlinkten Glen Madden Artikel gelesen habe
Ich denke, das trifft den Kern, warum so viele von uns in den Kommentaren nicht mit dem, was vorgeschlagen wird, resonieren. Die Denkweise von CSS Modules geht davon aus, dass CSS als Sprache „kaputt“ ist, weil sie nicht wie andere Sprachen funktioniert. Daher muss sie repariert werden (mit JavaScript), um wie andere Sprachen zu sein.
CSS funktioniert nicht wie andere Sprachen, weil es *entworfen wurde, um eine global anwendbare, weitreichende Sprache zu sein, bei der man mit wenig Aufwand viel bewirken kann*.
CSS ist eine mächtige Sprache, die viel Training und Erfahrung erfordert, um sie gut zu beherrschen. Selbst wenn CSS Modules einen praktischen Zweck haben, argumentiert dieser Artikel aus der Perspektive „Programmieren ist schwer, und Code pflegen ist schwerer, also hier ist eine Abkürzung“, was nicht der Weg ist, die Herzen und Köpfe von CSS-Experten zu gewinnen.
Ich genieße jedoch eine zum Nachdenken anregende Diskussion, also ein guter Artikel in dieser Hinsicht.
@Kevin Powell, die Probleme, mit denen wir heute konfrontiert sind, sind nicht dieselben wie vor 20 Jahren. Heute wird das Web zum Erstellen von Webanwendungen, Hybridanwendungen und sogar Desktop-Anwendungen verwendet. Das ist das Problem von CSS. Jetzt müssen wir CSS im großen Maßstab lösen. JavaScript hat sich in diesen Jahren weiterentwickelt, um sein Skalierbarkeitsproblem zu lösen, jetzt ist es an der Zeit, dass CSS dasselbe tut.
Selbst für wirklich große Websites und Web-Apps in großen Frontend-Teams hatte ich nie ein Problem mit der Skalierbarkeit von CSS (oder wie Leute es gerne nennen: „CSS im großen Maßstab“). Es erfordert mehr Aufwand und viel mehr Disziplin, wiederverwendbaren, modularen Code zu schreiben, der in großen Teams klein ist, aber das ist die Aufgabe einer Person, die CSS schreibt.
Es gibt eine Ausnahme, bei der Sie Recht haben, Matteo, und das sind „Desktop-Apps“. In diesem Szenario, in dem wir über eine Desktop-App sprechen, die CSS nicht über das Netzwerk herunterladen muss, ist die Dateigröße nicht mehr so kritisch. Aber andererseits möchte man auch keine aufgeblähte, langsame App (ich sage nicht, dass „CSS Modules“ langsam sind, das hängt ganz davon ab, wie es verwendet wird). Wenn Sie reale Erfahrungen damit haben, wo CSS im großen Maßstab schlecht ist, sagen Sie es mir. Ich habe nicht viel gefunden, außer der Notwendigkeit von Element-Queries für meine Module (was wirklich nützlich wäre, aber insgesamt keine Voraussetzung ist, damit es funktioniert).
Hallo Team,
Das ist eine starke Diskussion – für mich ein Beweis dafür, dass es sich lohnt, darüber zu sprechen.
Das wäre ein guter Zeitpunkt, um zu üben, nicht dogmatisch zu denken, und sich daran zu erinnern, dass das Web ein großer Ort mit vielen Wegen ist, Dinge zu tun (manchmal dieselben Dinge).
In der Tat.
Ich erinnere mich an die Negativität rund um Angular, als die Leute feststellten, dass es darum ging, JavaScript in HTML-Attribute einzubauen (ganz zu schweigen von einigen von uns, die nicht standardmäßige HTML-Tags verwendeten). Viele Leute sagten, dass CSS-Präprozessoren niemals durchstarten würden. Angular und SASS haben sich jedoch ziemlich gut entwickelt, und ich kann mir nicht vorstellen, wieder darauf zu verzichten.
All das gesagt, persönlich bin ich kein Fan davon, weil ich es hässlich finde und zu viele Kompromisse erfordert. Ich denke jedoch, dass es notwendig ist, und ich denke, eine bessere Lösung wird kommen, auch wenn wir auf die WC3/Browser-Hersteller warten müssen, um eine ordentliche CSS-Modules-Spezifikation zu entwickeln.
Danke für die klaren Erklärungen Robin, +1 dazu.
Ein paar Anmerkungen zum Konzept, NICHT zum Artikel oder Robin
Das Konzept von CSS Modules: 110 % absolut gültig.
Implementierung von CSS Modules: Komplette Katastrophe.
Ich liebe das:
class="_type__display_0980340 _type__serif_404840"„BEM nicht erforderlich“ – BEM ist niemals erforderlich :)
Das Verschieben von CSS in JavaScript wird die Webdesign- und Entwicklungsberufe nur weiter fragmentieren.
Ist die Lösung dieses „Global Scope in CSS“-Problems wirklich SO wichtig? Ist es überhaupt ein Problem?
Ist „compose“ nicht eine Eigenschaft und kein Schlüsselwort?
Aus den anderen Kommentaren hier, insbesondere von Kevin Powell, scheint es, dass CSS-Module einfach den mächtigen globalen Scope von CSS entfernen (der Grund, warum es erstellt wurde), um ein Problem zu lösen, das die Leute haben – keinen organisierten Code zu haben, keine Best Practices zu befolgen. Natürlich ist unsere Welt nicht perfekt und daher auch nicht unser Coding, aber ich denke, das fügt eine enorme Komplexität für sehr wenig Gewinn hinzu.
Ich bin überrascht, dass so viele Leute den Sinn von CSS Modules verpasst haben.
CSS-Selektoren sind wie eine API, die HTML verwenden kann, um eine bestimmte Stilart anzuwenden.
CSS Module schlägt eine Lösung vor, um das Problem von Namenskollisionen, Kapselung und besserem Management von Stilkompositionen zu lösen.
Cleverer Ansatz, aber nicht in allen Situationen notwendig.
Ich möchte einen Punkt ansprechen, den ich bisher in den Kommentaren noch nicht gesehen habe.
Meine größte Sorge, abgesehen von der Erhöhung der Gesamtkomplexität, ist das Gewicht der endgültigen Webseiten. Obwohl dies für kleinere Websites mit wenig Inhalt kein besonders großes Problem darstellen mag, kann es dies sicherlich für Single Page Applications tun, bei denen Inhalte dynamisch und ständig angefordert werden (z. B. Twitter, Facebook), da Sie diese Daten bei jeder Anfrage vom Server abrufen. (Kleiner ist besser?)
Jeder Charakter im Klassenattribut ist ungefähr gleich 1 Byte (UTF-8), vorausgesetzt, der Charakter liegt im ASCII-Bereich, und die Menge der mit dieser Methode generierten Zeichen kann sich potenziell mindestens verdoppeln, wenn nicht mehr. Abhängig davon, wie Sie Ihre Website strukturieren und wie oft Sie Klassen verwenden möchten, wird das Gewicht der Seite mit Sicherheit zunehmen. Dies ist besonders besorgniserregend für mobile Geräte, da Sie in der Regel die Daten des Nutzers nicht unnötig aufbrauchen möchten.
Ich werde die folgenden Artikel im Auge behalten, da ich sehen möchte, wohin das führt. Möglicherweise bin ich voreingenommen aufgrund von mangelndem Verständnis. So wie ein Bild tausend Worte sagt, so auch ein praktisches Beispiel.
Die Größe der Klassen ist im Allgemeinen kein Problem, besonders da Sie wahrscheinlich alles Gzippen sollten, was weitaus wichtiger und vorteilhafter ist. Das gesagt, die tatsächlichen Klassennamen liegen komplett bei Ihnen. Sie können das Format angeben oder sie sogar verschleiern (
.my-semantic-class->.A), wenn Sie möchten. Sie können mehr auf den Github-Seiten für CSS modules und PostCSS-Modules lesen.Ich bin ein bisschen begeistert davon, hier und da ein paar Bytes zu sparen, also habe ich ein Tool namens SweatMap entwickelt, das sehr gut mit CSS Modules funktioniert und es mir ermöglicht, die oben erwähnte Verschleierung durchzuführen.
Ja, es mag Potenzial geben. Aber mit solch albernen Beispielen ist es schwer, bald ein Gläubiger zu werden.
Ich glaube, im Titel fehlt ein „nicht“.
Moment, was ist mit anderen Selektoren wie
:nth-child(x)oder[foo=bar]? Was ist mit Geschwisterselektoren? Was ist mit Verschachtelungen (z.B..no-js .foo {})?Für mich gibt es hier keinen Bedarf an CSS. Das sind keine „CSS-Module“. Man könnte sie genauso gut „SDL-Module“ – „Style Definition Language-Module“ – nennen.
Ich habe das in einer React-App verwendet. Es ist definitiv interessant und es ist immer gut, neue Dinge auszuprobieren. Aber was mir nicht gefallen hat, war, dass man reines HTML in den JS-Dateien schreiben musste. Außerdem ist HAML afaik nicht möglich, was für mich ein großer Dealbreaker ist (eingezogene Syntax FTW). Afaik SASS-Syntax wird nicht unterstützt, daher kann man SASS-Mixins nicht verwenden. Aber insgesamt finde ich die Stärke von CSS darin, dass man wiederverwendbare Stile schreiben kann, die von jedem Element innerhalb der Anwendung verwendet werden können. Dieser Ansatz fördert das nicht. Außerdem gefiel es mir nicht, dass CSS über das gesamte Projekt verteilt ist, anstatt alles an einem Ort. Das mag für manche Leute Vorteile haben, aber es gefiel mir nicht (Meinung). Ich bin auch kein Fan von diesen hässlichen langen zufälligen Klassennamen. Das macht das Debugging sehr schwierig.
Um das Problem kollidierender Klassennamen zu lösen, denke ich, dass die Verwendung der richtigen Architektur und die Einhaltung von Best Practices (kombiniert mit einer Methode wie BEM) die bessere Wahl ist.
Hallo! Ich wollte nur wissen, welches Thema für DevTools Sie verwenden.
Oh nein, noch mehr Komplexität in einfachem HTML/CSS. Es scheint mir, dass CSS Modules dazu da sind, organisierte CSS-Stile zu erstellen, weil der Entwickler schlampig ist. Ich denke, der Fokus sollte darauf liegen, dass Entwickler organisierten Code schreiben und aufhören, sich auf Dinge wie diese zu verlassen, um ihn für sie zu organisieren. Außerdem ist es bei so vielen verschiedenen Vorgehensweisen ein Albtraum, wenn jemand ein Webprojekt übernimmt, das mit den verwendeten Entwicklungswerkzeugen nicht vertraut ist.
Wird das Sehen von „_styles__title_309571057“ im Chrome Inspector mir helfen, Probleme zu debuggen?
LOL.
Das ist kein Fehler, das ist ein Feature. **Kaskadierende** Stylesheets, jemand?
Hört auf zu kämpfen! Lernt, die Kaskade zu lieben.
Ich schätze, Selektoren wie „:root“ werden nicht funktionieren (dasselbe gilt für Googles Polymer, zum Beispiel)
Glauben Sie mir, das wird mehr Sinn ergeben, sobald Sie mit React zu arbeiten beginnen. Schauen Sie sich React Starter Kit für diejenigen an, die wissen wollen, wovon ich spreche.
Das ist ein interessanter, wenn auch esoterischer Trick. Er ist gut für kleine schmutzige Hacks, aber für jemanden, der CSS richtig organisieren und codieren kann, scheint es, nun ja, eine eigenartige Methode zu sein. Alles, wozu er gut ist, ist die Behebung schlechter HTML-Strukturen – indem er sie komplizierter macht. Besonders mit SASS usw. und Vorgängern ist diese Methode fast selbstredundant.
Und was ist, wenn es kein JS gibt – das Ganze bricht sowieso zusammen :-)
Was Jason Knight ^^^ sagte ;-)
Anscheinend ist das Endziel dieser Artikelserie, wie man innerhalb von React arbeitet. Vielleicht wäre es eine gute Idee, den Titel in „Was sind CSS Modules und **warum brauchen wir sie für React**“ zu ändern? Der aktuelle Titel neigt dazu, eine dogmatische Herangehensweise zu vermitteln…
Stimme zu!
Wenn Sie jemals an einer Unternehmensanwendung gearbeitet haben, bei der Teile von Hunderten von Anbietern verwendet und individuell gestaltet wurden, werden Sie verstehen, wie großartig das ist.
Das ^. Der Mehrwert von CSS Modules ist proportional zur Größe der Codebasis und der Anzahl der beteiligten Personen.
…dann muss der Artikel umbenannt werden in „Was sind CSS Modules und warum brauchen wir sie in einer Unternehmensanwendung?“. Das richtige Werkzeug und die richtige Technik für den Job sind in dieser Situation so gut anwendbar. Wie die Mehrheit der Kommentare bezeugt, ist dies einfach keine praktische Methode, die globale Stärke von CSS zu nutzen (wie Kim Joy Fox/Kevin Powell betonten).
Absolut einverstanden mit dem Mantra des richtigen Werkzeugs für den Job. Das Problem ist, dass die globale Stärke von CSS bei einer bestimmten Größe eher zu einer großen Belastung als zu einem Vorteil wird.
CSS-Module
Die Vorteile: Namensräume. Sehr nützlich, aber leicht durch Standard-Best Practices von absteigenden Selektoren, Verschachtelung in einem Präprozessor oder einem manuellen Namenskonventionenschema, wenn Sie bevorzugen (BEM, etc.). Die Bemühungen wären besser investiert, um Namensräume in die CSS-Spezifikation aufzunehmen!
Die Kosten: stark erhöhte Komplexität, schlechte Rendering-Leistung (nur natives CSS wird vor JavaScript angewendet), CSS-Bloat durch wiederholte CSS-Eigenschaften über Module hinweg, die früher global waren.
Zuerst einmal bin ich nicht gegen Veränderungen. Im Gegenteil, ich nutze und umarme viele der neuen Werkzeuge und Muster, einschließlich JS als View-Engine (wie React), unveränderliche Daten, Transpilieren, Vorverarbeiten, Build-Tools usw. Ich habe objektiv über CSS-Module nachgedacht, aber am Ende halte ich es für einen schrecklichen Fehler und hoffe, dass es sich nicht sehr weit verbreitet.
Ich kann garantieren, dass der Hauptgrund, warum dies der Webentwicklungs-Welt aufgedrängt wird, darin besteht, dass Informatikstudenten, die kaum über Frontend-Belange gesprochen haben, mit möglichst wenig CSS-Kenntnissen ins Frontend einsteigen können. Denken Sie darüber nach. Dies kommt dank der Einstellungs-/Teamzusammensetzungsentscheidungen von HR/Finanzabteilungen großer Unternehmen auf uns zu. Haben Sie es bemerkt? In den letzten Jahren haben sie Leute, die wirklich GUT in HTML/CSS waren (entweder durch Abgang oder anderweitig), durch diejenigen ersetzt, die Software-Ingenieure sind. Sie haben dies erreicht, indem sie a) Werkzeuge verwenden, die die Notwendigkeit tieferer HTML/CSS-Kenntnisse abstrahieren, wie Bootstrap oder Drittanbieter-Themes, und b) aufgrund der responsiven Revolution sind aktuelle Trends in UI/UX vereinfacht und erfordern weniger spezialisierte Kenntnisse. Dies sind die Ingenieure, die Artikel wie diesen schreiben und sie hauptsächlich evangelisieren.
Ich sage nicht, dass mit diesen Jungs etwas falsch ist. Aber viele von ihnen verstehen nicht tiefgreifend, dass das, was für die Anwendungslogik gut ist, nicht immer im besten Interesse der Arbeitsweise von Design ist. Einerseits profitiert Design von einem aufgeräumten Gerüst. Je mehr Technik und Boilerplate im Weg ist, desto mehr muss das Gehirn verarbeiten. Persönlich, und ich glaube, ich spreche für andere, sehe ich zwar zusätzliche Struktur und verstehe oft ihren Wert, aber sie kann auch den kreativen Prozess so verstopfen, dass die zusätzliche Effizienz am Punkt der sinkenden Renditen angelangt oder darüber hinaus ist.
Software-Ingenieure lernen, dass der globale Namespace ein Übel ist, als Mantra, vom ersten Tag an. Das ist im Allgemeinen bei Programmiersprachen wahr... nicht nur wegen Kollisionen mit Ihrem eigenen und Drittanbieter-Code, sondern in Javascript auch mit dem Kernobjekt des globalen Geltungsbereichs. Aber in CSS sind die Bedenken anders als bei einer Programmiersprache. Vererbung ist standardmäßig keine schlechte Sache, da viel Vererbung benötigt wird. Design ist Marke. Marke muss einheitlich sein und daher ist die Kaskade Ihr Freund, nicht Ihr Feind.
Das gesagt, natürlich brauchen wir Schutz vor Namenskollisionen in CSS, also warum nicht direkt in CSS einbauen? Abgesehen von der Fähigkeit, absteigende Selektoren zu zähmen, befürworte ich auch die Idee von Webkomponenten, die vor der Kaskade geschützt sind. Aber der Unterschied ist, dass ich als jemand, der regelmäßig komplexe Benutzeroberflächen großer Anwendungen von Grund auf neu erstellt ;-), glaube, dass ein globaler Ansatz zuerst in CSS der richtige Ansatz ist. Den Leuten einzureden, dass global in CSS schlecht ist, wird mehr Schaden als Nutzen anrichten und garantiert zu vielen ruinierten Marken führen… (d.h. ein H1, das auf einer „Komponente“ 30 Pixel groß ist, aber auf einer anderen 32 Pixel, usw. usw.).