You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Node.js实现URL页面文档字节大小计算及编码策略获取

Node.js 实现页面大小计算与服务器压缩策略检测工具

分享一个我用 Node.js + Axios 实现的工具函数,用来检测指定 URL 的桌面/移动端页面大小,以及服务器的压缩编码策略。

完整代码实现

const axios = require('axios');

async function getPageInfo(url) {
  // 定义桌面端和移动端请求配置
  const requestConfigs = [
    {
      name: 'desktop',
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
        'Accept-Encoding': 'gzip, deflate, br'
      }
    },
    {
      name: 'mobile',
      headers: {
        'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1',
        'Accept-Encoding': 'gzip, deflate, br'
      }
    }
  ];

  const results = [];

  for (const config of requestConfigs) {
    try {
      const response = await axios.get(url, {
        ...config,
        responseType: 'arraybuffer' // 保留原始二进制数据,确保大小计算准确
      });

      // 计算实际传输大小(字节)
      const transferSize = parseInt(response.headers['content-length'], 10) || Buffer.byteLength(response.data);
      // 计算解压后的原始内容大小(字节,文本场景)
      const originalSize = Buffer.byteLength(response.data, 'utf8');
      // 获取服务器压缩策略
      const compression = response.headers['content-encoding'] || 'none';

      results.push({
        clientType: config.name,
        transferSize,
        originalSize,
        compression,
        compressionRatio: ((originalSize - transferSize) / originalSize * 100).toFixed(2) + '%'
      });
    } catch (error) {
      results.push({
        clientType: config.name,
        error: error.message
      });
    }
  }

  return results;
}

// 使用示例
getPageInfo('https://example.com')
  .then(info => console.log(JSON.stringify(info, null, 2)))
  .catch(err => console.error(err));

关键实现细节

  • 客户端模拟:通过设置不同User-Agent区分桌面/移动端请求,Accept-Encoding指定支持的压缩格式,触发服务器返回压缩内容
  • 大小计算逻辑:
    • transferSize:优先从content-length响应头获取实际传输字节数;若头不存在则直接计算响应二进制数据的长度
    • originalSize:针对文本内容,将二进制数据转UTF-8编码后计算字节数,对应解压后的原始大小
  • 压缩策略检测:从content-encoding头读取服务器采用的压缩方式,常见值包括gzip、br(Brotli)、deflate,无压缩时返回none
  • 错误处理:捕获请求过程中的网络错误、HTTP状态码异常等,返回对应错误信息

注意事项

  • 必须设置responseType: 'arraybuffer',避免axios自动解压压缩内容,导致无法准确获取传输大小
  • 针对图片、视频等非文本资源,需调整originalSize计算方式(直接用Buffer.byteLength(response.data)即可)
  • 部分服务器会根据User-Agent返回差异化内容,桌面和移动端的检测结果可能存在差异

欢迎大家提出优化建议,比如扩展更多客户端类型、优化非文本资源的大小计算逻辑、增加缓存机制等。

内容的提问来源于stack exchange,提问作者Hmmmmm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:47:17