Clean-css is a fast and efficient Node.js library for minifying CSS files.
According to tests it is one of the best available.
This documentation refers to a pre-release version. See 2.2 branch for the current release docs.
Node.js 0.10.0+ (tested on CentOS, Ubuntu, OS X 10.6+, and Windows 7+)
npm install clean-css
noAdvancedbecameadvanced- make sure to reverse the value;noAggressiveMergingbecameaggressiveMerging- make sure to reverse the value;noRebasebecamerebase- make sure to reverse the value;- no longer possible to use
CleanCSSas a function asnew CleanCSSis always required;
npm update clean-css
or point package.json to version 2.x. That's it!
Update clean-css as for CLI above.
Then change your JavaScript code from:
var minimized = CleanCSS.process(source, options);into
var minimized = new CleanCSS(options).minify(source);And you are done.
Clean-css accepts the following command line arguments (please make sure
you use <source-file> as the very last argument to avoid potential issues):
cleancss [options] source-file, [source-file, ...]
-h, --help Output usage information
-v, --version Output the version number
-b, --keep-line-breaks Keep line breaks
--s0 Remove all special comments, i.e. /*! comment */
--s1 Remove all special comments but the first one
-r, --root [root-path] A root path to which resolve absolute @import rules
and rebase relative URLs
-o, --output [output-file] Use [output-file] as output instead of STDOUT
-s, --skip-import Disable @import processing
--skip-rebase Disable URLs rebasing
--skip-advanced Disable advanced optimizations - selector & property merging,
reduction, etc.
--skip-aggressive-merging Disable properties merging based on their order
--rounding-precision [N] Rounds to `N` decimal places. Defaults to 2. -1 disables rounding.
-c, --compatibility [ie7|ie8] Force compatibility mode (see Readme for advanced examples)
-d, --debug Shows debug information (minification time & compression efficiency)
To minify a public.css file into public-min.css do:
cleancss -o public-min.css public.css
To minify the same public.css into the standard output skip the -o parameter:
cleancss public.css
More likely you would like to concatenate a couple of files. If you are on a Unix-like system:
cat one.css two.css three.css | cleancss -o merged-and-minified.cssOn Windows:
type one.css two.css three.css | cleancss -o merged-and-minified.cssOr even gzip the result at once:
cat one.css two.css three.css | cleancss | gzip -9 -c > merged-minified-and-gzipped.css.gzvar CleanCSS = require('clean-css');
var source = 'a{font-weight:bold;}';
var minimized = new CleanCSS().minify(source);CleanCSS constructor accepts a hash as a parameter, i.e.,
new CleanCSS(options).minify(source) with the following options available:
advanced- set to false to disable advanced optimizations - selector & property merging, reduction, etc.aggressiveMerging- set to false to disable aggressive merging of properties.benchmark- turns on benchmarking mode measuring time spent on cleaning up (runnpm run benchto see example)compatibility- enables compatibility mode, see below for more examplesdebug- set to true to get minification statistics understatsproperty (seetest/custom-test.jsfor examples)inliner- a hash of options for@importinliner, see test/protocol-imports-test.js for exampleskeepBreaks- whether to keep line breaks (default is false)keepSpecialComments-*for keeping all (default),1for keeping first one only,0for removing allprocessImport- whether to process@importrulesrebase- set to false to skip URL rebasingrelativeTo- path to resolve relative@importrules and URLsroot- path to resolve absolute@importrules and rebase relative URLsroundingPrecision- rounding precision; defaults to2;-1disables roundingtarget- path to a folder or an output file to which rebase all URLs
- Broccoli : broccoli-clean-css
- Brunch : clean-css-brunch
- Grunt : grunt-contrib-cssmin
- Gulp : gulp-minify-css
- Gulp : using vinyl-map as a wrapper - courtesy of @sogko
- component-builder2 : builder-clean-css
- Metalsmith : metalsmith-clean-css
First clone the source, then run:
npm run benchfor clean-css benchmarks (see test/bench.js for details)npm run checkto check JS sources with JSHintnpm testfor the test suite
- Fork it.
- Add test(s) veryfying the problem.
- Fix the problem.
- Make sure all tests still pass (
npm test). - Make sure your code doesn't break style rules (
npm run check) and follow all other ones too. - Send a PR.
If you wonder where to add tests, go for:
test/unit-test.jsif it's a simple scenariotest/data/...if it's a complex scenario (just add two files, input and expected output)test/binary-test.jsif it's related tobin/cleancssbinarytest/module-test.jsif it's related to importingclean-cssas a moduletest/protocol-imports-test.jsif it fixes anything related to protocol@imports
Use the /*! notation instead of the standard one /*:
/*!
Important comments included in minified output.
*/Clean-css will handle it automatically for you (since version 1.1) in the following cases:
- When using the CLI:
- Use an output path via
-o/--outputto rebase URLs as relative to the output file. - Use a root path via
-r/--rootto rebase URLs as absolute from the given root path. - If you specify both then
-r/--roottakes precendence.
- Use an output path via
- When using clean-css as a library:
- Use a combination of
relativeToandtargetoptions for relative rebase (same as 1 in CLI). - Use a combination of
relativeToandrootoptions for absolute rebase (same as 2 in CLI). roottakes precendence overtargetas in CLI.
- Use a combination of
Compatibility settings are controlled by --compatibility switch (CLI) and compatibility option (library mode).
In both modes the following values are allowed:
'ie7'- Internet Explorer 7 compatibility mode'ie8'- Internet Explorer 8 compatibility mode''or'*'(default) - Internet Explorer 9+ compatibility mode
Since clean-css 3 a fine grained control is available over those settings, with the following options available:
'[+-]colors.opacity'- - turn on (+) / off (-)rgba()/hsla()declarations removal'[+-]properties.iePrefixHack'- turn on / off IE prefix hack removal'[+-]properties.ieSuffixHack'- turn on / off IE suffix hack removal'[+-]properties.backgroundSizeMerging'- turn on / off background-size merging into shorthand'[+-]properties.merging'- turn on / off property merging based on understandability'[+-]selectors.ie7Hack'- turn on / off IE7 selector hack removal (*+html...)'[+-]units.rem'- turn on / off treatingremas a proper unit
For example, this declaration --compatibility 'ie8,+units.rem' will ensure IE8 compatiblity while enabling rem units so the following style margin:0px 0rem can be shortened to margin:0, while in pure IE8 mode it can't be.
To pass a single off (-) switch in CLI please use the following syntax --compatibility *,-units.rem.
In library mode you can also pass compatiblity as a hash of options.
- Anthony Barre (@abarre) for improvements to
@importprocessing, namely introducing the--skip-import/processImportoptions. - Simon Altschuler (@altschuler) for fixing
@importprocessing inside comments. - Isaac (@facelessuser) for pointing out a flaw in clean-css' stateless mode.
- Jan Michael Alonzo (@jmalonzo) for a patch
removing node.js' old
syspackage. - Timur Kristóf (@Venemo) for an outstanding contribution of advanced property optimizer for 2.2 release.
- Vincent Voyer (@vvo) for a patch with better empty element regex and for inspiring us to do many performance improvements in 0.4 release.
- @XhmikosR for suggesting new features (option to remove special comments and strip out URLs quotation) and pointing out numerous improvements (JSHint, media queries).
Clean-css is released under the MIT License.