Sie wissen, wie man Dinge in CSS-Präprozessoren `extend` kann? (Wenn nicht, können Sie hier mehr darüber erfahren.) Sass kann das. LESS kann das. Stylus kann das. Obwohl es eine Funktion ist, mit der man vorsichtig sein sollte (siehe hier und hier), finde ich es manchmal ziemlich nützlich.
Bei einem kürzlichen CodePen Meetup in Chicago hörte ich Sam Allan einen kurzen Vortrag über die Fähigkeit von LESS, `(reference)`-Importe durchzuführen, was ich noch nie zuvor gesehen hatte.
Sie sehen so aus:
/* Normal import */
@import "colors-or-whatever.less";
/* Reference import */
@import (reference) "less-for-reference.less";
Ein normaler Import holt den Inhalt dieser Datei und fügt ihn in die Datei ein, die ihn anfordert. Super nützlich. Das Verketten von Dateien ist eine sehr wichtige Funktion von Präprozessoren. Ein `(reference)`-Import tut das nicht. Tatsächlich fügt er *überhaupt nichts* in die anfordernde Datei ein. Der Code in dieser Datei ist nun einfach verwendbar, entweder durch Aufrufen eines Mixins darin oder durch Erweitern eines Selektors darin.
Das ist ein ziemlich mächtiges Konzept. Es bedeutet, dass man eine ganze Bibliothek importieren und nur die Teile verwenden kann, die man möchte.
Wollten Sie jemals ein CSS-Framework oder eine Bibliothek verwenden, fanden es aber zu viel?
Das heißt, ein Haufen Code, von dem Sie nicht denken, dass Sie ihn jemals verwenden werden. Die Einbeziehung der gesamten Bibliothek scheint übertrieben, ganz zu schweigen davon, dass sie nicht ideal für die Leistung ist. Sie könnten ihn selbst auseinandernehmen, aber dann macht das irgendwie den Upgrade-Pfad kaputt.
Mit `(reference)`-Importen können Sie alles importieren, was Sie wollen, und dann nur die Teile davon erweitern, die Sie möchten. Es mag seltsam sein, aber Sie könnten eine Reihe von Bibliotheken importieren und nur Teile auswählen, um genau den benötigten Output zu erhalten.
Beispiel
Sagen wir, Sie mögen Pure CSS wirklich. Mattia Migliorini hat einen Port davon in LESS. Es ist voller guter Dinge, aber es sind 33 KB und vielleicht brauchen Sie nicht alles davon.
Darin befindet sich eine Klasse `.pure-button`, Pure CSS' Variante für Buttons. Wenn Sie sie verwenden möchten, könnten Sie das so tun:
@import (reference) "https://s3-us-west-2.amazonaws.com/s.cdpn.io/18728/pure.less";
.my-button {
&:extend(.pure-button all);
}
Und hey, ich kann meine Version nennen, wie ich will. Und wenn die Bibliothek aktualisiert wird, aktualisiere ich sie einfach. Vorausgesetzt, die Namen haben sich nicht geändert, erhalte ich die Änderungen.
(Das `all`-Schlüsselwort, das Sie oben sehen, bedeutet "erweitere auch all seine verschachtelten Dinge", und das ist völlig optional, was eine weitere ziemlich coole Sache ist, die LESS-Erweiterungen können.)
Hier ist diese Demo:
Siehe den Pen GpjzOj von Chris Coyier (@chriscoyier) auf CodePen.
Mehr
Nochmal, Dank an Sam Allan, der mir das gezeigt hat. Er hat weitere Demos zu diesem Thema. Einige davon nennt er "Semantisches Neuzuordnen", weil er Selektoren verwendet, die seiner Meinung nach semantisch angemessener sind als die der ursprünglichen Bibliothek.
Siehe den Pen Semantisches Neuzuordnen — Framework Centipede Beispiel von dehuszar (@dehuszar) auf CodePen.
Großartig! Dieser Trick wird helfen, die Gesamtgröße meiner Haupt-CSS-Datei drastisch zu reduzieren.
Uowwwww, Glückwunsch Mann!!!
Toller Artikel. Ich hatte noch nie Imports mit Referenzen verwendet, jetzt sehe ich, wie nützlich das ist.
(Entschuldigung für mein Englisch)
Es sieht so aus, als hätten die Leute schon eine Weile mit SASS darüber gesprochen https://github.com/sass/sass/issues/1094
Es ist interessant zu sehen, wie LESS und SASS um die Aufmerksamkeit der Entwickler konkurrieren. Ich dachte, LESS sei SASS in Bezug auf Funktionen unterlegen (und es gibt wohl mehr SASS-Projekte), aber in diesem Fall hat LESS etwas getan, was SASS noch nicht getan hat.
Wenn es doch nur ein UI-Framework mit vernünftigen Standardeinstellungen gäbe, das nicht semantisch neu zugeordnet werden müsste...
Ich empfand das schon früh in meiner Erkundung dessen, was man mit diesem einfachen Trick alles machen kann, so, aber ich denke tatsächlich, dass es einen großen Wert darin gibt, wenn Ihr Framework visuelle und Utility-Klassen verwendet, um zu beschreiben, was Sie implementieren. Sie sind tendenziell nicht semantisch. Aber mit diesem Trick ist es ziemlich einfach, BEM, SuitCSS oder ACSS zu verwenden, um Ihre Komponenten zu definieren und sie einfach den framework-spezifischeren Klassen zuzuordnen.
Ich gehe hier genauer auf Details ein hier.
Ups. Schlechter Link. Versuchen Sie es stattdessen mit diesem.
Großartig. CSS-Bloats sind für uns zu einem Problem geworden, seit wir LESS als unseren Präprozessor verwenden. Das sollte definitiv helfen.
Liebe die Idee. Ich wünschte, ich sehe etwas Ähnliches in der nächsten Sass-Version. Gut geschrieben Chris, wie immer!
Kann Stylus das nicht? Zumindest seine Plugins. Und soweit ich weiß, sind Stylus-Plugins einfach .styl-Dateien, die Sie importieren und dann die benötigten Funktionen aufrufen.
Hallo Chris. Das ist nett :)
Und sowieso ist es auch möglich, mehrere Import-Optionen zusammen zu verwenden.
Abgesehen davon, dass sie Referenzen sind, sind Klassen in library.css jetzt als LESS-Mixins wiederverwendbar.
Hey Chris! Danke für die Erwähnung, sehr geschätzt.
Ich sollte bald einen Folgeartikel zu den Sass/Stylus/PostCSS-Versionen der Strategie veröffentlichen.
Das ist wirklich raffiniert. Ich empfinde das auch so bei Grids von Frameworks. Ich würde gerne Bootstrap nehmen und sagen: "Schau, hier ist ein Verhalten, das ich möchte (col-xs-6 col-md-4 col-lg-3)." Ich benutze es immer in genau dieser Kombination. Ich würde es gerne .box oder was auch immer nennen. Gib mir nicht das gesamte Grid. Gib mir nur dieses Verhalten. Genial!
Der erwähnte Folgeartikel steht noch aus, aber ich habe ihn verschoben, um PostCSS Reference veröffentlichen zu können, das das oben beschriebene Konzept in die PostCSS-Welt bringt.