最近遇到一个坑,重构给了重构代码,但是没有分离好,导致我引入了很多无用的css。这些css又引入了很多无用的图片,使整个的非常重而且很无用。我需要想办法把整个无用css都去掉。下面是几种方法。
gulp-uncss
gulp-uncss是一个gulp
插件,和普通gulp
插件没有区别。先引入gulp
。然后利用uncss
方法传入需要优化的css
所在的页面。注意这里支持本地文件,正则匹配和url
匹配。
1 | var gulp = require('gulp'); |
当然,也可以和其他插件一起用。如下:
1 | var gulp = require('gulp'); |
我觉得很方便,最后项目里就是采用的这个方法。
chrome浏览器audits
利用chrome的自带审计功能。打开chrome浏览器,然后点击Audits审计功能。然后点击run,就可以分析出咱们这个页面可以优化的地方了。
但是这有一个缺陷,就是它只能找到你的有多少样式是不需要的,不能够自动把清理后的css给你。你还是需要手动去你的文件里对比,然后删除。对于比较少的可以这么用。要是本来就有很多很多无用的,那么就很不好使了。这个时候,火狐出来了。
firefox浏览器css usage
下载css usage这个火狐插件并安装,地址在 https://addons.mozilla.org/en-US/firefox/addon/css-usage/。然后f12,切到CSS Usage
选项卡
点击 scan 按钮,稍后会分析出哪些css
规则未使用。然后点击 export cleaned css
按钮,导出清理好的css
文件,将在新页面打开新的css
源文件。即可。是不是很方便。步骤是(Scan->Clear->AutoScan)
。
Scan: 通过字面意思我们就能知道,这是一个扫描当前页面的工具,如果我们的站点只有一个页面或者几个页面,我们可以通过使用此功能按键来查看页面的css实用情况.
Clear: 清除扫描结果,但我们查看完网页,并对CSS 进行了修改后,我们就不需要以前的扫描结果了,那么我们就可以使用Clear功能键,清除以前的扫描结果缓存,重新开始我们的扫描.
AutoScan: 我们的网站可能会有很多的页面,更有可能有很多的弹出层,如果我们每次都点击扫描的话,会占用我们大量的时间,AutoScan功能键可以使我们的扫描工作更自动化,提高我们的工作效率.
tidycss-nodejs插件
经常看到有童鞋问,有没有什么工具能快速分析出站点的CSS冗余,于是就有了这个项目。本质上,这个工具是为了解决我们 腾讯课堂 在多人开发与快速迭代下的CSS冗余问题,为代码Review提供可行的工具。-from tidycss github
install tidycss后,使用nodejs运行,之后并会生成报表。基本原理思想跟上面几个都差不多。源码也是利用selector。1
2
3
4
5
6
7
8
9
10
11
12
13
14var tidy = require('tidycss');
tidy(
// 你要检测冗余的url
'http://ke.qq.com',
// 可选参数
{
// 不对common.xxxx.css检测冗余,因为这个是站点公共文件
ignore: /common\..*\.css/,
// 忽略的选择器列表, 即这里的选择器是被review后可冗余项,
// 比如有通过javascript动态生成的DOM树
unchecks: ['.mod-nav__course-all span:hover']
}
);
可能的坑
这中间可能就是要尽量的把用到的css功能都拉出来。比如有一个模块,是我点击按钮才能出现列表。那么如果你不点击按钮,这些插件就获取不到列表这些css对应的dom,也就会认为这些css选择器是无用的。就会把这些选择器给删掉。那么真正的你是缺少这些css的。这个可能结合后面基本原理理解会更清楚。
基本原理
那么这些工具是如何做到识别没有使用过的css呢?
一个 css 选择器是无效的,也就是说我们是无法通过这个css选择器找到dom元素。所以,我们可以使用querySelector判断改css选择器对应的dom是否为空。从而知道哪些是没有使用的。
其实上面这个gulp的插件gulp-uncss是利用的另外一个别人写好的模块uncss,只不过把它打包成了gulp的插件格式。
我去看了下它的(uncss)源码,基本上就是上面那个思想,找出unused的selector,找出used过了的selector。然后看了下别人写的代码,就觉得还要好好努力,差的太多。下面放出核心代码,方便以后我经常学习。
1 | ; |
总结
所以,如果是只是要一个整理后的文件,就用火狐就好。如果是工程化项目,用gulp的插件比较好。主要是整理了几种方法。中间也学到了不少东西,比如审计audits以前就没有关注过。现在知道是分析页面性能的一个好方法了。