基于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
相关产品推荐
相关产品推荐

