基本信息
文件名称:CSS语法检查利器之csslint.docx
文件大小:18.86 KB
总页数:6 页
更新时间:2025-06-26
总字数:约3.55千字
文档摘要

CSS语法检查利器之csslint

前段时间研究使用YUICompressor压缩项目里的js和CSS文件,研究了两天之后,终于在周三晚上把YUICompressor集成进了打包流程中;于是周四(2015-11-12)早晨一到办公室,第一件事就是把相关的构建脚本提交至配置库。

从诡异的问题开始

刚高兴没多久,测试MM就发现一个Bug,有个页面的样式出了问题,导致自动化用例执行失败,要求开发尽快处理。

起初没太注意,感觉只是个小问题,于是直接让对应特性的开发责任人去定位。一个小时之后,测试MM过来问进展,我才发现小问题不简单,一个小时过去了,但开发人员并没有找到问题原因。

开发人员很无奈,因为现象确实比较奇怪:

目前发现仅在Linux部署的那套环境上出现了样式出错的现象;

在开发人员、测试人员本地搭建的环境上,并没有类似的现象;

开发人员定位的结果,页面引用的样式文件中,从某个定义开始,后面的样式全部都未生效;

出问题的页面本周有新特性开发,但引用的样式文件本周并没有人做过更新;

对于现象本身,有来自测试人员进一步的反馈:

自动化用例验证昨天的版本时,并没有发现样式的问题;

测试人员反馈,早晨升级Linux环境前,人工验证时并没有发现样式的问题;

结合这些信息,突然想到上午我才把css压缩相关的构建脚本合入配置库,而出现问题的版本正好是使用更新过的构建脚本打包出来的,那么会不会是压缩工具引入的问题?带着这个疑问登录到Linux部署环境上,使用vim查看对应的css文件,有如下发现:

样式文件被压缩至一行;

在某一个字符后的内容,没有高亮,感觉像是vim的语法高亮似乎有问题;

由于文件内容压缩之后查看实在辛苦,于是打开eclipse查看问题相关的css文件。这时在开发人员反馈的样式定义附近,找到一处如下的css代码。

#wrapper{

display:block;

margin:0auto;

text-align:left;

min-width:720px;看到这行代码的问题了吗?

max-width:1000px;

问题找到了,原来是开发人员定义样式时,本意是书写min-width:720px;,但在min-width后面多打了一个,于是成了min-width:720px;。

找到这里,我有一个猜测,对于未压缩的样式,浏览器在加载到前述样式定义时,会直接忽略掉min-width的定义,但max-width和后续的样式定义还是有效的;但当样式文件被工具压缩到一行之后,min-width的错误会导致后续的样式定义全部被忽略掉,于是出现了前述测试MM反馈的问题。

为了证实我的想法,决定拿问题环境做个实验,直接在环境上修改css文件。

于是登录Linux环境,使用vim修改对应的css文件,将多余的删除掉,这时vim的语法高亮恢复了正常。然后使用浏览器登录页面,清除缓存后访问之前有问题的页面,发现页面的样式恢复正常。

问题解决之后

问题虽然解决了,但问题本身值得回味。

css是脚本,和js不同,浏览器在加载css时不会校验语法,遇到错误不报错,反而会安静的忽略。这次的问题发现了,解决了,那么下次呢?下次也要花费三人时来定位和解决吗?这就纠结了,毕竟类似前述的问题靠人眼来检查css文件的语法,其实挺痛苦的。

那么有没有什么工具可以检查css的语法,在开发时就能提前发现问题,避免类似问题发生?在网上搜索了一圈,找到了csslint。

csslint

什么是csslint

如下截取自项目主页。

CSSLintisatooltohelppointoutproblemswithyourCSScode.Itdoesbasicsyntaxcheckingaswellasapplyingasetofrulestothecodethatlookforproblematicpatternsorsignsofinefficiency.Therulesareallpluggable,soyoucaneasilywriteyourownoromitonesyoudontwant.

代码主页/CSSLint/csslint,在线检查工具。

项目的官方文档非常详细,由此可见项目的开发人员非常用心。从文档看,csslint的使用很简单。

命令行方式

进入命令行,执行如下命令,将检查test