使用GIF上报打点的原因

809 阅读3分钟

使用GIF上报打点的原因

向服务器端上报数据,可以通过请求接口,请求普通文件,或者请求图片资源的方式进行。只要能上报数据,无论是请求GIF文件还是请求js文件或者是调用页面接口,服务器端其实并不关心具体的上报方式。那为什么所有系统都统一使用了请求GIF图片的方式上报数据呢?

  • 防止跨域

一般而言,打点域名都不是当前域名,所以所有的接口请求都会构成跨域。而跨域请求很容易出现由于配置不当被浏览器拦截并报错,这是不能接受的。但图片的src属性并不会跨域,并且同样可以发起请求。(排除接口上报)

  • 防止阻塞页面加载,影响用户体验

通常,创建资源节点后只有将对象注入到浏览器DOM树后,浏览器才会实际发送资源请求。反复操作DOM不仅会引发性能问题,而且载入js/css资源还会阻塞页面渲染,影响用户体验。

但是图片请求例外。构造图片打点不仅不用插入DOM,只要在js中new出Image对象就能发起请求,而且还没有阻塞问题,在没有js的浏览器环境中也能通过img标签正常打点,这是其他类型的资源请求所做不到的。(排除文件方式)

  • 相比PNG/JPG,GIF的体积最小

最小的BMP文件需要74个字节,PNG需要67个字节,而合法的GIF,只需要43个字节。

同样的响应,GIF可以比BMP节约41%的流量,比PNG节约35%的流量。

并且大多采用的是1*1像素的透明GIF来上报

1x1像素是最小的合法图片。而且,因为是通过图片打点,所以图片最好是透明的,这样一来不会影响页面本身展示效果,二者表示图片透明只要使用一个二进制位标记图片是透明色即可,不用存储色彩空间数据,可以节约体积。

  • 图片请求的优先级最低,不会阻塞页面上其他资源请求

Chrome 如何安排资源优先级? 资源按出现的顺序被添加到网络队列中。然后浏览器会把网络活动投入用于尽快获取到最高优先级的资源。

每种资源类型都有自己的一组规则来决定分配给它的优先级:

资源类型优先级
HTMLHighest
FontsHigh
StylesheetsHighest
通过 @import 加载的 StylesheetsHighest,会被安排在阻塞脚本之后。
Images默认是 Low,在初始视口中渲染时升级为 Medium。
JavaScriptsLow, Medium 或 High。查看 Addy Osmani 的 JavaScript Loading Priorities in Chrome[1] 来获取更多细节。
Ajax,XHR,或者 fetch() APIHigh