clean-css
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?
How to install clean-css?
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):
Examples:
To minify a public.css file into public-min.css do:
To minify the same public.css into the standard output skip the -o parameter:
More likely you would like to concatenate a couple of files. If you are on a Unix-like system:
On Windows:
Or even gzip the result at once:
How to use clean-css API?
CleanCSS constructor accepts a hash as a parameter, i.e., new CleanCSS(options) 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 examples, or this commentfor a proxy use case.keepBreaks- whether to keep line breaks (default is false)keepSpecialComments-*for keeping all (default),1for keeping first one only,0for removing allmediaMerging- whether to merge@mediaat-rules (default is true)processImport- whether to process@importrulesprocessImportFrom- a list of@importrules, can be['all'](default),['local'],['remote'], or a blacklisted path e.g.['!fonts.googleapis.com']rebase- set to false to skip URL rebasingrelativeTo- path to resolve relative@importrules and URLsrestructuring- set to false to disable restructuring in advanced optimizationsroot- path to resolve absolute@importrules and rebase relative URLsroundingPrecision- rounding precision; defaults to2;-1disables roundingsemanticMerging- set to true to enable semantic merging mode which assumes BEM-like content (default is false as it's highly likely this will break your stylesheets - use with caution!)shorthandCompacting- set to false to skip shorthand compacting (default is true unless sourceMap is set when it's false)sourceMap- exposes source map undersourceMapproperty, e.g.new CleanCSS().minify(source).sourceMap(default is false) If input styles are a product of CSS preprocessor (Less, Sass) an input source map can be passed as a string.sourceMapInlineSources- set to true to inline sources inside a source map'ssourcesContentfield (defaults to false) It is also required to process inlined sources from input source maps.target- path to a folder or an output file to which rebase all URLs
The output of minify method (or the 2nd argument to passed callback) is a hash containing the following fields:
styles- optimized output CSS as a stringsourceMap- output source map (if requested withsourceMapoption)errors- a list of errors raisedwarnings- a list of warnings raisedstats- a hash of statistic information (if requested withdebugoption):originalSize- original content size (after import inlining)minifiedSize- optimized content sizetimeSpent- time spent on optimizationsefficiency- a ratio of output size to input size (e.g. 25% if content was reduced from 100 bytes to 75 bytes)
How to make sure remote @imports are processed correctly?
In order to inline remote @import statements you need to provide a callback to minify method, e.g.:
This is due to a fact, that, while local files can be read synchronously, remote resources can only be processed asynchronously. If you don't provide a callback, then remote @imports will be left intact.
How to use clean-css with build tools?
- 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
- Lasso: lasso-clean-css
What are the clean-css' dev commands?
First clone the source, then run:
npm run benchfor clean-css benchmarks (see test/bench.js for details)npm run browserifyto create the browser-ready clean-css versionnpm run checkto check JS sources with JSHintnpm testfor the test suite
How to contribute to clean-css?
See CONTRIBUTING.md.
Tips & Tricks
How to preserve a comment block?
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/--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
How to generate source maps?
Source maps are supported since version 3.0.
Additionally to mapping original CSS files, clean-css also supports input source maps, so minified styles can be mapped into their Less or Sass sources directly.
Source maps are generated using source-map module from Mozilla.
Using CLI
To generate a source map, use --source-map switch, e.g.:
Name of the output file is required, so a map file, named by adding .map suffix to output file name, can be created (styles.min.css.map in this case).
Using API
To generate a source map, use sourceMap: true option, e.g.:
Using API you can also pass an input source map directly:
Or even multiple input source maps at once (available since version 3.1):
How to minify multiple files with API?
Passing an array
Passing a hash
How to set a compatibility mode?
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.backgroundClipMerging'- turn on / off background-clip merging into shorthand'[+-]properties.backgroundOriginMerging'- turn on / off background-origin merging into shorthand'[+-]properties.backgroundSizeMerging'- turn on / off background-size merging into shorthand'[+-]properties.colors'- turn on / off any color optimizations'[+-]properties.ieBangHack'- turn on / off IE bang hack removal'[+-]properties.iePrefixHack'- turn on / off IE prefix hack removal'[+-]properties.ieSuffixHack'- turn on / off IE suffix hack removal'[+-]properties.merging'- turn on / off property merging based on understandability'[+-]properties.spaceAfterClosingBrace'- turn on / off removing space after closing brace -url() no-repeatintourl()no-repeat'[+-]properties.urlQuotes'- turn on / offurl()quoting'[+-]properties.zeroUnits'- turn on / off units removal after a0value'[+-]selectors.adjacentSpace'- turn on / off extra space beforenavelement'[+-]selectors.ie7Hack'- turn on / off IE7 selector hack removal (*+html...)'[+-]selectors.special'- a regular expression with all special, unmergeable selectors (leave it empty unless you know what you are doing)'[+-]units.ch'- turn on / off treatingchas a proper unit'[+-]units.in'- turn on / off treatinginas a proper unit'[+-]units.pc'- turn on / off treatingpcas a proper unit'[+-]units.pt'- turn on / off treatingptas a proper unit'[+-]units.rem'- turn on / off treatingremas a proper unit'[+-]units.vh'- turn on / off treatingvhas a proper unit'[+-]units.vm'- turn on / off treatingvmas a proper unit'[+-]units.vmax'- turn on / off treatingvmaxas a proper unit'[+-]units.vmin'- turn on / off treatingvminas a proper unit'[+-]units.vm'- turn on / off treatingvmas a proper unit
For example, using --compatibility 'ie8,+units.rem' will ensure IE8 compatibility 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 compatibility as a hash of options.
What advanced optimizations are applied?
All advanced optimizations are dispatched here, and this is what they do:
recursivelyOptimizeBlocks- does all the following operations on a block (think@mediaor@keyframeat-rules);recursivelyOptimizeProperties- optimizes properties in rulesets and "flat at-rules" (like @font-face) by splitting them into components (e.g.marginintomargin-(*)), optimizing, and rebuilding them back. You may want to useshorthandCompactingoption to control whether you want to turn multiple (long-hand) properties into a shorthand ones;removeDuplicates- gets rid of duplicate rulesets with exactly the same set of properties (think of including the same Sass / Less partial twice for no good reason);mergeAdjacent- merges adjacent rulesets with the same selector or rules;reduceNonAdjacent- identifies which properties are overridden in same-selector non-adjacent rulesets, and removes them;mergeNonAdjacentBySelector- identifies same-selector non-adjacent rulesets which can be moved (!) to be merged, requires all intermediate rulesets to not redefine the moved properties, or if redefined to be either more coarse grained (e.g.marginvsmargin-top) or have the same value;mergeNonAdjacentByBody- same as the one above but for same-rules non-adjacent rulesets;restructure- tries to reorganize different-selector different-rules rulesets so they take less space, e.g..one{padding:0}.two{margin:0}.one{margin-bottom:3px}into.two{margin:0}.one{padding:0;margin-bottom:3px};removeDuplicateMediaQueries- removes duplicated@mediaat-rules;mergeMediaQueries- merges non-adjacent@mediaat-rules by same rules asmergeNonAdjacentBy*above;
Acknowledgments (sorted alphabetically)
- 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. - Luke Page (@lukeapage) for suggestions and testing the source maps feature. Plus everyone else involved in#125 for pushing it forward.
- 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).
License
Clean-css is released under the MIT License.
clean-css的更多相关文章
- Less:优雅的写CSS代码
css是不能够定义变量的,也不能嵌套.它没有编程语言的特性.在项目开发中,常常发现有很多css代码是相同的,但我们通常都是复制然后粘贴. 举个例子:假设h5应用里主题色是#FF3A6D,可能用于文字或 ...
- 常用CSS优化总结——网络性能与语法性能建议
在前端面试中最常见的问题就是页面优化和缓存(貌似也是页面优化),被问了几次后心虚的不行,平然平时多少会用到一些,但突然问我,很难把自己知道的都说出来.页面优化明显不是一两句能够说完的,这两天总结了一下 ...
- (转)常用CSS优化总结——网络性能与语法性能建议
原文地址:http://www.cnblogs.com/dolphinX/p/3508657.html 在前端面试中最常见的问题就是页面优化和缓存(貌似也是页面优化),被问了几次后心虚的不行,平然平时 ...
- Gulp:静态资源(css,js)版本控制
为了防止客户端的静态资源缓存,我们需要每次更新css或js的时候,通过md5或时间戳等方式重新命名静态资源: 然后涉及到的html模板里的src也要做相应的修改,静态资源需要优化(压缩合并) 文件目录 ...
- css js 优化工具
我知道国内很多网页制作人员都还在制作table式网页,这样的网页打开速度很慢.如果要想网站打开速度快,就要学会使用DIV+CSS,将图片写进CSS,这样如果网站内容很多的时候,也不会影响网页的浏览.它 ...
- 可供选择CSS框架
在这里你有一个很酷的框架,收集创建的CSS布局. 如果你不喜欢框架,宁愿使用自己的手写代码以促进自己的发展,请跳过本篇文章. 我想有一个建设性的意见,那就是有选择的使用其优点避开其缺点. 就个人而言, ...
- 可供前端工程师选择的精彩CSS框架
在这里你有一个很酷的框架,收集创建的CSS布局. 如果你不喜欢框架,宁愿使用自己的手写代码以促进自己的发展,请跳过本篇文章. 我想有一个建设性的意见,那就是有选择的使用其优点避开其缺点. 就个人而言, ...
- GWT工程架构分析与理解
上一篇文章中介绍了GWT技术的一些理论性的东西,涉及到GWT得一些技术原理及实现.接下来笔者将通过创建一个GWT工程去理解分析GWT工程架构. GWT工程架构解析 笔者使用的是Eclipse插 ...
- Web开发者不可不知的15条编码原则
HTML已经走过了近20的发展历程.从HTML4到XHTML,再到最近十分火热的HTML5,它几乎见证了整个互联网的发展.但是,即便到现在,有很多基础的概念和原则依然需要开发者高度注意.下面,向大家介 ...
- 30个HTML初学者建议
The most difficult aspect of running Nettuts+ is accounting for so many different skill levels. If w ...
随机推荐
- CS231n学习笔记-图像分类笔记(下篇)
原文地址:智能单元 K-Nearest Neighbor分类器 大家可能注意到了,为什么只用最相似的一张图片的标签来作为测试图像的标签呢?这不是很奇怪吗!是的,使用K-Nearest Neighbor ...
- getCurrentSession 与 openSession() 的区别
1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会. 2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而ope ...
- 浅谈Android Studio中项目结构中project模式的各个文件和文件夹
致敬郭霖,这些知识是从第一行代码第二版中直接码下来的,谢谢他,注意每个条目前是否有. 1..gradle和.idea 这两个目录下放置的都是Android Studio自动生成的一些文件,我们无需关心 ...
- JS - 解决鼠标单击、双击事件冲突问题(原生js实现)
由于鼠标双击时每一次触发双击事件都会引起两次单击事件和一次单击事件,原生的js不提供专门的双击事件. 因为业务原因,双击和单机都绑定了不同的业务,在双击的时候又触发了单机,影响了页面的正常显示 出现问 ...
- SpringMVC和dubbo简单的整合(附Demo)
顺便记录下apache产品提供下载的网址:http://mirrors.shuosc.org/apache/ 第一步: 下载zookeeper,网址:http://mirrors.shuosc.org ...
- Hadoop基础总结
一.Hadoop是什么? Hadoop是开源的分布式存储和分布式计算平台 二.Hadoop包含两个核心组成: 1.HDFS: 分布式文件系统,存储海量数据 a.基本概念 -块(block) HDFS的 ...
- TemplateBinding和Binding的区别
定义 TemplateBinding是为了某个特定场景优化出来的数据绑定版本--需要把ControlTemplate里面的某个Property绑定到应用该ControlTemplate的控件的对应Pr ...
- 剑指offer62:二插搜索树的第k个节点
题目描述: 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 中序遍历 /* struct TreeNo ...
- Ubuntu18---VMware虚拟机中Ubuntu18.04系统,开机输入密码后无响应黑屏
系统崩坏了,重装过几次,这次决定不充装了. 搜索大神解决方案后,了解到是图形界面程序损坏,可能是在更新内核或者安装软件的时候,把与xorg相关的文件给清除了. 解决方案如下: 1.登录系统进入,黑屏后 ...
- layout_weight使用
layout_weight的真正含义是等比例分割剩余空间, 在线性布局(linearlayout)中对宽度和高度进行比例分割, 三个子linearlayout分割父linearlayout高度,代码如 ...