继 Node.js 小工具之后,基于 csslint 写了个超简单的 CSS 语法校验工具。
思路:
递归查找目录下的 css 文件,首先去除文件路径以 svn 开头的,然后选择以 css 结尾的文件。
将查找到的文件路径保存到变量中。
对保存的文件路径依次使用 exec 执行 csslint 命令,由于 exec 只有在异步执行中才可获取执行结果,因此每次执行的结果都进行了读写文件的操作。
读取文件中的内容,把原有内容加上执行的结果再写入到文件中去。
代码:
var fs = require('fs'), exec = require("child_process").exec;var getAllFiles = function (root){
var res = [],
files = fs.readdirSync(root);files.forEach(function(file){ var pathname = root+'/'+file, stat = fs.lstatSync(pathname); if (!stat.isDirectory()){ if (root.indexOf("svn") < 0 && file.indexOf(".css") > -1) { res.push(pathname); } } else { res = res.concat(getAllFiles(pathname)); } }); return res;
}
var checkCSS = function (files) {
fs.writeFileSync("error.txt", "", "UTF-8");for (var i = 0; i < files.length; i++) { exec("csslint --errors=duplicate-properties,known-properties,empty-rules " + files[i], function (error, stdout, stdoutError) { var file = fs.readFileSync("error.txt", "UTF-8"); fs.writeFileSync("error.txt", file + "\n" + stdout, "UTF-8"); }); }
}
checkCSS(getAllFiles("themes"));
checkCSS(getAllFiles("js"));
改进:
回过头来看下以上代码,貌似可以改进的地方还很多。文件多次读写;在执行命令时的循环可以省略,把其放到 getAllFiles 方法调用之类的。由于初识 Node.js,其中文件读写还研究不深,什么 open,close 都没有用,直接来硬的了 ^^
可是我说服了我自己不用去优化了,哇咔咔。
充足的理由如下:
1. 要下班了,需要把手头上的工作完结下。
2. 晚上回去还要撸
3. 周末还要弄 B3log Symphony
4. 这个东西完全不需要性能,每周能运行上一次就不错了。一次就花个1、2 分钟,我完全没有怨言
5. 一点都不想弄了