Синхронно по-малко компилиране в NodeJS

Опитвам се да напиша трансформиращ скрипт за Browserify, който ми позволява да require() .less файлове. Трансформацията ще ги компилира в CSS и след това ще обвие минимизирания CSS в малка Javascript функция, която добавя CSS към страницата.

Проблемът ми е, че главният модул LESS е асинхронен, което изглежда не работи заедно с трансформация скрипт:

lessify/index.js (Моделиран директно от възел -подчертайте)

var less = require('less');
var cleanCSS = require('clean-css');
var through = require('through');

module.exports = function(file) {
    if (!/\.css|\.less/.test(file)) {
        return through();
    }
    var buffer = "";

    return through(function(chunk) {
        return buffer += chunk.toString();
    }, function() {
        compiled = buffer;
        if (/\.less/.test(file)) {
            compiled = less.render(compiled, function(e, r) { return r; });
        }
        // rv comments
        compiled = compiled.replace(/\/\*.*?\*\//g, "");

        // minify. TO DO: Get less.js to do this for us
        var compiled = cleanCSS.process(buffer);

        compiled = "(function($) { $('head').append('<style type=\"text/css\">" + compiled.replace(/'/g, "\\'") + "</style>');}(window.jQuery));";
        this.queue(compiled);
        return this.queue(null);
    });
};

Това работи добре за .css файл, но прекъсва при .less файлове, тъй като compiled е недефиниран.

Има няколко завършени заявки за изтегляне в източника на less.js, свързани с това, но никой не изглежда да работи за мен.

Не съм много запознат с библиотеката through, така че може би нейното поведение може лесно да се коригира към асинхронни функции? Осъзнавам, че има смисъл less.render() да бъде асинхронен по подразбиране, за да обработва @import, и нямам нищо против да се откажа от импортирането, за да мога директно да require() ПО-МАЛКО на моите страници.


person Chris Wilson    schedule 13.11.2013    source източник


Отговори (1)


Това всъщност работи, ако е леко модифицирано. Бях глупав по-горе, като стартирах cleanCSS на buffer, а не на compiled

var less = require('less');
var cleanCSS = require('clean-css');
var through = require('through');

var parser = new(less.Parser)({
    processImports: false
});

module.exports = function(file) {
    if (!/\.css|\.less/.test(file)) {
        return through();
    }
    var buffer = "";

    return through(function(chunk) {
        return buffer += chunk.toString();
    }, function() {
        var compiled;
        // CSS is LESS so no need to check extension
        parser.parse(buffer, function(e, r) { 
            compiled = r.toCSS();
        });

        // rv comments
        compiled = compiled.replace(/\/\*.*?\*\//g, "");

        var compiled = cleanCSS.process(compiled);

        compiled = "(function($) { $('head').append('<style type=\"text/css\">" + compiled.replace(/'/g, "\\'") + "</style>');}(window.jQuery));";
        this.queue(compiled);
        return this.queue(null);
    });
};
person Chris Wilson    schedule 13.11.2013