javascript - NodeJS 中的同步 less 编译

标签 javascript node.js asynchronous less browserify

我正在尝试为 Browserify 编写一个转换脚本,它允许我require() .less 文件。转换会将它们编译为 CSS,然后将缩小后的 CSS 包装在一个将 CSS 附加到页面的小 Javascript 函数中。

我的麻烦是 main LESS module是异步的,它似乎不能与转换脚本一起工作:

lessify/index.js(直接从 node-underscorify 建模)

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 文件,但由于 compiled 未定义,因此在 .less 文件上会中断。

有几个completed pull requests在与此相关的 less.js 源代码中,但似乎没有一个对我有用。

我不是很熟悉 through 库,所以也许它的行为可以很容易地调整为异步函数?我意识到 less.render() 默认异步处理 @import 是有意义的,并且不介意放弃导入以便能够直接 require() 在我的页面上更少。

最佳答案

如果稍微修改一下,这实际上是有效的。我在 buffer 上运行 cleanCSS 是愚蠢的,而不是 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);
    });
};

关于javascript - NodeJS 中的同步 less 编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19956265/

相关文章:

Python:当已经有一个事件循环正在运行时,从同步方法调用异步代码

javascript - XML 声明中的 NativeScript 全局事件处理程序?

javascript - 如何在 node.js 中分配并行任务

javascript - 从 Typescript 转译时 NodeJS 存在导入问题

asynchronous - Netty ServerBootstrap - 异步绑定(bind)?

c# - 取消等待中的任务

javascript - 用于在域名前面省略部分 URL 的正则表达式

javascript - 使用 Microsoft Graph 客户端创建日历事件

javascript - 适用于 IOS 的 cordovaorientationchange 事件

node.js - 检查文档中的字段