linux下less开发实时编译工具 by node
最近做东西用了下less去管理css,说是一个工具,其实就是简单的脚本调用less的编译器实现less的实时编译
less的优点还是很明显的:
1.css代码明显变少
2.管理css非常容易(尤其设计师跟你说我可能换一套颜色,如果你直接css写的你就该哭了,但是用less就很简单改个全局配置就ok了)
less的用法可以(猛击这里看我之前的一篇文章)
当然less为什么没大面积被采用也是有原因的:
1.如果你采用在线解析开发的话,如果你在less中的css语法写错了 比如我写成 color:#fff:(注意最后是分号) 或者color;#fff; 那么痛苦的事情出现了,全部样式失效。
你还不知到哪里出错了,痛苦啊
2.如果你采用线下解析,线上引用解析好的css,能稍微好一点,最少你看下生成css中的错误提示,还能猜出来点大概哪里出错了,但是呢我办公的机器还是linux的,less只有在mac有提供一个实时编译的工具(超爽),linux下只能手动命令编译啊 lessc style.less > style.css。如果让我写一句编译一次岂不是比杀了我还痛苦!这就是这个工具的诞生的原因(不知道有没有人写过,或许不会有人蛋疼因为这么小的工具发个日志)
3.定位问题的时候比较麻烦,定位到css问题了,然后还要对应去less中去改,这点我觉得还好,可以忍受
下面就说一下工具的设计思路:
首先我想:在开发的过程中 如果我能够监听less文件改变了(基本是每次ctrl+s的时候),我就触发让less编译成css。
然后想来想去用node调shell还是比较不错的选择。
那么我想这么在终端中输入 node lesstocss [lessfile1, lessfile2], 然后我就不用管了,一直在监听less文件是否被改变,放心的开发了。
但是在这个过程中,发现原生node的fs写只支持utf-8,也尝试过去找扩展包,但是发现node搞gbk的东西还是挺不靠的,或者我没有找对方法。
代码中的注释你可以采用//形势的注释,大家都知道// js中注释可以这么使用,但是css会忽略这种注释,我发现less解析的过程也是按这个规则解析的,直接忽略掉//后的注释。
那么解析后的css中没有注释,没关系我们的注释在less文件一直是保留的。
以下是实现代码(之前比较挫的版本 被鄙视了):
* linux下开发,当你保存的时候,lesstocss将你的less文件自动编译成css文件
* 用法: node lesstocss [filename1,filename2,...]
* version: v0.1
* by 飞长(veryued.org)
**/
//设置lessc路径
var lessc ='~/git/less.js/bin/lessc';
var util = require('util'),
fs = require('fs'),
exec = require('child_process').exec;
//获取屏幕输入参数数组
var filenames = process.argv.slice(2);
filenames.forEach(function (val, index, array) {
(function(filename){
fs.watchFile(''+filename+'.less',function(curr,prev){
var child = exec('stat '+filename+'.less | grep Modify',
function (error, stdout, stderr) {
console.log(''+filename+'.less changed');
var lesschild = exec(''+lessc+' '+filename+'.less > '+filename+'.css'
,function(erro,stdout,stderr){
console.log(stdout);
if (erro !== null) {
console.log('exec erro: ' + erro+stderr);
}
});
}
if (error !== null) {
console.log('exec error: ' + error);
}
});
});
})(val);
});
要是用这个工具,要先安装node和less,安装方法暂时掠过~
张挺对我的代码进行了改进,不用每次罗列需要监听的文件,监听一个文件夹即可
地址:http://www.cnblogs.com/xiziyin/archive/2012/01/06/2314497.html
可以先看下代码:
/*
* 当你保存的时候,lesstocss将你的less文件自动编译成css文件
* 用法: node less.js
* version: v0.1 by 飞长(veryued.org)
* modify by zhangting 修改为监听所有less文件
**/
var fs = require('fs'),
walk = require('walk'),
exec = require('child_process').exec,
path = require('path');
//设置lessc路径
var lessc = path.resolve('./node_modules/.bin/lessc.cmd');
var toCss = function(filename) {
var baseName = path.resolve(path.dirname(filename), path.basename(filename, '.less'));
exec('' + lessc + ' ' + filename + ' > ' + baseName + '.css', { encoding: ''},
function (err, stdout, stderr) {
if (err != null) {
fs.writeFile(baseName + '.log', err, '', function(error) {
if(error) {
console.log('write file error:' + error);
}
});
} else {
console.log(baseName + '.css has render.');
}
});
};
// Walker options
var walker = walk.walk('.', { followLinks: false });
walker.on('file', function(root, stat, next) {
// Add this file to the list of files
if(!/^.\/node_modules/.test(root) && /.less$/.test(stat.name)) {
(function(filename){
toCss(filename);
fs.watch(filename ,function(event, name){
if(event === 'change') {
toCss(filename);
}
});
})(root + '/' + stat.name);
}
next();
});
更多的工具请跳到工具箱查看http://less.cnodejs.net