导航
https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/87
在发送数据埋点请求时,使用 1x1
像素的透明 GIF 图片有历史原因和技术优势。主要是因为:
<img>
是早期浏览器支持最好的请求方式之一。<img>
标签轻松向其他域发送数据。1x1
像素的透明图片非常小,对页面渲染没有影响,用户也察觉不到,同时减少了对带宽的占用。前端可以通过创建一个 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 图片的内容是一个 1x1 像素的图片,使用 Base64 编码方式生成。它是非常小的资源文件,通常不会对网络带宽造成负担。
透明 GIF 图片的 Base64 编码如下:
R0lGODlhAQABAPAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==
<img>
标签发起 GET 请求,将埋点数据作为 URL 参数发送给后端。1x1
像素的透明 GIF 图片作为响应。这种方式简单、跨平台兼容,不需要额外处理跨域问题,因此在早期的 Web 开发中非常流行。即使在现代,某些特定场景下仍然会用到。