我是前端开发人员,在这里的后端上抬起我的排骨。
我有一个托管应用程序和的节点Express Server在同一服务器/AWS EC2实例上提供REST API。
i使用Express静态NPM软件包来启用静态应用程序捆绑包和资产的Brotli压缩。这很棒。但是,由于手机无法处理大规模的数据集解析,因此我不得不切换到三个。不幸的是,它没有对我的休息数据应用压缩。
当前,在临时我已禁用Express静态GZIP并启用了压缩NPM软件包。这仅启用GZIP,但对于静态捆绑包和REST API。
我在我的静态捆绑包和REST API上特别需要GZIP/Deflate shoult Backiss的Brotli。最大的获取请求未压缩可能是138MB。Gzip将其降低到12.8MB。我希望它在10MB下与brotli。
我的目的是在我的REST API上对我的捆绑包和手动节点ZLIB压缩在我的束和手动节点zlib压缩上进行Express静态GZIP。如果这是不可行的,那么所有内容都是手动节点zlib压缩!
我不了解有关缓冲区和后端类型的事情...也许您可以告诉我我在这里做错了什么:
app.get('/quakeData/:index', function(req, res){
// Send Specific Selection or All
const encoding = req.headers['accept-encoding'],
index = req.params.index,
jsonArr = index != "all" ? [ quakes[index], threeData[index] ] : [ quakes, threeData ],
jsonStr = JSON.stringify(jsonArr),
bData = Buffer.from(jsonStr);
if (encoding.includes('br')) {
console.log("BROTLI RES");
zlib.brotliCompress(bData, (err, result) => {
console.log(result);
!err ? res.send(result) : console.warn(err);
});
} else if (encoding.includes('gzip')) {
console.log("GZIP RES");
zlib.gzip(bData, (err, result) => {
console.log(result);
!err ? res.send(result) : console.warn(err);
});
} else if (encoding.includes('deflate')) {
console.log("DEFLATE RES");
zlib.deflate(bData, (err, result) => {
console.log(result);
!err ? res.send(result) : console.warn(err);
})
} else {
console.warn("Unsupported Content Encoding Headers");
res.setHeader('Content-Type', 'application/json');
res.json(jsonArr);
}
另外,我已经意识到压缩模块会删除内容长度的标题,因为我的XHR进度API代码停止工作。无论实施哪种解决方案,我都需要拥有内容长度标头。我该怎么做?另外,是否有一种方法可以提前收到内容长度来估计下载时间?
谢谢!
我已经开始工作了。尽管现在我有一个问题,即如何具有具有不同压缩选项的动态选择时间范围。我将不得不修改它,因为压缩数据需要很长时间。
显然,Brotli远远出色。我想我在重构和测试每月测试时,数据节省将是令人印象深刻的。以下是我拥有以上工作的代码。当然,它正在压缩每个API请求,这在生产中毫无意义,但对测试是有益的。
(更新(我将代码重新分配为更最终的实现,其中包括写入TXT文件等。但是,未提供代码,这是Brotli vs Gzip的最终压缩字节字节比较。GZIP提供更快的压缩,尽管尺寸较大。
brotli:[5433,137501,952538,6438971]
gzip:[6818,194843,1544908,10451525]
上面的字节阵列分别用于每小时,每周,每周和每月的数据集。压缩前的每月数据集为〜138MB。
此外,仅供参考XHR Progress API被破坏,因此即使您为字节尺寸发送内容标题也无法使用。我必须创建一个七个API才能在数据ajax之前发送字节长度。
const jsonStr = JSON.stringify(jsonArr),
bData = Buffer.from(jsonStr, 'utf-8');
if (encoding.includes('br')) {
console.log("BROTLI RES");
zlib.brotliCompress(bData, (err, result) => {
console.log(result);
res.writeHead(200, {
'Content-Type': 'application/json',
'Content-Encoding': 'br',
'Content-Length': bData.length
});
!err ? res.end(result) : console.warn(err);
});
} else if (encoding.includes('gzip')) {
console.log("GZIP RES");
zlib.gzip(bData, (err, result) => {
console.log(result);
res.writeHead(200, {
'Content-Type': 'application/json',
'Content-Encoding': 'gzip',
'Content-Length': bData.length
});
!err ? res.end(result) : console.warn(err);
});
} else if (encoding.includes('deflate')) {
console.log("DEFLATE RES");
zlib.deflate(bData, (err, result) => {
console.log(result);
res.writeHead(200, {
'Content-Type': 'application/json',
'Content-Encoding': 'deflate',
'Content-Length': bData.length
});
!err ? res.end(result) : console.warn(err);
});
} else {
console.warn("Unsupported Content Encoding Headers");
res.setHeader('Content-Type', 'application/json');
return res.json(compressed);
}