导航


HTML

CSS

JavaScript

浏览器 & 网络

版本管理

框架

构建工具

TypeScript

性能优化

软实力

算法

UI、组件库

Node

冷门技能

https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/87

在发送数据埋点请求时,使用 1x1 像素的透明 GIF 图片有历史原因和技术优势。主要是因为:

  1. 兼容性强:在早期的 Web 环境中,JavaScript、XHR(XMLHttpRequest)和 CORS 等技术还不够成熟。使用图片的方式能够确保在不同浏览器、平台中都能发送请求,因为图片标签 <img> 是早期浏览器支持最好的请求方式之一。
  2. 不受跨域限制:图片请求不会受到跨域的限制(不像 XHR 请求需要考虑跨域问题),可以通过 <img> 标签轻松向其他域发送数据。
  3. 对用户无影响1x1 像素的透明图片非常小,对页面渲染没有影响,用户也察觉不到,同时减少了对带宽的占用。
  4. 简化发送数据:通过 GET 请求将数据编码在图片 URL 中,可以轻松进行数据传输,不需要复杂的 POST 数据处理。

DEMO

前端实现示例

前端可以通过创建一个 Image 对象,并将数据通过 URL 参数传递给后端,常见的埋点数据可能包含用户操作行为、时间戳、页面信息等。

function sendTrackingData(data) {
  const img = new Image();  // 创建一个新的 Image 对象
  const trackingUrl = '<https://example.com/tracking.gif>';  // 后端处理埋点的 URL

  // 将数据通过 URL 参数传递给后端
  const params = new URLSearchParams(data).toString();

  // 发送请求,参数数据嵌入到 URL 中
  img.src = `${trackingUrl}?${params}`;
}

// 示例:发送埋点数据
const trackingData = {
  event: 'click',
  elementId: 'button1',
  timestamp: Date.now(),
  userId: '12345',
  pageUrl: window.location.href,
};

sendTrackingData(trackingData);

在这个示例中,我们通过 Image 对象发起一个 GET 请求,将数据作为 URL 参数发送到后端。

后端实现示例

后端可以接收这些 GET 请求,并根据需要记录或处理数据。

Node.js + Express 示例:

const express = require('express');
const app = express();

app.get('/tracking.gif', (req, res) => {
  // 从查询参数中获取埋点数据
  const trackingData = req.query;

  console.log('Received tracking data:', trackingData);

  // 这里可以将数据存储到数据库、日志系统等
  // db.save(trackingData);

  // 返回 1x1 的透明 GIF 图片
  const transparentGif = Buffer.from(
    'R0lGODlhAQABAPAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',
    'base64'
  );
  res.setHeader('Content-Type', 'image/gif');
  res.send(transparentGif);
});

app.listen(3000, () => {
  console.log('Tracking server running on <http://localhost:3000>');
});

透明 GIF 图片解释:

透明 GIF 图片的内容是一个 1x1 像素的图片,使用 Base64 编码方式生成。它是非常小的资源文件,通常不会对网络带宽造成负担。

透明 GIF 图片的 Base64 编码如下:

R0lGODlhAQABAPAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

过程总结:

  1. 前端:通过 <img> 标签发起 GET 请求,将埋点数据作为 URL 参数发送给后端。
  2. 后端:接收 GET 请求,解析查询参数,记录埋点数据,然后返回一个 1x1 像素的透明 GIF 图片作为响应。

这种方式简单、跨平台兼容,不需要额外处理跨域问题,因此在早期的 Web 开发中非常流行。即使在现代,某些特定场景下仍然会用到。