What is clean-css?
clean-css is a fast and efficient CSS optimizer for Node.js and the web. It minifies CSS by removing whitespace, comments, and unnecessary characters, merging identical rules, and applying other optimization techniques. It can be used to reduce the size of CSS files, which can lead to faster page load times and improved performance.
What are clean-css's main functionalities?
Minification
This feature allows you to minify CSS by removing unnecessary characters and whitespace, which results in smaller file sizes.
const CleanCSS = require('clean-css');
new CleanCSS().minify('a { font-weight: bold; }', function (error, output) {
console.log(output.styles);
});
Source Map Generation
clean-css can generate source maps for the minified CSS, which is useful for debugging minified code in the browser.
const CleanCSS = require('clean-css');
new CleanCSS({ sourceMap: true, sourceMapInlineSources: true }).minify({ 'styles.css': { styles: 'a { color: #000 }' } }, function (error, output) {
console.log(output.sourceMap.toString());
});
Merging of Identical CSS Rules
This feature merges identical CSS rules into one to reduce file size and redundancy in the code.
const CleanCSS = require('clean-css');
new CleanCSS().minify('a { color: red; } a { color: red; }', function (error, output) {
console.log(output.styles);
});
Optimizing CSS Properties
clean-css can optimize CSS properties, such as converting hex color codes to shorter names when possible.
const CleanCSS = require('clean-css');
new CleanCSS().minify('a { color: #FF0000; }', function (error, output) {
console.log(output.styles);
});
Other packages similar to clean-css
cssnano
cssnano is a modular CSS minifier that utilizes PostCSS. It offers optimizations like reducing calc() references, z-index rebasing, and discarding unused at-rules. Compared to clean-css, cssnano provides a plugin system and can be more configurable due to its modular nature.
uglifycss
uglifycss is a simple CSS minifier that works both in Node.js and the browser. It is less feature-rich compared to clean-css and does not support source maps, but it is straightforward to use for basic minification tasks.
csso
csso (CSS Optimizer) is a CSS minifier with structural optimizations. It can restructure CSS rules to reduce file size and also merge selectors and properties. csso is known for its aggressive optimization techniques, which sometimes can be more efficient than clean-css, but may also require careful testing to ensure the final CSS behaves as expected.
What is clean-css?
Clean-css is a fast and efficient Node.js library for minifying CSS files.
According to tests it is one of the best available.
Usage
What are the requirements?
Node.js 0.8.0+ (tested on CentOS, Ubuntu, OS X 10.6+, and Windows 7+)
How to install clean-css?
npm install clean-css
How to upgrade clean-css from 1.x to 2.x?
Command-line interface (CLI)
npm update clean-css
or point package.json
to version 2.x. That's it!
Node.js module
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.
How to use clean-css CLI?
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>
-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.
--selectors-merge-mode [ie8|*] DEPRECATED: Use --compatibility switch
-c, --compatibility [ie7|ie8] Force compatibility mode
-d, --debug Shows debug information (minification time & compression efficiency)
Examples:
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.css
On Windows:
type one.css two.css three.css | cleancss -o merged-and-minified.css
Or even gzip the result at once:
cat one.css two.css three.css | cleancss | gzip -9 -c > merged-minified-and-gzipped.css.gz
How to use clean-css programmatically?
var 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:
keepSpecialComments
- *
for keeping all (default), 1
for keeping first one only, 0
for removing allkeepBreaks
- whether to keep line breaks (default is false)benchmark
- turns on benchmarking mode measuring time spent on cleaning up
(run npm run bench
to see example)root
- path to resolve absolute @import
rules and rebase relative URLsrelativeTo
- path with which to resolve relative @import
rules and URLsprocessImport
- whether to process @import
rulesnoRebase
- whether to skip URLs rebasingnoAdvanced
- set to true to disable advanced optimizations - selector & property merging, reduction, etc.selectorsMergeMode
- DEPRECATED: Use compatibility optioncompatibility
- Force compatibility mode to ie7
or ie8
. Defaults to not set.debug
- set to true to get minification statistics under stats
property (see test/custom-test.js
for examples)
How to use clean-css with Grunt?
See grunt-contrib-cssmin plugin.
What are the clean-css' dev commands?
First clone the source, then run:
npm run bench
for clean-css benchmarks (see test/bench.js for details)npm run check
to check JS sources with JSHintnpm test
for the test suite
How to contribute to clean-css?
- 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
). - Send a PR.
If you wonder where to add tests, go for:
test/unit-test.js
if it's a simple scenariotest/data/...
if it's a complex scenario (just add two files, input and expected output)test/binary-test.js
if it's related to bin/cleancss
binarytest/module-test.js
if it's related to importing clean-css
as a moduletest/protocol-imports-test.js
if it fixes anything related to protocol @import
s
Tips & Tricks
Use the /*!
notation instead of the standard one /*
:
How to rebase relative image URLs
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
/--output
to rebase URLs as relative to the output file. - Use a root path via
-r
/--root
to rebase URLs as absolute from the given root path. - If you specify both then
-r
/--root
takes precendence.
- When using clean-css as a library:
- Use a combination of
relativeTo
and target
options for relative rebase (same as 1 in CLI). - Use a combination of
relativeTo
and root
options for absolute rebase (same as 2 in CLI). root
takes precendence over target
as in CLI.
Acknowledgments
- Vincent Voyer (@vvo) for a patch with better
empty element regex and for inspiring us to do many performance improvements
in 0.4 release.
- Isaac (@facelessuser) for pointing out
a flaw in clean-css' stateless mode.
- Jan Michael Alonzo (@jmalonzo) for a patch
removing node.js' old
sys
package. - @XhmikosR for suggesting new features
(option to remove special comments and strip out URLs quotation) and
pointing out numerous improvements (JSHint, media queries).
- Anthony Barre (@abarre) for improvements to
@import
processing, namely introducing the --skip-import
/
processImport
options. - Simon Altschuler (@altschuler) for fixing
@import
processing inside comments.
License
Clean-css is released under the MIT License.