Använda PostCSS tillsammans med Sass, Stylus eller LESS

Om du är intresserad av att använda PostCSS, men du fortfarande älskar din favorit preprocessor, oroa dig inte. Du behöver inte välja mellan de två. Du kan använda dem rätt bredvid varandra.

Det finns flera PostCSS-plugins som komplimangerar preprocessorer mycket bra, eftersom de lägger till funktionalitet i ditt arbetsflöde som annars skulle vara omöjligt, eller åtminstone svårare att använda endast en förprocessor.

Vi kommer att peka på några av dessa gratis plugins, så går vi igenom installationsguider för att visa hur du använder PostCSS sida vid sida med Sass, Stylus eller LESS.

Varför använda båda?

Innan vi kommer in på vilket sätt Du kan använda preprocessorer tillsammans med PostCSS, vi ska prata lite om Varför du skulle vilja. Det korta svaret är: att få tillgång till PostCSS-plugins vars funktionalitet komplimangerar förprocessorer. För att visa dig varför det är värt att ha det, går vi över en handfull plugins som fungerar riktigt bra med preprocessorer.

Notera: det kan vara möjligt att uppnå liknande slutresultat genom att använda mixins och funktioner i vanlig preprocessorkod, men med varje exempel nedan hanteras processen automatiskt. Du skriver din CSS normalt och pluginerna tar hand om allt för dig, utan några funktioner att ringa, inga mixins att inkludera eller argument att passera.

autoprefixer

Det har skett många preprocessor mixin skrivna för att hantera införandet av leverantörs prefix. Du kan till exempel ha använt @ include box-dimensionering (gränsvärde); från kompassbiblioteket till utsänd leverantör prefixed box-dimensionering regler.

Problemet med att förlita sig på mixins för leverantörs prefix är:

  1. Du måste först veta en fastighet behöver prefix innan du kan bestämma dig för att distribuera en mixin för den.
  2. Du måste veta namnet på den associerade mixin och hur du använder den.
  3. Du måste behålla flikar när leverantörs prefix inte längre krävs för varje egendom (jag vet att jag prefixade box-dimensionering för långt till lång ...)

Autoprefixer eliminerar dessa problem genom att hantera processen för leverantörsprefixering automatiskt. Autoprefixer skannar din CSS, kontrollerar den mot data från CanIUse.com och lägger sedan till de prefix som krävs.

Läs mer om Autoprefixer på: https://github.com/postcss/autoprefixer

rtlcss

Att skapa både standard och RTL (höger till vänster) stilark från en enda källa är också något som har gjorts med förprocessorer, men det kräver vanligtvis att flera mixins och / eller interpolerande variabler används i din kod på flera ställen. Till exempel, snarare än att skriva marginal-vänster: 1rem; du kanske behöver skriva marginal - # dir: 1rem; eller @include margin-left (1rem);.

Med rtlcss-plugin av Mohammad Younes behöver du emellertid inte använda mixins eller variabel interpolering, du skriver bara ditt stylesheet som du normalt skulle och plugin hittar alla instanser eller "höger" eller "vänster" och byter dem runt. Så marginal-vänster: 1rem; blir automatiskt marginal-höger: 1rem; utan att du behöver skriva någon särskild kod för att få det att hända.

Läs mer om rtlcss på: https://github.com/MohammadYounes/rtlcss

postcss-colorblind

Med Brian Holts postcss-colorblind-plugin kan du automatiskt generera olika versioner av ditt stilark som ger dig en förstahandsupplevelse av hur din design skulle se ut som en person med färgblindhet. Det kan simulera åtta olika typer av färgblindhet, vilket hjälper dig att få en riktigt fast förståelse för hur lättillgängliga dina färgscheman är.

Detta är ett exempel på funktionalitet som du verkligen måste gå till PostCSS för att hitta, eftersom det skulle vara mycket svårt för preprocessorer att uppnå.

Läs mer om postcss-colorblind på: https://github.com/btholt/postcss-colorblind

postcss-svgo

Benchiggs postcss-svgo-plugin kan ge dig handsfree optimering av inline SVG-kod. Till exempel detta:

bakgrund: url ('data: image / svg + xml; utf-8,');

Kokas ner till detta, mindre än hälften av koden:

bakgrund: url ('data: image / svg + xml; utf-8,');

Läs mer om postcss-svgo på: https://github.com/ben-eb/postcss-svgo

cssnano

Medan förprocessorer kan ta bort whitespace och kommentarer kan cssnano-paketet från Ben Briggs utföra alla möjliga optimeringar utöver dessa två steg. Vi täcker cssnano i detalj i handledningen för Minifiering och Optimering.

Läs mer om cssnano på: https://github.com/ben-eb/cssnano

postcss-font-trollkarl

Postcss-font-magiker plugin av Jonathan Neal gör att du lägger till anpassade teckensnitt så enkelt som att använda vanliga typsnitt. Du behöver inte använda några mixins, lägg bara till en typsnittsfamilj regel som du normalt skulle:

kropp font-family: "Alice"; 

... och plugin kommer att hantera hela @ Font-face generation för dig:

@ font-face font-family: "Alice"; typsnittstyp: normal; font-vikt: 400; src: local ("Alice"), lokal ("Alice-Regular"), url ("http://fonts.gstatic.com/s/alice/v7/sZyKh5NKrCk1xkCk_F1S8A.eot?#") format ("eot") , url ("http://fonts.gstatic.com/s/alice/v7/l5RFQT5MQiajQkFxjDLySg.woff2") format ("woff2"), url ("http://fonts.gstatic.com/s/alice/v7 /_H4kMcdhHr0B8RDaQcqpTA.woff ") format (" woff "), url (" http://fonts.gstatic.com/s/alice/v7/acf9XsUhgp1k2j79ATk2cw.ttf ") format (" truetype ") kropp font-family: "Alice"; 

Läs mer om postcss-font-magiker på: https://github.com/jonathantneal/postcss-font-magician

Projektinställningar

Det finns sex installationsguider nedan: en Gulp and Grunt guide för varje större preprocessor. Det finns ingen anledning att läsa alla sex, du kan bara hoppa direkt till guiden för din föredragna förbehandlare och byggverktyg. Om du inte är säker på att använda Gulp eller Grunt är Gulp definitivt det enklaste valet för denna handledning.

För vilken guide du följer måste du börja med ett tomt Gulp eller Grunt-projekt. 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 installera ditt projekt manuellt 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 kör kommandot med en terminal eller kommandotolk som pekas på mappen npm installera.

Installera PostCSS-plugins till ditt projekt

När du har installerat ett tomt projekt för en av nedanstående sektioner måste du också installera två PostCSS-plugins: Autoprefixer och cssnano. Du kan göra det genom att köra kommandot:

npm installera autoprefixer cssnano - save-dev

Vi använder dessa två plugins för att testa att PostCSS och din förprocessor arbetar tillsammans som förväntat.

Preprocess Innan PostCSS

Den första regeln att använda en preprocessor med PostCSS är att du alltid ska köra nämnda preprocessor först. Detta beror på att du inte vill ha någon preprocessor-specifik syntax i din kod som kan kväva ett PostCSS-plugin, och du vill inte att PostCSS gör ändringar i din kod som kan förhindra att en förprocessor kör som förväntat.

PostCSS-plugins och "PostCSS Test Code"

För varje preprocessor vi installerar får vi dem att köra autoprefixer och cssnano efter att förprocessorn har slutfört sammanställningen. I varje fall måste vi lägga till en testkod för dessa två plugins för att fungera.

Om du vill spara upprepad samma kod i varje avsnitt nedan, när du ser en instruktion som säger att du lägger till PostCSS-testkoden, lägg till den här i förprocessorkällfilen du arbetar med:

.css_nano, .css_nano + p, [class * = "css_nano"], .css_nano / * cssnano tar bort den här kommentaren * / display: flex; typsnitt: normal; margin-top: 1rem; marginalbotten: 2rem; marginal-vänster: 1.5rem; marginal-höger: 2,5rem; typsnitt: normal; vaddering: 1,75rem; bredd: calc (50rem - (2 * 1,75rem)); 

Om du lyckas kommer din kompilerade kod i varje fall att utgå som:

.css_nano, .css_nano + p, [class * = css_nano] display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; margin: 1rem 2.5rem 2rem 1.5rem; font- vikt: 400; padding: 1.75rem; bredd: 46.5rem

Notera: användningarna av flexbox har autoprefixed, och cssnano har utfört flera optimeringar av koden. Vi använder samma kod för att testa cssnano som vi gjorde i den tidigare handledningen för Minifiering och optimering, så hänvisa till avsnittet "cssnano" där för information om vilka optimeringar som ska utföras.

1. Sass + PostCSS

Eftersom du redan arbetar med Node.js för att köra Gulp eller Grunt och PostCSS, är det enklaste sättet att använda Sass tillsammans med dem att göra det via LibSass. Detta är också betydligt snabbare än Ruby Sass. Vi distribuerar LibSass via Gulp-Sass eller Grunt-Contrib-Sass-modulerna.

Inställning via Gulp

Installera gulp-sass-modulen i ditt projekt med npm installera gulp-sass -save-dev.

Nu kan du uppdatera din Gulpfile till följande:

var gulp = kräver ("gulp"); var postcss = kräver ("gulp-postcss"); var sass = kräver ("gulp-sass"); var autoprefixer = kräver ("autoprefixer"); var cssnano = kräver ('cssnano'); gulp.task ('css', funktion () var processorer = [autoprefixer, cssnano]; returnera gulp.src ('./ src / * .scss') .pipe (sass (). .logError)). pip (postcss (processorer)). pip (gulp.dest ('./ dest')););

Låt oss bryta ner vad vi har ändrat från standardstart Gulpfile:

  • Tillagda variabler att ladda klunk-sass, autoprefixer och cssnano
  • Lades till autoprefixer och cssnano variabler till processorer array
  • Redigerade filtillägget i källfilen som vi sammanställer till ".scss" istället för ".css"
  • Lades till en ny rör() linje, .rör (sass () ... , att bearbeta Sass, är säker på att placera den före linjen som behandlar PostCSS

Nu kan vi köra några tester för att se till att både Sass och PostCSS sammanställer som förväntat.

Testpreprocessor

Byt namn på din befintliga "src / style.css" -fil till "src / style.scss" och lägg till följande testkod till den:

$ fontstack: Helvetica, sans-serif; $ primärfärg: # 333; kropp font: 100% $ font-stack; färg: $ primärfärg; 

Springa gulp css och du bör se en ny "style.css" -fil visas i din "dest" -mapp med innehållet:

kropp font: 100% Helvetica, sans-serif; färg: # 333;  

Test PostCSS

Nu lägger du till PostCSS-testkoden som anges tidigare i denna handledning till din "style.scss" -fil.

Kör din gulp css kommando och du borde se den korrekta koden visas i filen "dest / style.css":

kropp font: 100% Helvetica, sans-serif; färg: # 333 .css_nano, .css_nano + p, [class * = css_nano] display: -webkit-box; display: -webkit-flex; display: -ms -flexbox; display: flex; margin: 1rem 2.5rem 2rem 1.5rem; typsnitt: 400; vaddering: 1,75rem; bredd: 46,5rem

Inställning via Grunt

I ditt nya Grunt-projekt installerar du grunt-contrib-sass-modulen med npm installera grunt-contrib-sass.

Lägg sedan till en grunt.loadNpmTasks () funktion för det under den befintliga du har för PostCSS:

 grunt.loadNpmTasks ( 'grunt-postcss'); grunt.loadNpmTasks ( 'grunt-contrib-sass');

Du måste nu konfigurera en ny uppgift för bearbetning av Sass. Efter denna rad:

 grunt.initConfig (

... men före det existerande postcss uppgift, lägg till den här koden:

 sass: dist: filer: 'src / style.css': 'src / style.scss',

Nu registrerar vi en uppgift som kör Sass och sedan PostCSS. Efter grunt.loadNpmTasks () funktion du bara har satt in, lägg till:

grunt.registerTask ('css', ['sass', 'postcss']);

Testpreprocessor

För att testa din inställning, byt namn på din befintliga "src / style.css" -fil till "style.scss". Lägg till den här Sass-koden till den:

$ fontstack: Helvetica, sans-serif; $ primärfärg: # 333; kropp font: 100% $ font-stack; färg: $ primärfärg; 

Kör kommandot grunt css och du ska se en ny fil skapad i din "dest" -mapp med namnet "style.css" och innehåller den här koden:

kropp font: 100% Helvetica, sans-serif; färg: # 333; 

Setup PostCSS

Vi får nu våra autoprefixer och cssnano plugins som körs. Uppdatera din Gruntfile processorer array till följande:

 processorer: [kräver ('autoprefixer') (), kräver ('cssnano') ()]

Test PostCSS

Lägg till PostCSS-testkoden i din "style.scss" -fil, kör kommandot grunt css igen och du bör hitta din omkompilerade "dest / style.css" -filen innehåller nu rätt autoprefixed och optimerad kod.

2. Stylus + PostCSS

Stylus och PostCSS fungerar särskilt bra tillsammans tack vare skapandet av PostStylus-paketet från Sean King, som kombinerar behandlingen av både Stylus och PostCSS. Om du är en Stylus-utvecklare kan du bara lägga till PostStylus i din kompileringsprocess och ha direkt tillgång till PostCSS-plugins som en del av ditt arbetsflöde..

PostStylus: https://github.com/seaneking/poststylus

Inställning via Gulp

Om du använder den premade Gulpfilen från startprojektet, noterar du att du använder plugin-plug-in-plugin. Det här är faktiskt bara där som det behövs för Sass och LESS installationsprocesser, men för Stylus behöver vi inte det eftersom vi använder PostStylus som vår kompilator istället.

Du kan ta bort det från ditt projekt med npm avinstallera gulp-postcss - save-dev, och radera den här raden från din Gulpfile:

var postcss = kräver ("gulp-postcss");

Nu kan vi installera de två plugins som vi behöver för Stylus och PostCSS compilation, genom att köra kommandot:

npm installera gulp-stylus poststylus --save-dev

Uppdatera din Gulpfile för att bli:

var gulp = kräver ("gulp"); Var-stylus = kräver ('gulp-stylus'); var poststylus = kräver (poststylus); var autoprefixer = kräver ("autoprefixer"); var cssnano = kräver ('cssnano'); gulp.task ('css', funktion () var processorer = [autoprefixer, cssnano], returnera gulp.src ('./ src / *. styl') .pipe (stylus (använd: [poststylus )). pip (gulp.dest ('./ dest')););

Här är vad vi har gjort ovan:

  • Tillagda variabler att ladda klunk-stylus, poststylus, autoprefixer och cssnano
  • Lades till autoprefixer och cssnano variabler till processorer array
  • Redigerar filtillägget i källfilen som vi sammanställer till ".styl" istället för ".css"
  • Ta bort .rör() rad som läser .rör (postcss (processorer))
  • Ersatte den med .rör (stylus (... , för att ställa in vulkan-stylus och poststylus-moduler för att hantera vår sammanställning

Testpreprocessor

Nu är vi redo att testa kompilering. I din "src" -mapp, byt namn på "style.css" till "style.styl" och lägg till det här testet Stylus-kod:

$ font-stack = Helvetica, sans-serif $ primärfärg = # 333 kaross typsnitt: 100% $ font-stack färg: $ primära färg

Springa det gulp css kommandot och du ska se en "style.css" -fil visas i din "dest" -mapp med det här innehållet:

kropp font: 100% Helvetica, sans-serif; färg: # 333; 

Test PostCSS

Lägg till PostCSS-testkoden som tidigare tillhandahållits i din "style.styl" -fil, så att endast flikindelningar finns i den inmatade koden, inte mellanslag.

Kompilera och kontrollera att du har rätt utgång i filen "dest / style.css".

kropp font: 100% Helvetica, sans-serif; färg: # 333 .css_nano, .css_nano + p, [class * = css_nano] display: -webkit-box; display: -webkit-flex; display: -ms -flexbox; display: flex; margin: 1rem 2.5rem 2rem 1.5rem; typsnitt: 400; vaddering: 1,75rem; bredd: 46,5rem

Inställning via Grunt

Precis som med Gulp-projektet för Stylus, är den vanliga PostCSS-kompilatorn som följer med startprojektet inte nödvändigt, det är rent för Sass och LESS installationsprocesser. Du kan ta bort det från ditt projekt med npm avinstallera grunt-postcss - save-dev.

Nu kan vi installera grunt-contrib-stylus och poststylus med kommandot:

npm installera grunt-contrib-stylus poststylus --save-dev

Vi kommer inte längre att använda grunt-postcss, så hitta den här raden:

 grunt.loadNpmTasks ( 'grunt-postcss');

Och ersätt det med:

 grunt.loadNpmTasks ( 'grunt-contrib-pennan');

Med tanke på att vi inte använder grunt-postcss betyder det att vi inte längre behöver postcss uppgift som vi har definierat inuti grunt.initConfig (...);. Ta bort den uppgiften config och ersätt den med den här nya nål uppgift:

 stylus: compile: options: , filer: 'dest / style.css': 'src / style.styl'

Testpreprocessor

Nu är vi redo att testa kompilering. I din "src" -mapp, byt namn på "style.css" till "style.styl" och lägg till det här testet Stylus-kod:

$ font-stack = Helvetica, sans-serif $ primärfärg = # 333 kaross typsnitt: 100% $ font-stack färg: $ primära färg

Kör kommandot grunt stylus och du bör se en "style.css" -fil visas i din "dest" -mapp med det här innehållet:

kropp font: 100% Helvetica, sans-serif; färg: # 333

Setup PostCSS

För att lägga till våra PostCSS-plugins i kompileringsprocessen måste vi först lägga till den här koden längst upp i vår Gruntfile ovanför module.exports ... linje:

var poststylus = funktion () returkrav ('poststylus') (['autoprefixer', 'cssnano']);

Här laddar du i alla PostCSS-plugins du vill använda, snarare än i en processorer array som du kommer att vara van vid från våra andra handledning.

Hitta sedan alternativ objektet inuti stylus-uppgiften och uppdatera det till följande:

 alternativ: använd: [poststylus],

Detta berättar för grunt-contrib-stylus att använda poststylus under kompilering och dess plugins tillsammans med den.

Test PostCSS

Lägg till "PostCSS-testkoden" till din "src / style.styl" -fil, kör grunt stylus, och du bör se följande innehåll skrivet i din "dest / style.css" -fil:

kropp font: 100% Helvetica, sans-serif; färg: # 333 .css_nano, .css_nano + p, [class * = css_nano] display: -webkit-box; display: -webkit-flex; display: -ms -flexbox; display: flex; margin: 1rem 2.5rem 2rem 1.5rem; typsnitt: 400; vaddering: 1,75rem; bredd: 46,5rem

3. MINDER + PostCSS

Inställning via Gulp

Installera den smutsfria modulen i ditt projekt med npm installera gulp-less - save-dev.

Nu kan du uppdatera din Gulpfile till följande:

var gulp = kräver ("gulp"); var postcss = kräver ("gulp-postcss"); var mindre = kräver ("gulp-less"); var autoprefixer = kräver ("autoprefixer"); var cssnano = kräver ('cssnano'); gulp.task ('css', funktion () var processorer = [autoprefixer, cssnano]; returnera gulp.src ('./ src / *. less') .pipe (mindre ()) .pipe (postcss ). pip (gulp.dest ('./ dest')););

Låt oss bryta ner vad vi har ändrat från standardstart Gulpfile:

  • Tillagda variabler att ladda gulp-mindre, autoprefixer och cssnano
  • Lades till autoprefixer och cssnano variabler till processorer array
  • Redigerar filtillägget i källfilen som vi sammanställer till ".less" istället för ".css"
  • Lagt till .rör (mindre ()) för att bearbeta det mindre, är det säkert att placera det före den linje som behandlar PostCSS

Testpreprocessor

Nu kan vi köra några tester för att se till att både LESS och PostCSS sammanställer som förväntat.

Byt namn på den befintliga filen "src / style.css" till "src / style.less" och lägg till följande testkod till den:

@ fontstack: Helvetica, sans-serif; @ primärfärg: # 333; kropp font: 100% @ font-stack; färg: @ primärfärg; 

Springa gulp css och du bör se en ny "style.css" -fil visas i din "dest" -mapp med innehållet:

kropp font: 100% Helvetica, sans-serif; färg: # 333

Test PostCSS

Nu lägger du till PostCSS-testkoden som du tidigare angett i den här handledningen till din "style.less" -fil.

Kör din gulp css kommando och du borde se den korrekta koden som nu visas i filen "dest / style.css".

kropp font: 100% Helvetica, sans-serif; färg: # 333 .css_nano, .css_nano + p, [class * = css_nano] display: -webkit-box; display: -webkit-flex; display: -ms -flexbox; display: flex; margin: 1rem 2.5rem 2rem 1.5rem; typsnitt: 400; vaddering: 1,75rem; bredd: 46,5rem

Inställning via Grunt

I ditt nya Grunt-projekt installerar du den grunt-bidragsfria modulen med npm installera grunt-bidrag-mindre, lägg sedan till en grunt.loadNpmTasks () funktion för det under den befintliga du har för PostCSS:

 grunt.loadNpmTasks ( 'grunt-postcss'); grunt.loadNpmTasks ( 'grunt-contrib-mindre');

Du måste nu konfigurera en ny uppgift för att bearbeta LESS. Efter denna rad:

 grunt.initConfig (

... men före det existerande postcss uppgift, lägg till den här koden:

 mindre: produktion: filer: 'src / style.css': 'src / style.less',

Nu registrerar vi en uppgift, för att köra LESS och sedan PostCSS. Efter grunt.loadNpmTasks () funktion du bara har satt in, lägg till:

 grunt.registerTask ('css', ['mindre', 'postcss']);

Testpreprocessor

För att testa din inställning, byt namn på din "src / style.css" -fil "style.less". Lägg till den här LESS-koden till den:

@ fontstack: Helvetica, sans-serif; @ primärfärg: # 333; kropp font: 100% @ font-stack; färg: @ primärfärg; 

Kör kommandot grunt css och du ska se en ny fil skapad i din "dest" -mapp med namnet "style.css" och innehåller den här koden:

kropp font: 100% Helvetica, sans-serif; färg: # 333333; 

Setup PostCSS

Nu lägger vi till våra PostCSS-plugins i kompileringsflödet. Uppdatera din Gruntfile processorer array till följande:

 processorer: [kräver ('autoprefixer') (), kräver ('cssnano') ()]

Test PostCSS

Lägg till PostCSS-testkoden i din "style.less" -fil, kör kommandot grunt css igen och du bör hitta din återkompilerade "dest / style.css" -filen innehåller nu rätt autoprefixed och optimerad kod:

kropp font: 100% Helvetica, sans-serif; färg: # 333 .css_nano, .css_nano + p, [class * = css_nano] display: -webkit-box; display: -webkit-flex; display: -ms -flexbox; display: flex; margin: 1rem 2.5rem 2rem 1.5rem; typsnitt: 400; vaddering: 1,75rem; bredd: 46,5rem

I nästa handledning

Nästa upp kommer vi att kolla på något som du nästan kan överväga en annan typ av förbehandlings-användning av PostCSS till automatiskt genererade BEM / SUIT-kompatibla CSS-klasser. Denna process gör BEM / SUIT-utvecklingen mycket enklare att hålla reda på, för att inte tala om effektivare.

Vi ses i nästa handledning!