PostCSS

PostCSS
Philosopher’s stone, PostCSS logo
Developer(s) Andrey Sitnik, Ben Briggs[1]
Initial release November 4, 2013 (2013-11-04)
Stable release
5.2.4, Duke Vapula / September 30, 2016 (2016-09-30)[2]
Repository github.com/postcss/postcss
Development status Active
Written in JavaScript
Operating system Cross-platform
Available in English
Type CSS development tool
License MIT License[3]
Website postcss.org

PostCSS is a software development tool that uses JavaScript-based plugins to automate routine CSS operations.[4] The tool has been used to develop the code of Wikipedia,[5][6] Facebook,[7] and GitHub.[8][9] PostCSS is a top-favored CSS tool among npm users.[10] It was designed by Andrey Sitnik with the idea taking its origin in his front-end work for Evil Martians.[11]

How it works

Structure

PostCSS workflow

Unlike Sass and Less, PostCSS is not a CSS-compiled template language but a framework to develop CSS tools.[12] However, it can be used to develop a template language such as Sass and LESS.[13]

The PostCSS core consists of:[14]

All the useful features are made available through plugins. The plugins are small programs working with the object tree. After the core has transformed a CSS string into an object tree, the plugins, by turn, analyze and change the tree. Then the PostCSS core generates a new CSS string for the plugin-changed tree.

Usage

Both the PostCSS core and the plugins are written in JavaScript and distributed through npm.

PostCSS offers API for low-level JavaScript operations:

// Load the core and plugins from npm
const postcss = require('postcss')
const autoprefixer = require('autoprefixer')
const precss = require('precss')

// Indicate the plugins to use 
const processor = postcss([autoprefixer, precss])

// Indicate the CSS code and the names of the input/output file 
processor.process('a {}', { from: './app.css', to: './app.build.css' })
  // Use Promise API in case there are asynchronous plugins
  .then(result => {
    // Get the post-processed CSS code displayed
    console.log(result.css)
    // Get the warning messages displayed
    for ( let message of result.warnings() ) {
      console.warn(message.toString())
    }
  })

There are official tools making it possible to use PostCSS with build systems such as Webpack,[15] Gulp,[16] and Grunt.[17] There is also a console interface available for download.[18] Browserify or Webpack can be used to open PostCSS in a browser.[19]

Syntaxes

PostCSS allows changing the parser and generator. In this case, PostCSS could be used to work with the Less[20] and SCSS[21] sources. However, PostCSS on its own cannot compile Sass or Less to CSS. What it does is change the original files — for instance, by sorting the CSS properties or checking the code for mistakes.

Besides, PostCSS supports SugarSS, a syntax not unlike Sass and Stylus in its simplicity and succinctness.[22]

Plugins

The number of PostCSS plugins amounts to more than 300.[23] PostCSS plugins can solve most CSS processing tasks ranging from analysis and properties sorting to minification. However, the plugins significantly vary in quality and popularity.

The complete plugin list can be found on postcss.parts. Below are a few examples, with the what-fors explained:

There are a number of tools expanding their functionality by PostCSS. For example, it is PostCSS that the popular bundler Webpack uses to work with CSS.[39]

Criticism

Despite certain plugins having faced criticism,[40] some PostCSS plugins have become de facto standard. For instance, Google recommends using Autoprefixer to solve the problem of browser prefixes in CSS.[41]

The industry opinion of PostCSS is highly positive,[42] it going as far as Sass developers considering PostCSS a good addition to Sass.[43]

The biggest question is whether PostCSS plugins should be the only option to use when making a CSS build system. On the one hand, PreCSS or cssnext can perform many Sass and Less functions,[44] with SugarSS possibly being a good replacement for the minimalistic syntax of Sass and Stylus.[45] On the other hand, some experts, including the PostCSS creator himself, recommend sticking to Sass and Less for legacy projects.[46]

Advantages

Disadvantages

History

Born in the course of the Rework project, the idea of modular CSS processing was suggested by TJ Holowaychuk September 1, 2012.[58] February 28, 2013, TJ expressed it in public.[59]

March 14, 2013, Andrey Sitnik’s front-end work for Evil Martians resulted in Autoprefixer, a Rework-based plugin.[60] Initially, the plugin name was rework-vendors.[61]

As Autoprefixer grew, Rework could no longer to meet its needs.[62] September 7, 2013,[63] Andrey Sitnik started to develop PostCSS based on the Rework ideas.[64]

In 3 months, the first PostCSS plugin, grunt-pixrem was released.[65] December 22, 2013, Autoprefixer version 1.0 migrated to PostCSS.[66]

For PostCSS, the primary style focus is alchemy.[67] The project logo represents the philosopher's stone.[68] Major and minor PostCSS versions get their names after the Ars Goetia demons.[69] For instance, version 1.0.0 is called Marquis Decarabia.

The term postprocessor has caused some confusion.[70] The PostCSS team used the term to show that PostCSS was not a template language (preprocessor) but a CSS tool. However, some developers think the term postprocessor would better suit browser tools[40] (for instance, -prefix-free). The situation has become even more complicated after the release of PreCSS. Now, instead of postprocessor, the PostCSS team use the term processor.[71]

References

  1. Who can release PostCSS to npm
  2. PostCSS Releases
  3. License in PostCSS repo
  4. First article about PostCSS in Tuts+ course
  5. 1 2 Adding PostCSS commit in Wikipedia repo
  6. 1 2 Wikimedia Stylelint Config
  7. 1 2 Improving CSS quality at Facebook and beyond
  8. PostCSS settings GitHub build tool
  9. 1 2 Primer Stylelint Config
  10. CSS preprocessors downloads from npm
  11. Evil Martians commit in PostCSS repo
  12. 1 2 What is PostCSS discussion
  13. PostCSS Deep Dive: Preprocessing with “PreCSS”
  14. 1 2 Andrey Sitnik - PostCSS: The Future After Sass and LESS
  15. postcss-loader
  16. gulp-postcss
  17. grunt-postcss
  18. postcss-cli
  19. Running postcss in the browser
  20. postcss-less
  21. postcss-scss
  22. sugarss
  23. PostCSS plugins list
  24. autoprefixer
  25. The Results of The Ultimate CSS Survey
  26. css-modules
  27. css-loader dependencies
  28. stylelint
  29. stylefmt
  30. precss
  31. cssnext.io
  32. cssnano.co
  33. cssnano users list
  34. rtlcss.com
  35. RTL CSS generation: Switch from CSSJanus to RTLCSS
  36. postcss-assets
  37. postcss-inline-svg
  38. postcss-sprites
  39. css-loader sources
  40. 1 2 The Trouble With Preprocessing Based on Future Specs
  41. Set Up Your Build Tools
  42. An Introduction To PostCSS
  43. 1 2 Extending Sass with PostCSS
  44. Breaking up with Sass: it’s not you, it’s me
  45. SugarSS discussion on Meteor forum
  46. 1 2 dotCSS 2015 - Andrey Sitnik - Fix Global CSS with PostCSS
  47. PostCSS Mythbusting: Four PostCSS Myths Busted
  48. Using PostCSS Together with Sass, Stylus, or LESS
  49. PostCSS performance discussion in Twitter
  50. PostCSS – Sass Killer or Preprocessing Pretender?
  51. PostCSS parsers benchmark
  52. PostCSS preprocessors benchmark
  53. PostCSS becomes 1.5x faster
  54. The Sad State of Web Development
  55. postcss-use downloads
  56. Integrate value & selector parsing into PostCSS core
  57. Event based API
  58. First Rework commit
  59. Modular CSS preprocessing with rework
  60. First Autoprefixer commit
  61. Autoprefixer rename commit
  62. Facilitate autoprefixer needs
  63. First PostCSS commit
  64. PostCSS Second Birthday
  65. First grunt-pixrem commit
  66. Autoprefixer release 1.0 “Plus ultra”
  67. PostCSS website design discussion
  68. Tweet about PostCSS logo
  69. Tweet about PostCSS releases
  70. CSS pre- vs. post-processing
  71. Tweet about stop using postprocessor word
This article is issued from Wikipedia - version of the 10/14/2016. The text is available under the Creative Commons Attribution/Share Alike but additional terms may apply for the media files.