Uso di PostCSS insieme a Sass, Stylus o LESS

Se sei interessato a utilizzare PostCSS, ma continui ad amare il tuo preprocessore preferito, non preoccuparti. Non è necessario scegliere tra i due: puoi usarli uno accanto all'altro.

Esistono diversi plugin PostCSS che si adattano molto bene ai preprocessori, poiché aggiungono funzionalità al tuo flusso di lavoro che altrimenti sarebbero impossibili, o almeno più difficili, utilizzando solo un preprocessore.

Toccheremo alcuni di questi plugin gratuiti, quindi esamineremo le guide di installazione per mostrarti come utilizzare PostCSS parallelamente a Sass, Stylus o LESS.

Perché usare entrambi?

Prima di entrare Come puoi utilizzare i preprocessori insieme a PostCSS, ne parleremo un po ' perché tu vorresti. La risposta breve è: per ottenere l'accesso ai plugin PostCSS la cui funzionalità completa i preprocessori. Per mostrarti perché valga la pena, esamineremo una serie di plug-in che funzionano molto bene con i preprocessori.

Nota: potrebbe essere possibile ottenere risultati finali simili utilizzando mixine e funzioni nel normale codice del preprocessore, ma con ciascuno degli esempi sotto il processo viene gestito automaticamente. Scrivi normalmente il tuo CSS e i plugin si occupano di tutto per te, senza funzioni da chiamare, senza mixin da includere o argomenti da passare.

autoprefixer

Ci sono stati molti mix di preprocessore scritti per gestire l'inserimento dei prefissi dei fornitori. Ad esempio, potresti aver usato @include box-sizing (border-box); dalla libreria Compass all'output del fornitore con prefisso box-sizing regole.

Il problema di affidarsi ai mixaggi per i prefissi dei fornitori è:

  1. Per prima cosa devi sapere che una proprietà ha bisogno di prefissi prima di poter decidere di distribuire un mixin per esso.
  2. Devi conoscere il nome del mixin associato e come usarlo.
  3. Devi tenere d'occhio quando i prefissi dei fornitori non sono più necessari per ogni proprietà (so che stavo prefissando box-sizing per modo di lungo ...)

Autoprefixer elimina questi problemi gestendo automaticamente il processo del prefisso del venditore. Autoprefixer esegue la scansione del tuo CSS, lo confronta con i dati di CanIUse.com, quindi aggiunge i prefissi richiesti.

Maggiori informazioni su Autoprefixer su: https://github.com/postcss/autoprefixer

rtlcss

Anche la generazione di fogli di stile sia predefiniti che RTL (da destra a sinistra) da una singola sorgente è qualcosa che è stato fatto con i preprocessori, tuttavia in genere richiede l'uso di più mixin e / o variabili interpolanti nel codice in più punti. Ad esempio, piuttosto che scrivere margin-left: 1rem; potresti aver bisogno di scrivere margin - # dir: 1rem; o @include margin-left (1rem);.

Tuttavia, con il plugin rtlcss di Mohammad Younes, non è necessario utilizzare i mixin o l'interpolazione delle variabili, basta scrivere il foglio di stile come faresti normalmente e il plug-in troverà tutte le istanze o "destra" o "sinistra" e le scambierà. Così margin-left: 1rem; diventa automaticamente margine-destra: 1rem; senza che tu debba scrivere alcun codice speciale per farlo accadere.

Maggiori informazioni su rtlcss all'indirizzo: https://github.com/MohammadYounes/rtlcss

postcss-daltonico

Con il plugin postcss-colorblind di Brian Holt puoi generare automaticamente diverse versioni del tuo foglio di stile che ti danno l'esperienza di prima mano di come apparirà il tuo design a una persona con daltonismo. È in grado di simulare otto diversi tipi di daltonismo, aiutandoti a ottenere una solida comprensione di quanto siano accessibili i tuoi schemi di colori.

Questo è un esempio di funzionalità che devi davvero andare a PostCSS per trovare, in quanto sarebbe molto difficile per i preprocessori raggiungere.

Maggiori informazioni su postcss-colorblind su: https://github.com/btholt/postcss-colorblind

postcss-SVGO

Il plugin postcss-svgo di Ben Briggs ti consente di ottimizzare a mani libere il codice SVG in linea. Ad esempio questo:

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

Può essere ridotto a questo, meno della metà del codice:

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

Maggiori informazioni su postcss-svgo su: https://github.com/ben-eb/postcss-svgo

cssnano

Mentre i preprocessor possono eliminare spazi bianchi e commenti, il pacchetto cssnano di Ben Briggs può eseguire tutti i tipi di ottimizzazioni al di sopra e al di là di questi due passaggi. Copriamo cssnano in dettaglio nel tutorial For Minification and Optimization.

Maggiori informazioni su cssnano all'indirizzo: https://github.com/ben-eb/cssnano

postcss-font-mago

Il plugin postcss-font-magician di Jonathan Neal rende l'aggiunta di caratteri personalizzati facile come l'utilizzo di caratteri regolari. Non è necessario utilizzare alcun mix, basta aggiungere un famiglia di font regola come faresti normalmente:

body font-family: "Alice"; 

... e il plugin si manterrà completo @ Font-face generazione per te:

@ font-face font-family: "Alice"; stile font: normale; font-weight: 400; src: local ("Alice"), local ("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") formato ("woff2"), url ("http://fonts.gstatic.com/s/alice/v7 /_H4kMcdhHr0B8RDaQcqpTA.woff ") formato (" woff "), url (" http://fonts.gstatic.com/s/alice/v7/acf9XsUhgp1k2j79ATk2cw.ttf ") formato (" truetype ") body font-family: "Alice"; 

Maggiori informazioni su postcss-font-magician su: https://github.com/jonathantneal/postcss-font-magician

Impostazione del progetto

Di seguito sono riportate sei guide di installazione: una guida Gulp e Grunt per ciascun principale preprocessore. Non è necessario leggere tutti e sei, puoi semplicemente saltare direttamente alla guida per il tuo strumento preferito di preprocessore e creazione. Se non sei sicuro di usare Gulp o Grunt, Gulp è sicuramente la scelta più semplice per questo tutorial.

Per qualsiasi guida che segui, dovrai iniziare con un progetto Gulp o Grunt vuoto. Puoi leggere come configurare i progetti Gulp o Grunt per PostCSS nelle esercitazioni precedenti

  • Guida rapida per PostCSS: Gulp Setup o
  • Guida rapida per PostCSS: installazione Grunt

rispettivamente.

Se non si desidera configurare manualmente il progetto da zero, è possibile scaricare i file sorgente allegati a questo tutorial ed estrarre il progetto di avviamento Gulp o Grunt in una cartella di progetto vuota. Quindi con un terminale o un prompt dei comandi puntato verso la cartella esegui il comando installazione di npm.

Installa i plugin PostCSS nel tuo progetto

Dopo aver impostato un progetto vuoto per una delle sezioni seguenti, dovrai anche installare due plugin PostCSS: Autoprefixer e cssnano. Puoi farlo eseguendo il comando:

npm install autoprefixer cssnano --save-dev

Utilizzeremo questi due plug-in per verificare che PostCSS e il preprocessore funzionino insieme come previsto.

Preelaborazione prima di PostCSS

La prima regola per utilizzare un preprocessore con PostCSS è che dovresti sempre eseguire il suddetto preprocessore primo. Questo perché non vuoi avere alcuna sintassi specifica del preprocessore nel tuo codice che possa soffocare un plug-in PostCSS e inoltre non vuoi che PostCSS apporti modifiche al tuo codice che potrebbero impedire l'esecuzione di un preprocessore come previsto.

Plugin PostCSS e "Codice test PostCSS"

Per ciascuno dei preprocessori che abbiamo configurato, avremo loro eseguire autoprefixer e cssnano dopo che il preprocessore ha terminato la sua compilazione. In ogni caso, dovremo aggiungere un codice di prova per il funzionamento di questi due plug-in.

Per salvare ripetendo lo stesso codice in ogni sezione sottostante, quando vedi un'istruzione che ti dice di aggiungere il tuo codice di prova PostCSS, per favore aggiungi questo al file sorgente del preprocessore su cui stai lavorando:

.css_nano, .css_nano + p, [class * = "css_nano"], .css_nano / * cssnano rimuoverà questo commento * / display: flex; font-weight: normal; margin-top: 1rem; margin-bottom: 2rem; margin-left: 1.5rem; margine-destra: 2.5rem; font-weight: normal; imbottitura: 1,75 m; larghezza: calc (50rem - (2 * 1.75rem)); 

In caso di successo, il codice compilato verrà in ogni caso visualizzato come:

.css_nano, .css_nano + p, [classe * = css_nano] display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; margine: 1rem 2.5rem 2rem 1.5rem; font- peso: 400; padding: 1.75rem; larghezza: 46.5rem

Nota: gli usi di flexbox sono stati autoprefissi e cssnano ha eseguito più ottimizzazioni del codice. Stiamo usando lo stesso codice per testare cssnano come abbiamo fatto nella precedente esercitazione For Minification and Optimization, quindi per favore fai riferimento alla sezione "cssnano" per i dettagli sulle ottimizzazioni che vengono eseguite.

1. Sass + PostCSS

Poiché stai già lavorando con Node.js per eseguire Gulp o Grunt e PostCSS, il modo più semplice per usare Sass al loro fianco è farlo tramite LibSass. Anche questo è considerevolmente più veloce di Ruby Sass. Implementeremo LibSass tramite i moduli gulp-sass o grunt-contrib-sass.

Imposta tramite Gulp

Installa il modulo gulp-sass nel tuo progetto con npm installa gulp-sass --save-dev.

Ora puoi aggiornare il tuo Gulpfile al seguente:

var gulp = require ('gulp'); var postcss = require ('gulp-postcss'); var sass = require ('gulp-sass'); var autoprefixer = require ('autoprefixer'); var cssnano = require ('cssnano'); gulp.task ('css', function () var processors = [autoprefixer, cssnano]; restituisce gulp.src ('./ src / *. scss') .pipe (sass (). on ('errore', sass .logError)) .pipe (postcss (processors)) .pipe (gulp.dest ('./ dest')););

Analizziamo ciò che è stato modificato dall'avvio predefinito Gulpfile:

  • Aggiunte variabili da caricare gulp-sass, autoprefixer e cssnano
  • Aggiunto il autoprefixer e cssnano variabili al processori schieramento
  • Modificato l'estensione del file sorgente sul file di origine che stiamo compilando in ".scss" invece di ".css"
  • Aggiunto un nuovo tubo() linea, .tubo (sass () ... , per elaborare il Sass, avendo cura di posizionarlo prima della linea che elabora PostCSS

Ora possiamo eseguire alcuni test per accertarci che Sass e PostCSS stiano compilando come previsto.

Test Preprocessor

Rinominare il file "src / style.css" esistente in "src / style.scss" e aggiungervi il seguente codice di test:

$ font-stack: Helvetica, sans-serif; $ primary-color: # 333; body font: 100% $ font-stack; colore: $ colore primario; 

Correre gulp css e dovresti vedere un nuovo file "style.css" apparire nella tua cartella "dest" con i contenuti:

body font: 100% Helvetica, sans-serif; colore: # 333;  

Prova PostCSS

Ora aggiungi il codice di test PostCSS fornito in precedenza in questo tutorial sul tuo file "style.scss".

Esegui il tuo gulp css comando e dovresti vedere il codice corretto apparire nel tuo file "dest / style.css":

body font: 100% Helvetica, sans-serif; colore: # 333 .css_nano, .css_nano + p, [classe * = css_nano] display: -webkit-box; display: -webkit-flex; display: -ms -flexbox; display: flex; margin: 1rem 2.5rem 2rem 1.5rem; font-weight: 400; padding: 1.75rem; width: 46.5rem

Imposta tramite Grunt

Nel tuo nuovo progetto Grunt, installa il modulo grunt-contrib-sass con npm installa grunt-contrib-sass.

Quindi aggiungere un grunt.loadNpmTasks () funzione per esso sotto quello esistente che hai per PostCSS:

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

Ora dovrai configurare una nuova attività per l'elaborazione di Sass. Dopo questa linea:

 grunt.initConfig (

... ma prima dell'esistente postcss compito, aggiungi questo codice:

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

Ora registreremo un'attività che eseguirà Sass e PostCSS. Dopo il grunt.loadNpmTasks () funzione appena inserita, aggiungi:

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

Test Preprocessor

Per verificare la tua configurazione, rinomina il tuo file "src / style.css" esistente in "style.scss". Aggiungi questo codice Sass ad esso:

$ font-stack: Helvetica, sans-serif; $ primary-color: # 333; body font: 100% $ font-stack; colore: $ colore primario; 

Esegui il comando grunt css e dovresti vedere un nuovo file creato nella cartella "dest" denominata "style.css" e contenente questo codice:

body font: 100% Helvetica, sans-serif; colore: # 333; 

Imposta PostCSS

Ora avremo i plugin per Autoprefixer e cssnano in esecuzione. Aggiorna il tuo Gruntfile's processori array al seguente:

 processori: [require ('autoprefixer') (), require ('cssnano') ()]

Prova PostCSS

Aggiungi il codice di test PostCSS al tuo file "style.scss", esegui il comando grunt css di nuovo e dovresti trovare il file "dest / style.css" ricompilato ora contiene il codice corretto prefissato e ottimizzato.

2. Stilo + PostCSS

Stylus e PostCSS funzionano particolarmente bene insieme grazie alla creazione del pacchetto PostStylus di Sean King, che combina l'elaborazione di Stylus e PostCSS. Se sei uno sviluppatore Stylus, puoi semplicemente aggiungere PostStylus al tuo processo di compilazione e avere immediatamente accesso all'utilizzo dei plugin PostCSS come parte del tuo flusso di lavoro.

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

Imposta tramite Gulp

Se stai usando Gulpfile premed dal progetto di base, noterai che usa il plugin gulp-postcss. Questo è in realtà solo lì come è necessario per i processi di installazione di Sass e LESS, ma per Stylus non ne abbiamo bisogno perché stiamo usando PostStylus come il nostro compilatore invece.

Puoi rimuoverlo dal tuo progetto con npm uninstall gulp-postcss --save-dev, ed elimina questa linea dal tuo Gulpfile:

var postcss = require ('gulp-postcss');

Ora possiamo installare i due plug-in necessari per la compilazione Stylus e PostCSS, eseguendo il comando:

npm installa gulp-stylus poststylus --save-dev

Aggiorna il tuo Gulpfile per diventare:

var gulp = require ('gulp'); var stylus = require ('gulp-stylus'); var poststylus = require ('poststylus'); var autoprefixer = require ('autoprefixer'); var cssnano = require ('cssnano'); gulp.task ('css', function () var processors = [autoprefixer, cssnano]; restituisce gulp.src ('./ src / *. styl') .pipe (stylus (uso: [poststylus (processori)] )) .pipe (gulp.dest ('./ dest')););

Ecco cosa abbiamo fatto sopra:

  • Aggiunte variabili da caricare sorso-stilo, poststylus, autoprefixer e cssnano
  • Aggiunto il autoprefixer e cssnano variabili al processori schieramento
  • Modificato l'estensione del file sorgente sul quale stiamo compilando ".styl" invece di ".css"
  • Rimosso il .tubo() linea che legge .tubo (postcss (processori))
  • Sostituito con .tubo (stilo (... , per impostare i moduli gulp-stylus e poststylus per gestire la nostra compilation

Test Preprocessor

Ora siamo pronti per testare la compilazione. Nella cartella "src", rinomina "style.css" in "style.styl" e aggiungi questo codice dello stilo di prova:

$ font-stack = Helvetica, sans-serif $ primary-color = # 333 carattere del corpo: 100% $ font-stack color: $ primary-color

Corri il gulp css comando e dovresti vedere un file "style.css" apparire nella tua cartella "dest" con questo contenuto:

body font: 100% Helvetica, sans-serif; colore: # 333; 

Prova PostCSS

Aggiungi il codice di test PostCSS fornito in precedenza al file "style.styl", assicurandoti che solo i rientri della scheda siano nel codice incollato, non negli spazi.

Ricompila e verifica di avere l'output appropriato nel tuo file "dest / style.css".

body font: 100% Helvetica, sans-serif; colore: # 333 .css_nano, .css_nano + p, [classe * = css_nano] display: -webkit-box; display: -webkit-flex; display: -ms -flexbox; display: flex; margin: 1rem 2.5rem 2rem 1.5rem; font-weight: 400; padding: 1.75rem; width: 46.5rem

Imposta tramite Grunt

Come nel caso del progetto Gulp per Stylus, non è richiesto il compilatore PostCSS predefinito fornito con il progetto di avvio, essendo lì esclusivamente per i processi di installazione di Sass e LESS. Puoi rimuoverlo dal tuo progetto con npm uninstall grunt-postcss --save-dev.

Ora possiamo installare grunt-contrib-stylus e poststylus con il comando:

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

Non useremo più grunt-postcss, quindi individua questa riga:

 grunt.loadNpmTasks ( 'grunt-postcss');

E sostituirlo con:

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

Dato che non stiamo usando grunt-postcss, significa che non avremo più bisogno del postcss compito che abbiamo definito all'interno grunt.initConfig (...);. Eliminare quella configurazione di attività e sostituirla con questa nuova stilo compito:

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

Test Preprocessor

Ora siamo pronti per testare la compilazione. Nella cartella "src", rinomina "style.css" in "style.styl" e aggiungi questo codice dello stilo di prova:

$ font-stack = Helvetica, sans-serif $ primary-color = # 333 carattere del corpo: 100% $ font-stack color: $ primary-color

Esegui il comando stilo grugnito e dovresti vedere un file "style.css" apparire nella tua cartella "dest" con questo contenuto:

body font: 100% Helvetica, sans-serif; colore: # 333

Imposta PostCSS

Per aggiungere i nostri plugin PostCSS al processo di compilazione, dobbiamo prima aggiungere questo codice alla parte superiore del nostro Gruntfile, sopra il module.exports ... linea:

var poststylus = function () return require ('poststylus') (['autoprefixer', 'cssnano']);

Qui è dove caricherete qualsiasi plugin PostCSS che volete usare, piuttosto che in a processori array come sarai abituato dai nostri altri tutorial.

Quindi trova il opzioni oggetto all'interno dell'attività dello stilo e aggiornarlo come segue:

 opzioni: uso: [poststylus],

Questo dice a grunt-contrib-stylus di usare poststylus durante la compilazione e i suoi plugin insieme ad esso.

Prova PostCSS

Aggiungi il "codice di test PostCSS" al tuo file "src / style.styl", esegui stilo grugnito, e dovresti vedere il seguente contenuto scritto nel tuo file "dest / style.css":

body font: 100% Helvetica, sans-serif; colore: # 333 .css_nano, .css_nano + p, [classe * = css_nano] display: -webkit-box; display: -webkit-flex; display: -ms -flexbox; display: flex; margin: 1rem 2.5rem 2rem 1.5rem; font-weight: 400; padding: 1.75rem; width: 46.5rem

3. MENO + PostCSS

Imposta tramite Gulp

Installa il modulo senza gulp nel tuo progetto con npm install gulp-less --save-dev.

Ora puoi aggiornare il tuo Gulpfile al seguente:

var gulp = require ('gulp'); var postcss = require ('gulp-postcss'); var less = require ('gulp-less'); var autoprefixer = require ('autoprefixer'); var cssnano = require ('cssnano'); gulp.task ('css', function () var processors = [autoprefixer, cssnano]; restituisce gulp.src ('./ src / *. less') .pipe (less ()) .pipe (postcss (processori) ) .pipe (gulp.dest ('./ dest')););

Analizziamo ciò che è stato modificato dall'avvio predefinito Gulpfile:

  • Aggiunte variabili da caricare gulp-less, autoprefixer e cssnano
  • Aggiunto il autoprefixer e cssnano variabili al processori schieramento
  • Modificato l'estensione del file sorgente che stiamo compilando in ".less" invece di ".css"
  • aggiunto .tubo (meno ()) per elaborare il MENO, assicurandosi di posizionarlo prima della linea che elabora PostCSS

Test Preprocessor

Ora possiamo eseguire alcuni test per accertarci che sia LESS che PostCSS stiano compilando come previsto.

Rinominare il file "src / style.css" esistente in "src / style.less" e aggiungervi il seguente codice di test:

@ font-stack: Helvetica, sans-serif; @ primary-color: # 333; body font: 100% @ font-stack; colore: @ colore primario; 

Correre gulp css e dovresti vedere un nuovo file "style.css" apparire nella tua cartella "dest" con i contenuti:

body font: 100% Helvetica, sans-serif; colore: # 333

Prova PostCSS

Ora, nel tuo file "style.less" aggiungi il codice di test PostCSS fornito in precedenza in questo tutorial.

Esegui il tuo gulp css comando e dovresti vedere il codice corretto che appare nel tuo file "dest / style.css".

body font: 100% Helvetica, sans-serif; colore: # 333 .css_nano, .css_nano + p, [classe * = css_nano] display: -webkit-box; display: -webkit-flex; display: -ms -flexbox; display: flex; margin: 1rem 2.5rem 2rem 1.5rem; font-weight: 400; padding: 1.75rem; width: 46.5rem

Imposta tramite Grunt

Nel tuo nuovo progetto Grunt, installa il modulo grunt-contrib-less con npm installa grunt-contrib-less, quindi aggiungere un grunt.loadNpmTasks () funzione per esso sotto quello esistente che hai per PostCSS:

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

Ora dovrai configurare una nuova attività per l'elaborazione di MENO. Dopo questa linea:

 grunt.initConfig (

... ma prima dell'esistente postcss compito, aggiungi questo codice:

 less: produzione: file: 'src / style.css': 'src / style.less',

Ora registreremo un'attività, per eseguire LESS e poi PostCSS. Dopo il grunt.loadNpmTasks () funzione appena inserita, aggiungi:

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

Test Preprocessor

Per testare il tuo setup, rinomina il tuo file "src / style.css" "style.less". Aggiungi questo codice LESS ad esso:

@ font-stack: Helvetica, sans-serif; @ primary-color: # 333; body font: 100% @ font-stack; colore: @ colore primario; 

Esegui il comando grunt css e dovresti vedere un nuovo file creato nella cartella "dest" denominata "style.css" e contenente questo codice:

body font: 100% Helvetica, sans-serif; colore: # 333333; 

Imposta PostCSS

Ora aggiungeremo i nostri plugin PostCSS nel flusso di compilazione. Aggiorna il tuo Gruntfile's processori array al seguente:

 processori: [require ('autoprefixer') (), require ('cssnano') ()]

Prova PostCSS

Aggiungi il codice di test PostCSS al tuo file "style.less", esegui il comando grunt css di nuovo e dovresti trovare il file "dest / style.css" ricompilato ora contiene il codice corretto prefissato e ottimizzato:

body font: 100% Helvetica, sans-serif; colore: # 333 .css_nano, .css_nano + p, [classe * = css_nano] display: -webkit-box; display: -webkit-flex; display: -ms -flexbox; display: flex; margin: 1rem 2.5rem 2rem 1.5rem; font-weight: 400; padding: 1.75rem; width: 46.5rem

Nel prossimo tutorial

In seguito andremo a verificare qualcosa che potresti quasi considerare un diverso tipo di pre-elaborazione, utilizzando PostCSS per generare automaticamente classi CSS compatibili con BEM / SUIT. Questo processo semplifica notevolmente lo sviluppo di BEM / SUIT, oltre a quello più efficiente.

Ci vediamo nel prossimo tutorial!