Die unterschiedlichen Perspektiven auf CSS-in-JS

Avatar of Chris Coyier
Chris Coyier am

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

Manche Leute hassen die Idee von CSS-in-JS von Grund auf. Allein der Name ist beleidigend. Ein klares Nein. Styling gehört nicht in JavaScript, sondern in CSS, etwas, das bereits existiert und auf das Browser optimiert sind. Trennung der Belange. Alles andere ist ein lächerlicher Fehltritt, ein Zeichen dafür, dass man nicht aus den Fehlern der Vergangenheit gelernt hat (wie das <font>-Tag und Ähnliches).

Manche Leute lieben die Idee von CSS-in-JS von Grund auf. Die räumliche Nähe von Templates und Funktionalität, wie in den meisten JavaScript-Frameworks, hat sich für sie als erfolgreich erwiesen, daher scheint das Einbinden von Styles ein natürlicher Schritt zu sein. Die Single-File-Komponenten von Vue sind hier ein Archetyp.

(Hier ist ein Video über CSS-in-JS, das ich mit Dustin Schau gemacht habe, falls du eine Einführung brauchst.)

Brent Jackson denkt, du solltest es definitiv lernen, bietet aber auch einige pragmatische Punkte dazu, was es tut und was nicht.

Was macht CSS-in-JS?

  • Ermöglicht das Schreiben von CSS in JavaScript-Syntax
  • Räumliche Nähe von Styles zu Komponenten
  • Nutzung nativer JS-Syntaxfunktionen
  • Nutzung von allem aus dem JS-Ökosystem

Wovon befreit dich CSS-in-JS nicht von der Notwendigkeit zu verstehen?

  • Wie Styles auf das DOM angewendet werden
  • Wie Vererbung funktioniert
  • Wie CSS-Eigenschaften funktionieren
  • Wie CSS-Layout funktioniert

CSS-in-JS entbindet dich nicht davon, CSS lernen zu müssen. Meistens jedenfalls.

Ich habe viel Gegenwind gegen CSS-in-JS gehört, in der Art von „ihr Leute greift zu CSS-in-JS, weil ihr CSS nicht versteht“ oder „Ihr macht das, weil ihr Angst vor der Kaskade habt. Ich weiß bereits, wie man CSS scopet.“ Ich finde solche Sachen eher als Sticheleien über die Gänge, die nicht besonders hilfreich sind.

Laura buns hat einen wunderbar zweiseitigen Artikel mit dem Titel „The web without the web“, von dem ein Teil über React und CSS-in-JS handelt.

Ich hasse React, weil CSS-in-JS-Ansätze standardmäßig dazu ermutigen, völlig in sich geschlossene Einzelkomponenten zu schreiben, anstatt zu versuchen, eine UI einer Website als Ganzes aufzubauen.

Du musst CSS-in-JS nicht verwenden, nur weil du React verwendest, aber es ist beliebt, und das ist eine sehr interessante und faire Kritik. Wenn du alles scopest, setzt du dich dann nicht einem höheren Risiko der Inkonsistenz aus?

Ich bin bisher ein Fan von CSS-Modulen, da es so leichtgewichtig ist, wie man bei CSS-in-JS nur sein kann, und nur das Scoping und die räumliche Nähe behandelt, das ist alles. Ich benutze es mit Sass, damit wir Zugriff auf Mixins und Variablen haben, die die Konsistenz fördern, aber ich kann mir vorstellen, wie es dazu führen könnte, in gefährliches Gebiet mit zu vielen Einzelteilen zu rutschen.

Und doch wären sie wegwerfbare Einzelteile. Code-splittbare Einzelteile. Alles existiert im Gleichgewicht.

Laura sagt weiter, dass sie CSS-in-JS-Ansätze wegen der Macht und Flexibilität, die sie bieten, mag.

Ich mag die Art und Weise, wie CSS-in-JS dir genug Abstraktion bietet, um weiterhin Tricks wie Blind-Eulen-Selektoren zu verwenden, und dir gleichzeitig die volle Kraft von JS gibt, um Dinge wie Container-Abfragen zu tun.

Martin Hofmann hat eine Seite erstellt, die BEM vs. Emotion vergleicht, die eine kleine „Alert“-Komponente betrachtet. Ich mag, wie es ein emotionsloser (buchstäblich, nicht im Bezug auf die Bibliothek) Vergleich ist, der die Syntax betrachtet. BEM hat einige Vorteile, insbesondere dass keine Werkzeuge benötigt werden und es leicht auf jedes Webprojekt übertragen werden kann. Aber der Emotion-Ansatz ist in vielerlei Hinsicht sauberer und sieht einfacher zu handhaben aus.

Ich würde gerne mehr emotionslose Vergleiche der Technologien sehen. Wahl A macht diese drei Dinge gut, ist aber hier und da schmerzhaft, während Wahl B diese anderen Dinge gut macht und ein paar andere Schmerzpunkte löst.

Wir haben kürzlich Scotts Jehl’s Beitrag verlinkt, der sich mit dem asynchronen Laden von CSS befasst. Scotts Eröffnungszeile:

Eines der wirkungsvollsten Dinge, die wir tun können, um die Seitenleistung und Ausfallsicherheit zu verbessern, ist das Laden von CSS auf eine Weise, die die Seitenrendern nicht verzögert.

Es ist bemerkenswert, dass ein reiner CSS-in-JS-Ansatz diese Fähigkeit auf natürliche Weise erhält, da das Styling in JavaScript gebündelt ist. Es ist zu einem Preis gebündelt. Ein Preis für die Leistung. Aber wir bekommen einen Teil dieser Kosten zurück, wenn wir andere rendern-blockierende Dinge eliminieren. Das sind interessante Dinge, die zumindest weitere Daten verdienen.

Ich werde vielleicht Prügel dafür einstecken, aber ich bin ein wenig weniger interessiert an Konversationen, die versuchen, CSS-in-JS dafür verantwortlich zu machen, dass die Eintrittsbarriere in die Branche erhöht wird. Das ist eine massive Sache, die man berücksichtigen muss, aber wir reden nicht davon, CSS abzuschaffen und alle zu einer anderen Sprache zu zwingen. Wir reden über Nischenbibliotheken für bestimmte Arten von Projekten in bestimmten Größenordnungen.

Ich denke, es lohnt sich, einen Blick auf CSS-in-JS-Ideen zu werfen, wenn...

  • Sie sowieso an einem komponentenlastigen JavaScript-Projekt arbeiten.
  • Sie bereits Templates, Funktionalität und Datenabfragen räumlich zusammenlegen.
  • Sie glauben, dass Sie es nutzen können, ohne die Benutzererfahrung zu beeinträchtigen, z. B. indem Sie woanders Geschwindigkeit gewinnen.
  • Ihr Team mit der erforderlichen Technologie vertraut ist, d. h. Sie stoßen keine Talente ab.

Max Stoiber ist ein uneingeschränkter Fan. Sein Beitrag zu diesem Thema spricht von dem Vertrauen, das dieser Stil ihm gibt, und der Zeit, die er spart, um das zu finden, was er braucht, beides Dinge, die ich als wahr empfunden habe. Aber er denkt auch, dass der Ansatz speziell für JavaScript-Framework-Anwendungen ist.

Wenn Sie ein JavaScript-Framework zum Erstellen einer Webanwendung mit Komponenten verwenden, ist CSS-in-JS wahrscheinlich eine gute Wahl. Besonders wenn Sie Teil eines Teams sind, in dem jeder grundlegendes JavaScript versteht.

Ich würde gerne Ihre Gedanken dazu in den Kommentaren hören. Haben Sie Ihre Gefühle dazu sortiert? Verrückt verliebt? Vor Abscheu kochend? Ich wäre am meisten daran interessiert, Erfolgsgeschichten oder Misserfolgsgeschichten von echten Projekten zu hören.