linux下less开发实时编译工具 by node

撰写于 2011 年 11 月 22 日 | 分类 :前端技术, 咕噜咕噜 | 9 条评论 | 1,139 views 打过酱油

最近做东西用了下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

» 标签: ,
  • http://jser.me 草依山

    为什么不用http://nodejs.org/docs/v0.6.3/api/all.html#fs.watchFile

    • http://veryued.org 飞长

      恩 好 我改成这个

  • http://qleelulu.cnblogs.com QLeelulu

    额,居然是setInterval~~~
    为神马不是 http://nodejs.org/docs/v0.6.3/api/fs.html#fs.watch 或者 fs.watchFile

    • http://veryued.org 飞长

      恩 这个方法挫了点 之后改正

  • http://www.thrh.com.cn thrh

    呵呵,不错的东西,就是排名靠后了

  • 痕 水

    最新的LESS Client端已经可以通过 #!watch进行实时监控LESS文件的变化,有变化则重新编译。

    这段的翻译在 lesscss.net上也没添加上去的,lesscss.org上已经有了

  • Liyujie

    我用的node0.4.8 貌似 fs已经没有watch方法鸟 貌似改成watchFile了……….

  • langgong yu

    我基于lessc修改了一个支持 watch 和 “智能输出路径” 的脚本,监听文件列表是基于less的import的, import 的文件有变化时就编译 inputfile

    https://gist.github.com/2041387

  • http://jokerliang.com/ naruco

     最近刚接触到LESS,也想学习学习一下~对管理整个CSS文档,挺有帮助的。