节点V12.7如何实现本机Brotli,Gzip,Deflate压缩缓冲区



我是前端开发人员,在这里的后端上抬起我的排骨。

我有一个托管应用程序的节点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);
    }

相关内容

最新更新