如何发送压缩在 nuxt.js 中的 api 响应

How to send api response compressed in nuxt.js

Chrome Lighthouse 告诉我,通过压缩我的 api 路由

,我可以节省大约 90% 的传输字节

如何修改此代码 (api/something.js) 以启用压缩?

export default {
    path: '/api/something',
    async handler(req, res) {
        let data = await obtainDataSomehow();
        res.end(JSON.stringify(data));
    }
}

静态文件和呈现的路由已经压缩,我只有 api 个路由有问题。

选项 1:Express 和压缩中间件

如果您使 server middleware extend Express, then you can use the compression middleware 处理 HTTP 响应的压缩:

例如:


    import express from 'express';
    import compression from 'compression';
    
    const app = express();
    // NB: compression threshold set to 0 for demonstration purposes only;
    //     this should be set to a higher value, such as the default 1 kb
    //     in live applications
    app.use(compression({ threshold: 0 }));
    
    app.get('*', (req, res) => {
      const data = { success: true };
      res.setHeader('Content-Type', 'application/json');
      res.end(JSON.stringify(data));
    });
    
    export default {
      path: '/api/something',
      handler: app
    }

这可以从 command-line 中测试,例如:


    curl -H "Accept-Encoding: gzip" -i http://localhost:3000/api/something

这将显示响应 header Content-Encoding: gzip

选项 2:委托给 gateway/reverse 代理

如果您的实时部署 运行 在网关或反向代理(如 NGINX、Apache、Cloudflare 等)后面,您可以让它处理压缩,而不需要让您的服务器中间件这样做.

在这种情况下,您还可以禁用 Nuxt 对其他资源的压缩 renderer in nuxt.config.js:


    export default {
      render: {
        compressor: false
      }
    };