小程序从手动埋点到自动埋点的实现方法

  

  

小程序由于封闭性较强,要像web应用一样实现灵活的数据收集,会有一定难度。目前开源的埋点SDK,一般采用手动埋点的方式,这种方式有较强的侵入型,为了解决这个问题就有了该文章。

  


  

  

以腾讯移动分析的SDK为例,如果要记录埋点信息,只要插入一句代码即可

     //例如,记录搜索行为   搜索(关键字){   如果(关键字){   ...业务代码   }   mta.Event。stat (“ico_search”{“查询”:关键字});   }      之前      

示例代码看起来是比较简洁的,但是埋点需要收集的数据往往不是单一的,复杂的埋点代码插入业务代码,会影响代码的阅读体验,而且埋点代码散落在各个地方,不方便管理。

  

由于手动埋点必须插入到函数中,有时候我们为了获取页面某一元素点击信息,产生了一种叫无业务相关埋点,简单来说就是你的函数定义,就只有埋点代码,当这种埋点频繁出现,代码会被严重污染。

     //wxml   & lt;视图bindtap="追踪"在这只是一个展示view         //js   跟踪(){   mta.Event。stat (“eleClick”{“名称”:xxxxx});   }      之前      

另外,由于下午会频繁调整埋点信息,而埋点是一个繁琐又无聊的工作,基于不要重复自己原则,手动埋带要不得。

  

总结以上,手动埋点有下列问题

  
      <李>影响代码的阅读体验李   <李>埋点代码散落在各个地方,不方便管理李   <李>代码会被污染李   <李>埋点是一个繁琐又无聊的工作李   
  


  

  

实现思路:监听用户点击——祝辞读取埋点配置JOSN,判断是否需要上报——比;上报数据
  

  

<强> 1,小程序监听用户点击行为
  

  

web应用监听用户点击行为是比较容易,但是小程序没有提供Dom的事件监听,不过我们可以通过事件冒泡的方式捕获。

     //网络监听页面点击   document.addEventListener(“点击”,(e)=比;{console.log (e)})//小程序监听页面点击,用户的点击行为都会执行elementTracker方法   & lt;视图catchtap=elementTracker的祝辞   & lt;视图类=跋衷诠郝颉北?   & lt;按钮bindtap=奥蛉搿倍?{{scaleAnim}}”在立即购票& lt;/button>   & lt;/view>   & lt;/view>      之前      

<强> 2,判断点击位置是否落在监听元素中
  

  

假设需要监听用户是否点击类为现在购买元素,可以通过获取现在购买元素长宽、定位和点击位置坐标判断是否出现重叠,以判断是否被点击。

     /* *   *判断点击是否落在目标元素   * @param{对象}clickInfo用户点击坐标   * @param{对象}boundingClientRect目标元素信息   * @param{对象}scrollOffset页面位置信息   * @returns{布尔}   */出口const isClickTrackArea=函数(clickInfo、boundingClientRect scrollOffset) {   如果(! boundingClientRect)返回false;   const {x, y}=clickInfo.detail;//点击的x y坐标   const{左、右、上、身高}=boundingClientRect;   const {scrollTop}=scrollOffset;   如果(左& lt;x和,x & lt;对吧,,scrollTop +顶级& lt;y,和y & lt;scrollTop +顶级+高度){   返回true;   }   返回错误;   };      之前      

<强> 3,通过配置表声明埋点
  

  

为了解决代码入侵问题,可以将所有埋点信息统一管理,通过配置表的方式,除了方便管理,以后还可以做到动态配置,在服务端配置完毕下发到客户端。

        const追踪={   路径:页面/电影/细节,   elementTracks:(   {   元素:“。现在购买',//声明需要监听的元素   dataKeys:['电影。filmId ']//声明需要获取数据下的哪些数据   },   ]   };      之前      

<强> 4,对页面函数埋点
  

  

有些场景我们除了对页面元素点击埋点,还要对页面函数进行埋点,例如用户下拉刷新的时候,可以对原方法进行包装,插入埋点代码。

        rewritePage () {   const originPage=页面;   页面=(页面)=比;{   种(页面).forEach ((methodName)=比;{//执行埋点逻辑   typeof页面[methodName]===δ堋?,这一点。recordPageFn(页面,methodName);   });//执行原页面对象   返回originPage(页面);   };   }   

小程序从手动埋点到自动埋点的实现方法