其实这个项目中我负责的JS就只有一个,而且我也就只花了半小时就完成第一版。但是后续在生成环境里的调试却花费了两周。。
此JS的作用类似于Google Analytics里的 ga.js,是网站流量监测的数据来源。
故需要先简单解释一下网站流量监测的方法:
在目标网站的需要被监测的页面中执行一段js,这段js加载完毕后自动运行,它可以读取到很多值,如我们最关心的 Referrer Page,当然那些Page title, Page URL, User-Agnet, Screen size等等就更不在话下了。当这些属性都获取后,向监测服务器发送一个GET请求(一般是一个1×1的小图片),把获取的值以参数的形式传递过去。同时再在Cookie里记录一些必要的值。
非常简单,对吧。

生产环境的问题是,我们的数据非常不准——少很多,有相当数据丢失了:

对小图片的请求数大概只有对JS文件请求的60%,实际上他们应该差不多才对的

于是又在页面上加入了其它几个第三方工具,对比结果显示的确有问题

自己折腾了一周,完全无果。只是发现了img对象的一个表现是只要赋上src,浏览器就会直接去请求图片,各浏览器的表现全部这样。
我想大概是思维受限了,于是上网求助。
又经过一番折腾,加上网友提示,终找到核心问题所在——被监测网站服务器网速不够。当然我们的监测服务器网速也可能不够。

所以解决办法是:

  1. 将引用js的script标签从页面底部移到head标签内
  2. JS加载完马上执行对应方法,不等document.onload完成(实际上我第一回写的时候是这么整的)
  3. 不再把图片往document.body上添加,但为了防止被浏览器垃圾回收,需要放到window对象内(网友的方法)

最后问题完美解决。写这篇日志的原因是,这种问题,没遇上的话没半点事,一旦遇上却很难找到问题的根源。

附上代码:

(function(){
  function initData(){xxx;}
  function submit(){
    var img = new Image();
    var id = "tracker-img";
    img.id = id;
    img.onload = img.onerror = img.onabort = function() { window[id] = undefined; };
    window[id] = img; // 避免img对象被浏览器垃圾回收了
    img.src = "http://www.sample.com/1.gif?" + params;
  }
  initData();
  submit();
})()

内部测试时没有发现问题是因为内网的网络足够的快,而放公网后自己依旧测不出问题也是因为网络够好。
抱怨一下,真尼马天朝真是够苦逼啊:交着全世界数一数二的贵网费,享受着与之完全不匹配的带宽,上外网被墙,上内网也是小水管。

anyShare分享到:
          

没准儿您会对以下内容感兴趣: