A modular minifier, built on top of the PostCSS ecosystem
npx @tessl/cli install tessl/npm-cssnano@7.0.0A modular minifier, built on top of the PostCSS ecosystem. CSSnano takes CSS and compresses it through a configurable preset system, allowing you to choose the level of optimization that suits your needs.
npm install cssnanoconst cssnano = require('cssnano');For ES modules:
import cssnano from 'cssnano';const postcss = require('postcss');
const cssnano = require('cssnano');
// Basic usage with default preset
postcss([cssnano()])
.process(css, { from: undefined })
.then(result => {
console.log(result.css);
});
// With specific preset
postcss([cssnano({ preset: 'default' })])
.process(css, { from: undefined })
.then(result => {
console.log(result.css);
});
// With custom configuration
postcss([cssnano({
preset: ['default', {
discardComments: {
removeAll: true,
},
}]
})])
.process(css, { from: undefined })
.then(result => {
console.log(result.css);
});CSSnano is built around a modular architecture with three key concepts:
The preset system allows loading cssnano in different configurations:
Creates a PostCSS processor with the specified configuration options.
/**
* Creates a PostCSS processor with cssnano optimizations
* @param {Options} options - Configuration options
* @returns {import('postcss').Processor} PostCSS processor instance
*/
function cssnano(options?: Options): import('postcss').Processor;interface Options {
/** Preset configuration - can be string, array, function, or object */
preset?: string | [string, any] | Function | { plugins: any[] };
/** Additional plugins to include */
plugins?: Array<string | Function | [string | Function, any]>;
/** Path to configuration file */
configFile?: string;
}CSSnano includes three built-in presets:
Safe optimizations that make minimal assumptions about your CSS.
/**
* Default preset with safe optimizations
* @param {DefaultPresetOptions} options - Preset configuration
* @returns {{ plugins: Array<[Function, any]> }} Plugin configuration
*/
function defaultPreset(options?: DefaultPresetOptions): { plugins: Array<[Function, any]> };
interface DefaultPresetOptions {
/** CSS declaration sorting options */
cssDeclarationSorter?: false | { keepOverrides?: boolean };
/** Comment removal options */
discardComments?: false | { removeAll?: boolean; remove?: Function };
/** Initial value reduction options */
reduceInitial?: false | any;
/** Gradient minification options */
minifyGradients?: false | any;
/** SVG optimization options */
svgo?: false | { plugins?: any[] };
/** Transform reduction options */
reduceTransforms?: false | any;
/** Value conversion options */
convertValues?: false | { length?: boolean };
/** Calc() optimization options */
calc?: false | any;
/** Color minification options */
colormin?: false | any;
/** Ordered values optimization */
orderedValues?: false | any;
/** Selector minification options */
minifySelectors?: false | { sort?: boolean };
/** Parameter minification options */
minifyParams?: false | any;
/** Charset normalization options */
normalizeCharset?: false | { add?: boolean };
/** Font value minification options */
minifyFontValues?: false | {
removeAfterKeyword?: boolean;
removeDuplicates?: boolean;
removeQuotes?: boolean | Function;
};
/** URL normalization options */
normalizeUrl?: false | any;
/** Longhand merging options */
mergeLonghand?: false | any;
/** Duplicate removal options */
discardDuplicates?: false | any;
/** Overridden rule removal options */
discardOverridden?: false | any;
/** Repeat style normalization options */
normalizeRepeatStyle?: false | any;
/** Rule merging options */
mergeRules?: false | any;
/** Empty rule removal options */
discardEmpty?: false | any;
/** Selector deduplication options */
uniqueSelectors?: false | any;
/** String normalization options */
normalizeString?: false | any;
/** Position normalization options */
normalizePositions?: false | any;
/** Whitespace normalization options */
normalizeWhitespace?: false | any;
/** Unicode normalization options */
normalizeUnicode?: false | any;
/** Display value normalization options */
normalizeDisplayValues?: false | any;
/** Timing function normalization options */
normalizeTimingFunctions?: false | any;
/** Browserslist override */
overrideBrowserslist?: string | string[];
}More aggressive optimizations that may break CSS in some cases.
/**
* Advanced preset with aggressive optimizations
* @param {AdvancedPresetOptions} options - Preset configuration
* @returns {{ plugins: Array<[Function, any]> }} Plugin configuration
*/
function advancedPreset(options?: AdvancedPresetOptions): { plugins: Array<[Function, any]> };
interface AdvancedPresetOptions extends DefaultPresetOptions {
/** Autoprefixer options */
autoprefixer?: {
add?: boolean;
overrideBrowserslist?: string | string[];
};
/** Unused rule discarding options */
discardUnused?: false | any;
/** Identifier merging options */
mergeIdents?: false | any;
/** Identifier reduction options */
reduceIdents?: false | any;
/** Z-index optimization options */
zindex?: false | any;
}Minimal optimizations focusing on whitespace and comments.
/**
* Lite preset with minimal optimizations
* @param {LitePresetOptions} options - Preset configuration
* @returns {{ plugins: Array<[Function, any]> }} Plugin configuration
*/
function litePreset(options?: LitePresetOptions): { plugins: Array<[Function, any]> };
interface LitePresetOptions {
/** Comment removal options */
discardComments?: false | { removeAll?: boolean };
/** Whitespace normalization options */
normalizeWhitespace?: false | any;
/** Empty rule removal options */
discardEmpty?: false | any;
/** Raw cache options */
rawCache?: false | any;
}CSSnano supports multiple configuration methods:
/**
* Configuration loading priority:
* 1. Direct options parameter
* 2. External configuration file
* 3. Default preset
*
* Supported configuration files:
* - package.json (cssnano property)
* - .cssnanorc
* - .cssnanorc.json
* - .cssnanorc.js
* - cssnano.config.js
*/// Plugin has postcss flag for PostCSS compatibility
cssnano.postcss = true;Common Integration Patterns:
// With PostCSS CLI
module.exports = {
plugins: [
require('cssnano')({
preset: ['default', {
discardComments: {
removeAll: true,
},
}]
})
]
};
// With webpack postcss-loader
module.exports = {
module: {
rules: [{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: [
require('cssnano')({ preset: 'advanced' })
]
}
}
]
}]
}
};
// With Gulp
const gulp = require('gulp');
const postcss = require('gulp-postcss');
gulp.task('css', () => {
return gulp.src('src/*.css')
.pipe(postcss([
require('cssnano')({
preset: ['default', {
minifyFontValues: {
removeAfterKeyword: true
}
}]
})
]))
.pipe(gulp.dest('dist/'));
});
// Programmatic usage
const postcss = require('postcss');
const cssnano = require('cssnano');
const fs = require('fs');
const css = fs.readFileSync('input.css', 'utf8');
postcss([cssnano()])
.process(css, { from: 'input.css', to: 'output.css' })
.then(result => {
fs.writeFileSync('output.css', result.css);
if (result.map) {
fs.writeFileSync('output.css.map', result.map.toString());
}
});CSSnano safely handles:
Common errors:
Cannot load preset "${name}" - Invalid preset name or missing dependencyCSSnano performs various optimizations including:
Input Example:
/* This is a comment */
h1 {
font-weight: bold;
font-family: "Helvetica Neue", Arial, sans-serif;
color: #ff0000;
margin: 10px 10px 10px 10px;
}
h1 {
padding: 0px;
}Output (default preset):
h1{font-weight:700;font-family:Helvetica Neue,Arial,sans-serif;color:red;margin:10px;padding:0}