PostCSS Workflows & Best Practices
π Common PostCSS Workflows
src/styles.css β PostCSS β dist/styles.css β Browser
β β β
Variables Plugins Optimized CSS
Imports Processing Source Maps
Nesting Minification
// postcss.config.js (Development)
module . exports = {
plugins : [
require ( "postcss-import" ) ,
require ( "postcss-simple-vars" ) ,
require ( "postcss-nested" ) ,
require ( "postcss-preset-env" ) ( { stage : 1 } ) ,
require ( "autoprefixer" ) ,
require ( "postcss-reporter" ) ( { clearAllMessages : true } ) ,
] ,
} ;
# CLI
postcss src/styles.css -o dist/styles.css --watch
# Gulp
gulp watch
# Vite
npm run dev
src/styles.css β PostCSS β dist/styles.min.css
β β β
Variables Plugins Minified CSS
Imports Processing Optimized
Nesting Prefixing Gzipped
Custom CSS Linting Source Maps
// postcss.config.js (Production)
module . exports = {
plugins : [
require ( "postcss-import" ) ,
require ( "postcss-simple-vars" ) ,
require ( "postcss-nested" ) ,
require ( "postcss-preset-env" ) ( { stage : 3 } ) ,
require ( "autoprefixer" ) ,
require ( "cssnano" ) ( { preset : "advanced" } ) ,
require ( "postcss-purgecss" ) ( {
content : [ "src/**/*.html" , "src/**/*.js" ] ,
} ) ,
] ,
} ;
3. Component Library Workflow
components/
βββ Button/
β βββ Button.css
β βββ Button.js
βββ Card/
β βββ Card.css
β βββ Card.js
βββ index.css
// postcss.config.js
module . exports = {
plugins : [
require ( "postcss-modules" ) ( {
generateScopedName : "[name]__[local]___[hash:base64:5]" ,
} ) ,
require ( "postcss-simple-vars" ) ,
require ( "postcss-nested" ) ,
require ( "autoprefixer" ) ,
] ,
} ;
4. Multi-Environment Workflow
// postcss.config.js
const env = process . env . NODE_ENV || "development" ;
module . exports = {
plugins : [
require ( "postcss-import" ) ,
require ( "postcss-simple-vars" ) ,
require ( "postcss-nested" ) ,
require ( "postcss-preset-env" ) ( {
stage : env === "production" ? 3 : 1 ,
} ) ,
require ( "autoprefixer" ) ,
...( env === "production"
? [
require ( "cssnano" ) ( { preset : "advanced" } ) ,
require ( "postcss-purgecss" ) ( {
content : [ "src/**/*.{html,js}" ] ,
} ) ,
]
: [ ] ) ,
require ( "postcss-reporter" ) ( ) ,
] ,
} ;
// Correct order
module . exports = {
plugins : [
// 1. Import handling
require ( "postcss-import" ) ,
// 2. Variables & mixins
require ( "postcss-simple-vars" ) ,
require ( "postcss-mixins" ) ,
// 3. Syntax enhancement
require ( "postcss-nested" ) ,
require ( "postcss-preset-env" ) ,
// 4. Optimization
require ( "autoprefixer" ) ,
require ( "cssnano" ) ,
] ,
} ;
2. Environment-Specific Configs
// postcss.dev.js
module . exports = {
plugins : [
require ( "postcss-import" ) ,
require ( "postcss-simple-vars" ) ,
require ( "postcss-nested" ) ,
require ( "autoprefixer" ) ,
] ,
} ;
// postcss.prod.js
module . exports = {
plugins : [
require ( "postcss-import" ) ,
require ( "postcss-simple-vars" ) ,
require ( "postcss-nested" ) ,
require ( "autoprefixer" ) ,
require ( "cssnano" ) ( { preset : "advanced" } ) ,
] ,
} ;
module . exports = {
plugins : [
require ( "postcss-import" ) ,
require ( "postcss-simple-vars" ) ,
require ( "autoprefixer" ) ,
require ( "postcss-reporter" ) ( {
clearAllMessages : true ,
throwError : true ,
} ) ,
] ,
} ;
π Project Structure Examples
project/
βββ src/
β βββ styles.css
β βββ components/
β βββ button.css
βββ dist/
β βββ styles.css
βββ postcss.config.js
βββ package.json
library/
βββ src/
β βββ components/
β β βββ Button/
β β β βββ Button.css
β β β βββ Button.js
β β βββ Card/
β β βββ Card.css
β β βββ Card.js
β βββ styles/
β β βββ variables.css
β β βββ mixins.css
β β βββ base.css
β βββ index.css
βββ dist/
β βββ components/
β βββ index.css
βββ postcss.config.js
βββ package.json
themes/
βββ src/
β βββ themes/
β β βββ light.css
β β βββ dark.css
β β βββ variables.css
β βββ components/
β β βββ button.css
β β βββ card.css
β βββ layouts/
β βββ grid.css
βββ dist/
β βββ light.css
β βββ dark.css
βββ postcss.config.js
βββ package.json
1. Critical CSS Extraction
const postcss = require ( "postcss" ) ;
const fs = require ( "fs" ) ;
// Extract critical CSS
async function extractCritical ( html , css ) {
const result = await postcss ( [
require ( "postcss-critical-css" ) ( {
output : "dist/critical.css" ,
} ) ,
] ) . process ( css ) ;
return result . css ;
}
// styled-components with PostCSS
module . exports = {
plugins : [
require ( "postcss-simple-vars" ) ,
require ( "postcss-nested" ) ,
require ( "autoprefixer" ) ,
] ,
} ;
// styled.js
import styled from "styled-components" ;
const Button = styled . button `
color: ${ ( props ) => props . theme . primary } ;
font-size: ${ ( props ) => props . theme . fontSize } ;
` ;
// Build design tokens
module . exports = {
plugins : [
require ( "postcss-simple-vars" ) ,
require ( "postcss-custom-properties" ) ,
require ( "postcss-extend" ) ,
require ( "postcss-preset-env" ) ,
require ( "autoprefixer" ) ,
] ,
} ;
// Problem: Multiple variable plugins
// Solution: Choose one variable system
module . exports = {
plugins : [
// β
Use either simple-vars OR custom-properties
require ( "postcss-simple-vars" ) ,
// β Don't use both
// require('postcss-custom-properties')
] ,
} ;
// Problem: Relative imports not working
// Solution: Use absolute paths or configure base
module . exports = {
plugins : [
require ( "postcss-import" ) ( {
path : [ "src/styles" , "node_modules" ] ,
} ) ,
] ,
} ;
// Problem: No source maps in production
// Solution: Explicitly enable source maps
// CLI: --map
// Gulp: .pipe(sourcemaps.write('.'))
// Webpack: devtool: 'source-map'
π Performance Optimization
// Development - Fast processing
module . exports = {
plugins : [
require ( "postcss-simple-vars" ) ,
require ( "postcss-nested" ) ,
require ( "autoprefixer" ) ,
] ,
} ;
// Production - Full optimization
module . exports = {
plugins : [
require ( "postcss-simple-vars" ) ,
require ( "postcss-nested" ) ,
require ( "autoprefixer" ) ,
require ( "cssnano" ) ( { preset : "advanced" } ) ,
] ,
} ;
// gulpfile.js with caching
const cached = require ( "gulp-cached" ) ;
const remember = require ( "gulp-remember" ) ;
gulp . task ( "css" , ( ) => {
return gulp
. src ( "src/**/*.css" )
. pipe ( cached ( "css" ) )
. pipe ( postcss ( plugins ) )
. pipe ( remember ( "css" ) )
. pipe ( gulp . dest ( "dist/" ) ) ;
} ) ;
// Parallel CSS processing
const gulp = require ( "gulp" ) ;
const parallel = require ( "gulp-parallel" ) ;
gulp . task ( "css" , parallel ( [ "css:components" , "css:utilities" , "css:themes" ] ) ) ;