我如何使用Node.js Express压缩中间件玩得很好?

时间:2013-09-09 02:57:39

标签: javascript node.js express connect

我想使用一些中间件修剪HTML标记之间的所有空格,并将所有其他空格折叠到单个空格。这是为了帮助CSS,因为white-space-collapse: discard;没有广泛可用(如果有的话),而且我不是other workarounds的粉丝。我现在很好用一种天真的方法 - 但我确实希望它与express.compress中间件很好用。

这就是我所拥有的:

module.exports = function trimmer() {
    function getSize(chunk) {
        return Buffer.isBuffer(chunk)
        ? chunk.length
        : Buffer.byteLength(chunk);
    }

    return function trimmer(req, res, next) {
        var end = res.end
            , write = res.write
            , isHtml
        ;

        res.on('header', function() {
            //res.removeHeader('Content-Length'); // another thing I've tried; don't entirely understand it though
        });

        res.write = function(chunk, encoding) {
            var type = res.getHeader('Content-Type') || '';
            isHtml = type.indexOf('text/html') >= 0;
            if (!isHtml) {
                write.apply(res, arguments);
                return;
            }

            var html = chunk
                .toString(encoding)
                .replace(/>\s+</g, '><')
                .replace(/\s{2,}/g, ' ')
            ;

            var buffer = new Buffer(html, encoding);

            try {
                res.setHeader('Content-Length', getSize(buffer));
            } catch (ex) {}
            return write.call(res, buffer, encoding);
        };

        next();
    };
};

这样的效果非常好:

app.configure(function() {
    app.use(trimmer());
    // app.use(express.compress()); // till I uncomment this line... then it breaks
    app.use(express.favicon());
    app.use('/images',  express.static(images));
    app.use('/scripts', express.static(scripts));
    app.use(less({ src: pub, dest: tmp }));
    app.use(express.static(tmp));
    app.use(express.static(views));
});

取消注释上面提到的行会导致与无法修改已发送的标头相关的异常。这是公平的,我理解。我查看了compress的{​​{3}},这有点高于我的头脑。我需要做什么/ monkeypatch不要踩到compress的脚趾(反之亦然)?

1 个答案:

答案 0 :(得分:2)

您是否尝试将app.use(trimmer());置于app.use(express.compress());之下?在压缩响应之后,当前编写的方式trimmer将被称为;切换顺序可确保(1)您不会尝试修剪压缩数据,以及(2)修剪结果将被正确压缩。