PostCSS gebruiken met BEM- en SUIT-methodologieën

In deze tutorial zullen we leren hoe we PostCSS kunnen gebruiken om de ontwikkeling van BEM / SUIT CSS-stijl eenvoudiger en efficiënter te maken.

Deze twee methoden bevatten een naamgevingsconventie voor klassen die het gemakkelijker maakt om uw stijlen strak functioneel te houden en helpt andere ontwikkelaars het doel van verschillende klassen te herkennen, net zoals ze worden genoemd.

BEM was de voorloper van dit type methodologie voor naamgeving van klassen, gemaakt door Yandex. De SUIT-methodologie is een benadering op basis van BEM, maar met enkele aanpassingen en toevoegingen door Nicholas Gallagher. SUIT doet alles wat BEM doet, maar voor veel gebruikers wordt het als een verbetering beschouwd.

Het werken met deze methoden helpt zeker om betere, beter gestructureerde CSS te produceren. Het lastige is echter dat het vermoeiend kan worden handmatig de klassenamen uit te typen die in deze structuur vereist zijn, en bijhouden hoe klassen onderling verband houden, een beetje hoofdpijn kunnen worden. 

De postcss-bem-plugin van Malte-Maurice Dreyer lost deze problemen op door een combinatie van snelkoppelingen en nesten, die u zult leren gebruiken terwijl we door deze zelfstudie gaan.

Maar laten we eerst een snelle inleiding geven op de BEM- en SUIT-methoden, om er zeker van te zijn dat u een duidelijk beeld hebt van de voordelen van het gebruik van de postcss-bem-plugin en van de manier waarop deze wordt gebruikt.

Snelle primer op BEM

Blok

In BEM blokken zijn high-level brokken van een ontwerp; de bouwstenen van waaruit de site is gemaakt. Een blok moet een stuk van uw site zijn dat onafhankelijk is van andere stukken en in theorie overal in uw lay-out kan worden geplaatst, zelfs genest binnen een ander blok.

Het zoekformulier 'blokken' op uw site kan bijvoorbeeld de klasse gebruiken .zoekformulier.

Element

Een element in BEM is een subsectie binnen een blok. Ze worden aangeduid door een onderstrepingsteken toe te voegen __ scheidingsteken en een elementnaam voor de naam van het bovenliggende blok.

Een zoekformulier kan bijvoorbeeld kop-, tekst- en verzendknoppen bevatten. Hun klassennamen kunnen zijn .search-form__heading.search-form__text-field en .search-form__submit-knop respectievelijk.

wijziger

EEN wijziger wordt toegepast op een blok of element om een ​​wijziging in de presentatie aan te geven, of een wijziging in de staat ervan. Ze worden aangeduid door een scheidingsteken en een modificator toe te voegen aan het blok of element in kwestie.

In de officiële BEM-sitedocumenten staat dat de modifier-scheidingstekens een enkel onderstrepingsteken moeten zijn _. In de "BEM-achtige" conventie van CSS-richtlijnen door Harry Roberts worden echter twee streepjes gebruikt -- en is waarschijnlijk meer algemeen gebruikt en bekend dan de officiële BEM-conventie.

In een ontwerp wilt u bijvoorbeeld geavanceerde zoekformulieren anders presenteren dan gewone zoekformaten en daarom de modificatieklasse maken .-Search form_advanced (officiële BEM) of .search-vorm - advanced (BEM-achtige).

In een ander voorbeeld wilt u mogelijk het uiterlijk van het formulier wijzigen vanwege een wijziging in de staat, bijvoorbeeld als ongeldige inhoud zojuist is ingediend en dus de modifier maken .search-form_invalid (officiële BEM) of  .search-vorm - ongeldig (BEM-achtige).

Quick Primer op SUIT

SUIT omvat nutsbedrijven en Components. Binnen componenten kan er zijn modifiers, nakomelingen en Staten.

SUIT gebruikt een combinatie van pascal-behuizing (PascalCase), camelcase (camelCase) en streepjes. De conventies dwingen een limiet af op het soms verwarrende aantal streepjes en onderstrepingstekens die kunnen voorkomen in BEM. Bijvoorbeeld de BEM-klasse .search-form__text-field zou zijn .Zoekformulier-textField in pak.

Nut

nutsbedrijven handvatstructuur en positionele styling, en zijn zo geschreven dat ze overal in een component kunnen worden toegepast. Ze worden voorafgegaan door u- en geschreven in kamelengeval. Bijvoorbeeld, .u-Clearfix.

bestanddeel

EEN bestanddeel in SUIT neemt de plaats in van een blok in BEM. Componenten worden altijd in pascal-geval geschreven en maken alleen deel uit van SUIT dat gebruik maakt van pascal-case, waardoor ze gemakkelijk te identificeren zijn. Bijvoorbeeld, .Zoekformulier.

Component Namespace

Componenten kunnen optioneel worden voorafgegaan door een naamruimte en een enkel streepje NMSP- om te verzekeren dat conflicten worden voorkomen, b.v.. .mine-zoekformulier.

afstammeling

EEN afstammeling in SUIT vervangt een element in BEM. Het gebruikt een enkel streepje - en is geschreven in kamelengeval. Bijvoorbeeld .Zoekformulier-titel.Zoekformulier-textField en .Zoekformulier-submitButto.

wijziger

SUIT gebruikt modifiers net als BEM, maar hun rol wordt strakker gecontroleerd. Een SUIT-modifier wordt over het algemeen alleen rechtstreeks op een component toegepast, niet op een afstammeling. Het moet ook niet worden gebruikt om staatsveranderingen te vertegenwoordigen, aangezien SUIT een speciale naamgevingsconventie voor staten heeft.

Veranderingen zijn geschreven in een geval van een kameel en worden voorafgegaan door twee streepjes --. Bijvoorbeeld,  .Zoekformulier - advanced.

Staat

Staat klassen kunnen worden gebruikt om wijzigingen in de status van een component weer te geven. Hierdoor kunnen ze duidelijk worden onderscheiden van modifiers, die de wijziging van het basisuiterlijk van een component weerspiegelen, ongeacht de status. Indien nodig kan een toestand ook worden toegepast op een nakomeling.

Staten worden voorafgegaan door is- en zijn geschreven in kamelen geval. Ze worden ook altijd geschreven als aangrenzende klassen. Bijvoorbeeld  .SearchForm.is-ongeldig.

Stel uw project in

Nu dat je de essentie van BEM en SUIT hebt, is het tijd om je project in te stellen.

Je hebt een leeg project nodig met Gulp of Grunt, afhankelijk van je voorkeur. Als je nog geen voorkeur hebt voor Gulp, raad ik Gulp aan, omdat je minder code nodig hebt om dezelfde doelen te bereiken, dus je zou het wat eenvoudiger moeten vinden om met Gulp te werken.

U kunt lezen over het instellen van Gulp- of Grunt-projecten voor PostCSS in de vorige zelfstudies

  • PostCSS snelstartgids: Gulp instellen of
  • PostCSS-snelstartgids: Gromde opstelling

respectievelijk.

Als u uw project echter niet helemaal opnieuw wilt instellen, kunt u de bronbestanden downloaden die aan deze zelfstudie zijn gekoppeld en het meegeleverde Gulp- of Grunt-startersproject uitpakken in een lege projectmap. Voer vervolgens de opdracht uit met een terminal of opdrachtprompt die naar de map wijst npm installeren.

Installeer plug-ins

Vervolgens moet je de postcss-bem plug-in installeren. We zullen ook een plug-in installeren die er heel goed mee kan werken: postcss-genest.

Of u Gulp of Grunt gebruikt, voer de volgende opdracht uit in uw projectmap:

npm installeer postcss-bem postcss-nested --save-dev

Nu zijn we klaar om de plug-ins in uw project te laden.

Laad plug-ins via Gulp

Als u Gulp gebruikt, voegt u deze variabelen toe onder de variabelen die al in het bestand staan:

var bem = require ('postcss-bem'); var genest = require ('postcss-nested');

Voeg nu elk van die nieuwe variabelenamen toe aan uw processors array:

 var processors = [bem, genest];

Voer een snelle test uit dat alles werkt door de opdracht uit te voeren slok css controleer vervolgens of er een nieuw "style.css" -bestand is verschenen in de map "dest" van uw project.

Laad plug-ins via Grunt

Als u Grunt gebruikt, werk dan het processors object, dat is genest onder de opties object, naar het volgende:

 processors: [require ('postcss-bem') (), require ('postcss-nested') ()]

Voer een snelle test uit dat alles werkt door de opdracht uit te voeren grunt postcss controleer vervolgens of er een nieuw "style.css" -bestand is verschenen in de map "dest" van uw project.

Oké, je bent klaar om te gaan. Laten we leren hoe we de BEM- en SUIT-structuur kunnen genereren.

BEM en SUIT met postcss-bem

Er kan zich wat logheid ontwikkelen in de BEM- of SUIT-structuur bij het handmatig schrijven van code, omdat het herhaaldelijk herhalen van dezelfde ID's in klassenamen vermoeiend kan worden en bijhouden welke elementen en afstammelingen bij welke blokken en componenten verwarrend kunnen zijn.

Wanneer u postcss-bem echter gebruikt, wordt het gemakkelijk om de structuur van uw code in één oogopslag te begrijpen en wordt herhaling bij het typen van klassenamen vrijwel onbestaand.

SUIT-structuur genereren

Ondanks zijn naam wordt postcss-bem standaard standaard uitgevoerd in overeenstemming met de SUIT-syntaxis in plaats van BEM. U kunt uitvoeren in de BEM-syntaxis, die we later zullen behandelen, maar de plug-in is voornamelijk ontworpen om SUIT uit te voeren, dus om die reden zullen we beginnen met de SUIT-syntaxis.

Een component genereren

Gebruik de syntaxis om een ​​component te maken @component ComponentName ....

Probeer dit uit door een toe te voegen Zoekformulier component naar uw "src / style.css" bestand:

@component SearchForm opvulling: 0; marge: 0; 

Compileer het en uw resulterende code zou moeten zijn:

.SearchForm opvulling: 0; marge: 0; 

Een afstammeling genereren

Gebruik de syntaxis om een ​​afstammeling te maken @descendent descName ... genest in de bovenliggende component.

Voeg een afstammeling met de naam toe textField in je Zoekformulier component zoals zo:

@component SearchForm opvulling: 0; marge: 0; / * Nest afstammeling onder component * / @descendent textField border: 1px solid #ccc; 

Na het compileren ziet u nu:

.SearchForm opvulling: 0; marge: 0;  .SearchForm-textField border: 1px solid #ccc; 

Een modifier genereren

Maak een modifier aan een component met de syntaxis @ naam van de beheerder ..., genest in de component die het heeft. Modifiers moeten meestal bovenaan uw component worden geplaatst, boven eventuele afstammelingen en staten.

Voeg een naam toe met de naam gevorderd aan jouw Zoekformulier component met de volgende code:

@component SearchForm opvulling: 0; marge: 0; / * Typ modifiers meestal boven afstammelingen * / @modifier advanced padding: 1rem;  @descendent textField border: 1px solid #ccc; 

Hercompileer uw code en u zou uw nieuwe moeten zien gevorderd component modifier:

.SearchForm opvulling: 0; marge: 0;  .SearchForm - advanced padding: 1rem;  .SearchForm-textField border: 1px solid #ccc; 

Een staat genereren

Staten worden gemaakt via de syntaxis @wanneer naam ... en kan worden genest binnen een component of een afstammeling.

Voeg een naam toe met de naam ongeldig aan jouw textField afstammeling met behulp van deze code:

@component SearchForm opvulling: 0; marge: 0; @modifier advanced padding: 1rem;  @descendent textField border: 1px solid #ccc; / * Hiermee wordt een status gemaakt voor de afstammeling textField * / @wanneer ongeldig border: 1px effen rood; 

Wanneer u nu uw code compileert, ziet u dat deze uw nieuwe bevat ongeldig staat:

.SearchForm opvulling: 0; marge: 0;  .SearchForm - advanced padding: 1rem;  .SearchForm-textField border: 1px solid #ccc;  .SearchForm-textField.is-invalid border: 1px effen rood; 

Namespacing Components

U kunt de naamgeving van uw componenten en alle afstammelingen, modifiers en statussen die daarin zijn genest, omsluiten met @ naam van component-naamruimte .... U kunt desgewenst uw hele stylesheet met deze naamruimte omwikkelen, zodat al uw klassen automatisch worden voorafgegaan door deze naamruimte.

Probeer dit uit door al je code tot nu toe in te pakken @ component-namespace mine ...:

@ component-namespace mine @component SearchForm opvulling: 0; marge: 0; @modifier advanced padding: 1rem;  @descendent textField border: 1px solid #ccc; @wanneer ongeldig border: 1px effen rood; 

Na het compileren ziet u dat nu elk van uw componenten wordt voorafgegaan door de mijne-:

.mine-SearchForm opvulling: 0; marge: 0;  .mine-SearchForm - advanced padding: 1rem;  .mine-SearchForm-textField border: 1px solid #ccc;  .mine-SearchForm-textField.is-invalid border: 1px effen rood; 

Een hulpprogramma genereren

Hulpprogramma's worden gemaakt met de syntaxis @utility utilityName .... U herinnert zich dat u bij het instellen van uw project de postcss-geneste plug-in hebt geïnstalleerd. We hebben dit gedaan omdat het erg handig kan zijn om te gebruiken in combinatie met postcss-bem, zoals je in dit voorbeeld zult zien waar we een Clearfix nut:

@utility clearFix &: before, &: after content: ""; weergave: tafel;  &: na clear: both;  / * Als ondersteuning van IE 6/7 * / * zoom: 1; 

Nadat u de bovenstaande code hebt toegevoegd, compileert u en ziet u dat dit nieuwe hulpprogramma is gemaakt:

.u-clearFix / * Als ondersteuning voor IE 6/7 * / zoom: 1;  .u-clearFix: before, .u-clearFix: after content: ""; weergave: tafel;  .u-clearFix: after clear: both; 

BEM-structuur genereren

Om de BEM-syntaxisuitvoer in postcss-bem te activeren, geeft u de optie door stijl: 'bem' in je Gulpfile of Gruntbestand zoals zo:

/ * Gulpfile * / var processors = [bem (style: 'bem'), genest]; / * Gruntfile * / processors: [require ('postcss-bem') (style: 'bem'), require ('postcss-nested') ()]

Standaard gebruikt postcss-bem het officiële scheidingsteken voor een wijziging van een enkel onderstrepingsteken _. Als het belangrijk is voor uw project, gebruikt u het meer algemene scheidingsteken van twee streepjes -- in plaats daarvan kunt u de config voor de postcss-bem-plugin wijzigen door naar de map node_modules / postcss-bem van uw project te gaan, index.js te openen, regel 15 te vinden en dit aan te passen:

 bem: separators: namespace: '-', descendent: '__', modifier: '_'

... dit:

 bem: separators: namespace: '_', descendent: '__', modifier: '-'

Een blok genereren

Omdat een "blok" in BEM correleert met een "component" in SUIT, gebruikt u de syntaxis @component block-naam ... om een ​​blok te genereren.

Om een ​​te maken zoekformulier blok voeg deze code toe:

@component zoek-formulier opvulling: 0; marge: 0; 

Dan compileer en je zou moeten zien:

.zoekvorm opvulling: 0; marge: 0; 

Een element genereren

Als een "element" in BEM correleert met een "afstammeling" in SUIT, kunnen ze worden gemaakt met de syntaxis @descendente elementnaam ... genest in het bovenliggende blok.

Om een ​​te maken text-field element voeg het volgende toe:

@component zoek-formulier opvulling: 0; marge: 0; @descendent text-field border: 1px solid #ccc; 

Bij het compileren ziet u dat uw nieuwe element is gemaakt:

.zoekvorm opvulling: 0; marge: 0;  .zoek-formulier__tekstveld border: 1px solid #ccc; 

Een modifier genereren

Hoewel BEM modifiers voor zowel blokken als elementen toestaat, verwerkt de postcss-bem-plugin ze alleen als genest binnen blokken en geen elementen, vanwege de SUIT-conventie van modifiers die worden toegepast op componenten die niet afstammen. Ze kunnen worden gemaakt met de syntaxis @ naam van de beheerder ..., genest in het bovenliggende blok.

Voeg een toe gevorderd modifier voor uw zoekformulier component zoals zo:

@component zoek-formulier opvulling: 0; marge: 0; @modifier advanced padding: 1rem;  @descendent text-field border: 1px solid #ccc; 

En bij de compilatie zal het opleveren:

.zoekvorm opvulling: 0; marge: 0;  .search-form_advanced padding: 1rem;  .zoek-formulier__tekstveld border: 1px solid #ccc; 

Geen hulpprogramma's of staten, maar naamruimten zijn ingeschakeld

In de BEM-modus de @nut en @wanneer syntaxes kunnen nergens in worden gecompileerd, aangezien BEM geen hulpprogramma's of toestanden gebruikt.

Hoewel het over het algemeen geen deel uitmaakt van BEM, is het @ Component-namespace syntaxis werkt nog steeds als u het in uw BEM-stylesheet wilt gebruiken. Het geeft uw klassen een voorvoegsel naam--:

.mijn - zoekformulier opvulling: 0; marge: 0;  .mine - search-form_advanced padding: 1rem;  .mine - search-form__text-field border: 1px solid #ccc; 

Laten we samenvatten

Nu weet u alles over het korten van uw BEM- en SUIT-ontwikkeling en maakt u het algehele proces eenvoudiger. Laten we alles samenvatten wat we hebben behandeld:

  • BEM en SUIT zijn class-naamconventies die helpen om stylesheets functioneel en georganiseerd te houden, en andere ontwikkelaars te helpen het doel van verschillende klassen te herkennen.
  • SUIT is als BEM, maar met wat extra's toegevoegd en aanpassingen gemaakt
  • De postcss-bem-plug-in biedt snelkoppelingen voor het maken van BEM- en SUIT-klassen, zoals @component, @descendent, @modifier enz.
  • De plug-in maakt het ook mogelijk dat code op een nuttige manier wordt genest, b.v. modifiers zijn genest in het onderdeel of blok dat ze wijzigen.
  • Namespacing kan automatisch worden gedaan door klassen in te pakken @ naam van component-naamruimte ...

In de volgende zelfstudie

Als volgende komen we kijken naar een andere geweldige manier om te profiteren van PostCSS, en dat is door een toolkit samen te stellen van steno's en snelkoppelingen die we kunnen nemen om onze codering sneller en efficiënter te maken.

ik zie je daar!