gpt4 book ai didi

javascript - 我如何使用 Node.js Express 压缩中间件?

转载 作者:行者123 更新时间:2023-11-30 17:52:32 55 4
gpt4 key购买 nike

我想使用一些中间件来 trim 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));
});

取消注释上面提到的行会导致与无法修改已发送的 header 相关的异常。这很公平,我明白这一点。我查看了 compresssource code它在我的头顶上方一点。我必须做什么/monkeypatch 才能不踩到 compress 的脚趾(反之亦然)?

最佳答案

您是否尝试过将 app.use(trimmer()); 放在 app.use(express.compress()); 下方?按照目前的编写方式,trimmer 将在响应被压缩后被调用;切换顺序可确保 (1) 您不会尝试 trim 压缩数据,并且 (2) trim 的结果将被正确压缩。

关于javascript - 我如何使用 Node.js Express 压缩中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18690895/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com