PostCSS Deep Dive Förbehandling med PreCSS

I de två sista handledningarna såg vi på sätt att använda PreCSS på färdiga stylesheets för att förbättra deras kompatibilitet och optimering av kors webbläsare, i huvudsak som en posta-processor. I denna handledning lär du dig att använda PostCSS som en pre-processor, på samma sätt som du skulle använda Stylus, Sass eller LESS.

Det finns två huvudsakliga sätt att använda PostCSS för förbehandling. En är att välja alla egna plugins för att lägga till den förprogrammeringsfunktionalitet du vill ha, och den andra är att installera ett paket förinställda plugins så att du är redo att gå direkt.

Vi börjar med det snabbaste och enklaste sättet att installera det perfekta PreCSS-paketet med plugins, skapat av Jonathan Neal. I handledningen efter detta kommer vi att flytta på hur du kan sätta ihop din egen förbehandlare, med bara den funktionalitet du vill ha.

Denna handledning förutsätter att du har en viss förtrogenhet med de funktioner som vanligtvis finns i preprocessorer som Stylus, Sass eller LESS. Det är bara för att vi ska fokusera på på vilket sätt Du kan använda dessa samma typer av funktioner via PostCSS, snarare än Vad funktionerna faktiskt gör. Det sagt, även om du aldrig har använt en förprocessor tidigare, kan det vara den perfekta platsen att börja.

Prova PreCSS Live

Vi går igenom hur du konfigurerar ett Gulp eller Grunt-projekt med PreCSS i nästa avsnitt, men om du vill ta en genväg, (för tillfället) kan du alternativt använda live demo-lekplatsen för att prova koden vi går igenom i den här handledningen. Koden kan skrivas i det vänstra fönstret, och det kommer automatiskt att kompilera för dig och visas i det högra fönstret.

PreCSS Live Editor: https://jonathantneal.github.io/precss

Ställ in ditt projekt

Det första du behöver göra är att ställa in ditt projekt för att använda antingen Gulp eller Grunt, beroende på vad du föredrar. Om du inte redan föredrar en eller annan, rekommenderar jag att du använder Gulp eftersom du behöver mindre kod för att uppnå samma ändar.

Du kan läsa om hur du konfigurerar Gulp eller Grunt-projekt för PostCSS i de tidigare handledningarna

  • PostCSS Quickstart Guide: Gulp Setup eller
  • PostCSS Quickstart Guide: Grunt Setup

respektive.

Om du inte vill manuellt konfigurera ditt projekt från början, kan du ladda ner källfilerna som bifogas denna handledning och extrahera antingen det angivna Gulp eller Grunt-startprojektet i en tom projektmapp. 

Sedan, med en terminal eller kommandotolk som pekas på mappen, kör kommandotnpm installera.

Installera PreCSS

Oavsett om du använder Gulp eller Grunt, installera PreCSS i ditt projekt med kommandot:

npm installera precss - save-dev

Ladda som en Gulp Plugin

Om du använder Gulp, lägg till den här variabeln under de variabler som redan finns i filen:

var precss = kräver ("precss");

Lägg nu till det nya variabelnamnet i din processorer array:

 var processorer = [precss];

Gör ett snabbt test att allt fungerar genom att köra kommandot gulp css Kontrollera sedan att en ny "style.css" -fil har dykt upp i projektets "dest" -mapp.

Ladda som en Grunt Plugin

Om du använder Grunt, uppdatera processorer objekt som är nestat under alternativ objekt till följande:

 processorer: [kräver ("precss") ()]

Gör ett snabbt test att allt fungerar genom att köra kommandot grunt postcss Kontrollera sedan att en ny "style.css" -fil har dykt upp i projektets "dest" -mapp.

Du har nu allt du behöver för att använda PreCSS installerat och redo att gå. Det betyder att vi är redo att börja gå igenom några av PreCSS-förbehandlingsmöjligheterna och hur de kan användas.

Förbehandling via "PreCSS"

Generellt sett är PreCSS-syntaxen mest likadan som Sass. Men det använder sig av sina egna unika tillvägagångssätt, som vi kommer att täcka när vi går vidare. 

Notera: På grund av Sass-liknande syntaxen i PreCSS, kommer du att upptäcka att en Sass-syntaxficklampa fungerar bäst för dig i din favorit textredigerare.

Nesting

Nesting är något vanligt för alla tre av de stora preprocessorerna, dvs Stylus, Sass och LESS, och det finns också i PreCSS. Nesting i PreCSS görs på samma sätt som i Sass och LESS, genom att placera väljare i de andra väljarna.

Förmågan att använda & symbol för att föräldrarsväljaren dupliceras i barnväljaren fungerar också på samma sätt i PreCSS som i andra förbehandlare.

Försök lägga till följande nestad kod till din "src / style.css" -fil:

.meny bredd: 100%; en text-decoration: none;  & :: före innehåll: ";

Kompilera din CSS med gulp css eller grunt postcss och din "dest / style.css" -fil borde ha utvärderat den nestade koden i följande:

.meny bredd: 100%;  .menu en text-decoration: none;  .menu :: före innehåll: ";

variabler

Variabler är en annan typ av funktionalitet som är gemensam för alla förprocessorer, och de ingår i PreCSS. Det enda som vanligtvis skiljer sig från varje preprocessor är att syntaxen betecknar variabler.

  • MINDER variabler börjar med en @ symbol och placera a : före värdet. 
  • Stylusvariabler kan valfritt använda a $ symbol och placera en = teckna före värdet. 
  • Sass-variabler använder a $ symbol och placera a : före värdet.

I enlighet med PreCSS-tendensen att använda Sass som syntax lägger den också en $ före variabelnamnet och a : före värdet. 

Prova med att använda PreCSS-variabler genom att lägga till detta i filen "src / style.css":

$ text_color: # 232323; kropp färg: $ text_color; 

Efter omkompilering bör du se den här resulterande koden:

kropp färg: # 232323; 

villkors

Conditionals, dvs.. om och annan logik, är en funktion som är mycket stark i både Sass och Stylus. MINDER erbjuder bevakade mixins, men de erbjuder inte lika mycket kraft. Conditionals finns i PreCSS och följer samma syntax som Sass, med användning av @om och @annan

Lägg till denna exempelkod till din "src / style.css" -fil:

$ column_layout: 2; kolumn @if $ column_layout == 2 bredd: 50%; flyta till vänster;  @else bredd: 100%; 

I ovanstående exempel har vi en .kolumn klassutmatning annorlunda beroende på om vi vill ha en kolumnlayout eller en två kolumnlayout. Vi har $ column_layout variabel satt till 2, vilket betyder att vi borde se bredd: 50%; flyta till vänster; utmatas i vår klass.

Kompilera din fil, och du bör se följande i din "dest / style.css" -fil.

.kolumn bredd: 50%; flyta till vänster 

Notera: plug-in-avancerade variabler-plugin som tillhandahåller denna funktionalitet är fortfarande ganska ny, och jag har stött på några oväntade utdata när jag använder den för mer komplexa villkor, men jag är säker på att den kommer att uppdateras inom en snar framtid. 

Det finns ett alternativt plugin som kan användas för conditionals som heter postcss-conditionals. Vi täcker hur du kan använda det pluginet (om du väljer) i nästa handledning, "Rolling Your Own Preprocessor".

Loops - @för och @varje

Det finns två typer av slingor tillgängliga i PreCSS, the @för och @varje loopar. Båda dessa använder ett tillvägagångssätt som är precis som Sass. "För" loopar låter dig cykla genom en numerisk räknare, medan "varje" loopar låter dig cykla genom en lista med objekt.

@för Loops

I en @för loop Det finns en "räknare" -variabel som håller reda på var du cyklar via din numeriska räknare, vanligtvis inställd som $ i. Till exempel, när iterering från 1 till 3 kommer det att finnas tre slingor; i den första $ i kommer att vara lika 1, den andra kommer det att vara lika 2 och den tredje kommer det att vara lika 3

Detta $ i motvariabel kan interpoleras till både selektorer och regler, vilket kan vara väldigt användbart för saker som generering n: te-of-typ () regler och beräkningsbredd.

Lägg till den här koden i din "src / style.css" -fil för att prova en @för slinga:

@for $ i från 1 till 3 p: nth-of-type ($ i) margin-left: calc (100% / $ i); 

Efter sammanställningen bör du se denna kod utökad till:

p: nth-of-type (1) margin-left: calc (100% / 1);  p: nth-of-type (2) margin-left: calc (100% / 2);  p: nth-of-type (3) margin-left: calc (100% / 3); 

Notera: tal 1, 2 och 3 har infogats i var och en av ovanstående stilar.

@varje Loops

En @varje loop cyklar genom en lista med objekt istället för siffror. Som med @för slingor kan variabeln som representerar slingens aktuella objekt interpoleras till selektorer och regler. Observera att för att interpolera till en sträng måste du infoga en uppsättning parentes i variabelnamnet i formatet $ (Var)

Ge med PreCSS @varje loopar går genom att lägga till följande exempelkod:

$ social: twitter, facebook, youtube; @each $ icon i ($ social) .icon - $ (ikon) bakgrund: url ('img / $ (ikon) .png'); 

Efter sammanställning bör du se följande CSS har genererats:

.ikon-twitter bakgrund: url ('img / twitter.png');  .icon-facebook bakgrund: url ('img / facebook.png');  .icon-youtube bakgrund: url ('img / youtube.png'); 

Mixins

Syntaxen för mixin skapande är en aspekt av PreCSS som är lite annorlunda än Sass. 

I Sass, för att definiera en mixin använder du syntaxen @ mixin mixin_name ($ arg1, $ arg2) ... och använd sedan med @include mixin_name (pass_arg1, pass_arg2);.

I PreCSS definierar du däremot en mixin med syntaxen @ define-mixin mixin_name $ arg1, $ arg2 ... och använd den med @mixin mixin_name pass_arg1, pass_arg2;

Lägg till detta exempel i filen "src / style.css":

@ define-mixin icon $ network, $ color . knapp. $ (nätverk) background-image: url ('img / $ (network) .png'); bakgrundsfärg: $ color;  @mixin ikon twitter, blå; @mixin ikon youtube, röd;

Vid sammanställning bör du se:

.button.twitter bakgrundsbild: url ('img / twitter.png'); bakgrundsfärg: blå;  .button.youtube bakgrundsbild: url ('img / youtube.png'); bakgrundsfärg: röd; 

Notera: Argument som passerar genom mixin kan interpoleras till selektorer och strängar med samma tillvägagångssätt som nämns i @varje slingor ovan; med formatet $ (Var).

Använda @ mixin-innehåll

Förutom att använda mixins på det sätt som visas ovan, kan de också sättas in för att konsumera blockerade innehåll som passerat när man ringer mixin. Detta är i huvudsak samma process som med Sass ' @innehåll

Ändra till exempel mixin från ovanstående exempel, placera @ Mixin-innehåll där du vill ha ett visst block av innehåll som ska visas:

@ define-mixin icon $ network, $ color . knapp. $ (nätverk) background-image: url ('img / $ (network) .png'); bakgrundsfärg: $ color; @ Mixin-innehåll; 

När en mixin innehåller @ Mixin-innehåll används, måste den placeras med häftiga hakparentes, snarare än på en enda linje som slutar med a ;, eller det kommer inte att kompilera.

Uppdatera din kod så att dina mixin-samtal ser ut så här:

@mixin ikon twitter, blå width: 3rem;  @mixin ikon youtube, röd bredd: 4rem; 

Efter sammanställning bör detta ge följande kod - notera att bredd innehållet passerade genom varje användning av mixin:

.button.twitter bakgrundsbild: url ('img / twitter.png'); bakgrundsfärg: blå; bredd: 3rem;  .button.youtube bakgrundsbild: url ('img / youtube.png'); bakgrundsfärg: röd; bredd: 4rem; 

förlänger

Extends liknar mixins i en mening, genom att de är utformade så att du kan återanvända block av kod. Tanken bakom "sträcker sig" är emellertid att skapa en basuppsättning av kod som du vet att du kommer att använda på exakt samma sätt flera gånger för en viss typ av element. Du kan sedan förlänga den basen med ytterligare, icke-standardkod.

I PreCSS är syntaxen för att definiera en förlängning @ define-extend extension_name ....

I din "src / style.css" -fil definierar du en förlängning som innehåller grundstilarna för en rundad knapp som så:

@ define-extend rounded_button border-radius: 0.5rem; vaddering: 1em; kantbredd: 0,0625rem; gränsstil: fast; 

Den här standardinställningen av stilar är nu klar att förlängas med extra kod, till exempel inställning av saker som bakgrundsfärg och gräns färg. Detta görs genom att använda syntaxen @extend extension_name; för att importera de basformat som definieras i förlängningen. 

Lägg till den här exempelkoden, under den kod du just lagt till:

.blue_button @extend rounded_button; Gränsfärg: # 2F74D1; bakgrundsfärg: # 3B8EFF;  .red_button @extend rounded_button; kantfärg: # C41A1E; bakgrundsfärg: # FF2025; 

Där det @extend rounded_button; linjen används, kommer hela innehållet i förlängningen att införas.

Kompilera dina stilar och du borde få:

.blue_button, .red_button border-radius: 0.5rem; vaddering: 1em; kantbredd: 0,0625rem; gränsstil: fast;  .blue_button border-color: # 2F74D1; bakgrundsfärg: # 3B8EFF;  .red_button border-color: # C41A1E; bakgrundsfärg: # FF2025; 

Observera också att de vanliga förekommande stilarna .blue_button och .red_button klassen har kombinerats för effektivitet.

import

Pluggen används för inlining av stylesheets via @importera är samma som vi täckte i den tidigare handledningen i serien: För Minifiering och Optimering. För en översikt över hur det fungerar går huvudet och läs av avsnittet "Inline / Combine Files with @import".

I samband med att PostCSS används som preprocessor blir importen ännu mer användbar eftersom de ger dig möjlighet att konfigurera partiklar, något som du kan vara van vid från andra förbehandlingslösningar. Du kan till exempel konfigurera en "partials" -mapp, separera ditt projekt i logiskt diskreta partiella filer och importera dem så här:

@import "partials / _variables.css"; @import "partials / _utilities.css"; @import "partials / _mixins.css"; @import "partials / _extends.css";

Låt oss läsa om

Jag hoppas att du nu har några insikter om hur kraftfull PostCSS kan vara som förprocessor genom PreCSS-paketet. För att sammanfatta vad vi täckte ovan:

  • Du kan prova PreCSS live på https://jonathantneal.github.io/precss.
  • Nesting i PreCSS fungerar på samma sätt som Sass och LESS.
  • Variabler i PreCSS använder samma syntax som Sass.
  • Conditionals finns i PreCSS, med hjälp av syntaxen @if och @else.
  • @for och @each loopar är tillgängliga.
  • PreCSS mixins definieras med syntaxen:
    @ define-mixin mixin_name $ arg1, $ arg2 ...
  • PreCSS mixins används med syntaxen:
    @mixin mixin_name pass_arg1, pass_arg2;
  • @ Mixin-innehåll kan användas på samma sätt som Sass ' @innehåll
  • Extends i PreCSS definieras med syntaxen:
    @ define-extend extension_name ...
  • Extends används med syntaxen:
    @extend extension_name;
  • @importera inlines externa CSS-filer, särskilt användbart för att använda partials

I nästa handledning

PreCSS är ett fantastiskt projekt, som sammanför några utmärkta språkförlängningspluggar och gör PostCSS-baserad förbehandling ganska mycket plug-and-play. Det ger nästan all den funktionalitet som de flesta förprocessoranvändare har förväntat sig, och är en snabb, "ingen krångel" sätt att få PostCSS-förprocessorns boll att rulla.

Att använda PreCSS är en av de två metoderna för PostCSS preprocessing som vi nämnde i början av denna handledning. Den andra metoden är att konfigurera din egen preprocessor, handplockar pluginprogram för språktillägg som passar dina egna projekt eller kodningsstil. Avvägningen är det är lite mer setup, men i gengäld får du friheten att sätta ihop en förprocessor som fungerar men du vill att den ska.

Du lär dig hur du gör det i nästa handledning, "Rulla din egen preprocessor".