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


Posted in Javascript onJanuary 24, 2019

前言

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

手动埋点

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

// 例如,记录搜索行为
search(keyword) {
  if (keyword) {
    ...业务代码
  }
  mta.Event.stat("ico_search", {"query":keyword});
}

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

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

// wxml
<view bindtap="track">这只是一个展示view</view>
//js 
track() {
 mta.Event.stat("eleClick", {"name":xxxxx});
}

另外,由于PM会频繁调整埋点信息,而 埋点是一个繁琐又无聊的工作 ,基于Don't Repeat Yourself 原则,手动埋带要不得。

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

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

自动埋点

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

1、小程序监听用户点击行为

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

// web监听页面点击
document.addEventListener('click',(e) => {console.log(e)})

// 小程序监听页面点击,用户的点击行为都会执行elementTracker方法
<view catchtap='elementTracker'>
 <view class='buy-now'>
   <button bindtap='buy' animation="{{scaleAnim}}">立即购票</button>
 </view>
</view>

2、判断点击位置是否落在监听元素中

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

/**
 * 判断点击是否落在目标元素
 * @param {Object} clickInfo 用户点击坐标
 * @param {Object} boundingClientRect 目标元素信息
 * @param {Object} scrollOffset 页面位置信息
 * @returns {Boolean}
 */
export const isClickTrackArea = function (clickInfo, boundingClientRect, scrollOffset) {
  if (!boundingClientRect) return false;
  const { x, y } = clickInfo.detail; // 点击的x y坐标
  const { left, right, top, height } = boundingClientRect;
  const { scrollTop } = scrollOffset;
  if (left < x && x < right && scrollTop + top < y && y < scrollTop + top + height) {
    return true;
  }
  return false;
};

3、通过配置表声明埋点

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

const tracks = {
 path: 'pages/film/detail',
 elementTracks: [
  {
   element: '.buy-now', // 声明需要监听的元素
   dataKeys: ['film.filmId'], // 声明需要获取Data下的哪些数据
  },
 ]
};

4、对页面函数埋点

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

rewritePage() {
  const originPage = Page;
  Page = (page) => {
   Object.keys(page).forEach((methodName) => {
    // 执行埋点逻辑
    typeof page[methodName] === 'function' && this.recordPageFn(page, methodName);
   });
   // 执行原Page对象
   return originPage(page);
  };
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery uaMatch源代码
Feb 14 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
Aug 22 Javascript
jquery使用each方法遍历json格式数据实例
May 18 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
Jun 11 Javascript
jQuery实现径向动画菜单效果
Jul 17 Javascript
网页瀑布流布局jQuery实现代码
Oct 21 Javascript
详解Nuxt.js Vue服务端渲染摸索
Feb 08 Javascript
详解Vue前端对axios的封装和使用
Apr 01 Javascript
详解50行代码,Node爬虫练手项目
Apr 22 Javascript
Vue 无限滚动加载指令实现方法
May 28 Javascript
在vue中使用回调函数,this调用无效的解决
Aug 11 Javascript
JavaScript 对象创建的3种方法
Nov 17 Javascript
JavaScript递归函数定义与用法实例分析
Jan 24 #Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
Jan 24 #jQuery
vue结合element-ui使用示例
Jan 24 #Javascript
VUE+Element环境搭建与安装的方法步骤
Jan 24 #Javascript
JS实现带阴历的日历功能详解
Jan 24 #Javascript
微信小程序webview实现长按点击识别二维码功能示例
Jan 24 #Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
Jan 24 #Javascript
You might like
PHP小技巧之函数重载
2014/06/02 PHP
php通过排列组合实现1到9数字相加都等于20的方法
2015/08/03 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
2013/06/17 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
实现音乐播放器的代码(html5+css3+jquery)
2015/08/04 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
python将字符串转换成数组的方法
2015/04/29 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
python实现简单聊天室功能 可以私聊
2019/07/12 Python
python中最小二乘法详细讲解
2021/02/19 Python
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
名词解释型面试题(主要是网络)
2013/12/27 面试题
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
高中生学习生活的自我评价
2013/10/09 职场文书
求职自荐信格式
2013/12/04 职场文书
二手书店创业计划书
2014/01/16 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
护士个人总结范文
2015/02/13 职场文书
2016春节家属慰问信
2015/03/25 职场文书
故意杀人案辩护词
2015/05/21 职场文书
党员转正介绍人意见
2015/06/03 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS