PostCSS

PostCSS on tarkvaraarenduse tööriist, mis kasutab JavaScripti-põhiseid pluginaid rutiinsete CSS-operatsioonide automatiseerimiseks. Seda on kasutatud Vikipeedia, Facebooki ja GitHubi arenduses. PostCSS-i looja on Andrei Sitnik, kes töötas tol ajal ettevõttes Evil Martians.

Tööpõhimõte

Struktuur 

Erinevalt Sassist ja LESS-ist, PostCSS ei ole CSS-ist kompileeritud mallikeel, vaid raamistik CSS-tööriistade loomiseks. Seda saab kasutada selliste mallikeelte nagu Sass ja LESS arendamiseks.

PostCSS-i tuum koosneb järgmistest osadest:

 CSS-i parser, mis genereerib objektipuu (AST) CSS-i koodireast;
 komplekt klassidest, mida see puu sisaldab;
 CSS-generaator, mis genereerib objektipuust CSS koodi;
 koodi kaardi generaator CSS-is tehtud muudatuste jaoks.

Kõik vajaminevad funktsioonid on kättesaadavad pluginate kaudu. Pluginad on väikesed programmid, mis töötavad objektipuuga. Kui tuum on transformeerinud CSS koodi objektipuuks, pluginad analüüsivad ja muudavad seda.

Kasutus 

Nii PostCSS-i tuum kui ka pluginprogrammid on kirjutatud JavaScriptis ja levitatud läbi npm-süsteemi. PostCSS pakub madala taseme JavaScripti toimingute jaoks API-d:

// Laadi tuum ja pluginad npm-ist
const postcss = require('postcss')
const autoprefixer = require('autoprefixer')
const precss = require('precss')

// Määra pluginad, mida kasutada
const processor = postcss([autoprefixer, precss])

// Määra CSS-kood ja sisend- ja väljundfailide nimed 
processor.process('a {}', { from: './app.css', to: './app.build.css' })
  // Kasuta Promise API-d juhuks, kui on olemas sünkroniseerimata pluginad
  .then(result => {
    // Protsessitud CSS-kood
    console.log(result.css)
    // Hoiatused
    for ( let message of result.warnings() ) {
      console.warn(message.toString())
    }
  })

On olemas ametlikud tööriistad, mis võimaldavad PostCSS-i kasutada koos selliste ehitamissüsteemidega nagu Webpack, Gulp ja Grunt. Lisaks on võimalik alla laadida käsureaga liidest. Kasutades Browserifyt või Webpacki, saab PostCSS-i avada otse brauseris.

Süntaksid 

PostCSS võimaldab vahetada parserit ja generaatorit, et töötada LESS ja SCSS allikatega. Iseenesest PostCSS ei saa aga kompileerida LESS, SCSS ja Sass koodi CSS-iks, vaid ainult muuta originaalfaile – näiteks sorteerida CSS omadusi või otsida koodivigu.

Pluginad 

PostCSS-i jaoks on olemas rohkem kui 300 laiendust. PostCSS-i pluginad lahendavad enamikku CSS-i tootmisülesandeid. Pluginate kvaliteet ja populaarsus on väga erinev.

Täielik pluginate nimekiri on leitav lehel postcss.parts. Mõned näited:

 autoprefixer lisab ja kustutab brauserite prefikseid. See on PostCSS populaarseim plugin. SitePointi hinnangu kohasel kasutas 2016. aasta märtsis seda 56% arendajatest;
 CSS modules automaatselt isoleerib CSS-selektoreid ja organiseerib koodi. CSS modules on Webpacki sisse ehitatud;
 styleint analüüsib CSS koodi, otsib vigu ja kontrollib vastavust kehtivatele standarditele. styleint on kasutusel Vikipeedias, Facebookis ja GitHubis. Teine plugin, stylefmt, parandab CSS-i vastavalt styleint sätetele;
 postcss-cssnext emuleerib funktsioone lõpetamata CSS-spetsifikatsiooni mustanditest. See on kasutusel Vikipeedias;
 cssnano teeb CSS-i lühemaks, eemaldades tühikuid ja tihendades koodi. cssnano on kasutusel Webpackis, BBC-s ja JSFiddle’is;
 postcss-assets, postcss-inline-svg ja postcss-sprites töötavad graafikaga.

Kriitika 

Ühed pluginad on kritiseeritud, teised muutusid de facto standardiks. Näiteks autoprefikserit soovitab Google brauserite prefiksite probleemi lahendamiseks.

Üldiselt võtsid arendajad PostCSS soojalt vastu. Sassi arendajad peavad PostCSS-i heaks täienduseks Sassile.

Põhiline küsimus on järgmine: kas PostCSS-ist piisab CSS süsteemi ehitamisel. Ühelt poolt saavad sellised laiendused nagu PreCSS või postcss-cssnext asendada paljusid Sass ja LESS funktsioone. SugarSS süntaks saab asendada Sassi ja Styluse minimalistliku süntaksi. Teisest küljest aga mõned eksperdid, sealhulgas ka PostCSS-i looja, soovitavad vanades projektides kasutada Sassi ja LESSi.

Eelised 

 Funktsionaalsus. Paljud PostCSS-i pluginad on unikaalsed. Sellepärast PostCSS-i kasutatakse sageli ka nendes projektides, kus on juba kasutusel Sass või LESS.
 Unifitseerimine. PostCSS-i pluginad lubavad lahendada enamikku CSS-i ehitamise ülesandeid. Tulemusena saavad kõik CSS-i tööriistad kasutada üht parserit, ühisarhitektuuri ja ühiseid arendusvahendeid. Kuna kõik pluginad kasutavad ühte ja sama ühekordselt moodustatud objektipuud, tõuseb jõudlus.
 Moodulid. Kasutaja on oma PostCSS-i pluginate valikul vaba ja võib suurema jõudluse jaoks ebavajalikud välja lülitada. Kuna probleemide lahendamiseks võib olla mitu erinevat pluginit, kasutaja saab ise valida sobivamaid tööriistu. PostCSSi looja usub, et mida suurem arv pluginaid võistlevad kasutaja tähelepanu pärast, seda paremaks nad lõpuks muutuvad.
 Kiirus. PostCSS on varustatud ühe kiireima JS-põhise CSS-i parseriga. See on kuni 20 korda kiirem kui Ruby Sassil ja 4 korda kiirem kui LESS-il, kui vaadata eeltöötlusprotsessori baasülesandeid. Tegelik jõudlus sõltub suurel määral paigaldatud pluginate arvust. PostCSS-i looja on öelnud, et kaasaegsed eeltöötlusprotsessorid töötavad liiga kiiresti, et kiirendus oleks märgatav.

Puudused 

 Raske konfigureerida. Mõned arendajad kipuvad vältima pluginate valimist ja nende sätestamist. Valmis pluginate komplektid on probleemile ainult osaline lahendus.
 Mittestandardne süntaks. Kuna iga projekt kasutab oma pluginate komplekti, ei pruugi uus arendaja kohe mõista, et mingi talle tundmatu funktsioon on seotud ebapopulaarse PostCSS-i pluginaga. Soovitatav on kasutada postcss-use, et näidata iga faili nimelaiendit, kuid paljud ei kasuta sellist lähenemist.
 Eraldi parserid selektorite ja väärtuste jaoks. PostCSS salvestab CSS-selektoreid ja ridade väärtuseid ilma neid täiendavalt analüüsimata. Nende parsimiseks peavad pluginad kasutama lisaparsereid. PostCSS-i meeskond kavatseb seda tulevastes versioonides parandada.
 Järkjärguline töötlemine. Kuna objektipuu suudab korraga reageerida ainult ühele pluginale, võib arvukate pluginate kasutamine vähendada jõudlust. Lisaks on funktsioone, mida ükski plugin ei saa töödelda. PostCSS-i meeskond kavatseb seda tulevastes versioonides parandada.

Viited

Välislingid 

 Ametlik veebisait
 Pluginate nimekiri

Skriptimiskeeled
Tarkvaraarendus