博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小程序从手动埋点到自动埋点
阅读量:6965 次
发布时间:2019-06-27

本文共 3263 字,大约阅读时间需要 10 分钟。

前言

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

手动埋点

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

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

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

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

// wxml
这只是一个展示view
//js track() { mta.Event.stat("eleClick", {
"name":xxxxx});}复制代码

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

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

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

自动埋点

1、通过事件冒泡监听元素是否被点击

小程序没有提供Dom的事件监听方法,不过我们可以通过事件冒泡的方式监听,在wxml最外层绑定catchtap事件获取点击元素的坐标,判断点击元素与监听目标的坐标是否相交触发记录。

判断点击位置与元素是否相交方法:

下面为实现代码

// 小程序监听页面点击,用户的点击行为都会执行elementTracker方法
// js elementTracker(clickInfo) { // 需要记录元素的className const trackElementName = '.more'; // 通过元素坐标信息与点击坐标信息,判断是否被点击 this.getBoundingClientRect(trackElementName).then((res) => { res.boundingClientRect.forEach((item) => { const isHit = this.isClickTrackArea(clickInfo, item, res.scrollOffset); console.log(isHit, 'isHit') }); });},/** * 判断点击是否落在目标元素 * @param {Object} clickInfo 用户点击坐标 * @param {Object} boundingClientRect 目标元素信息 * @param {Object} scrollOffset 页面位置信息 * @returns {Boolean} 是否被点击 */isClickTrackArea(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;},/** * 获取页面元素信息 * @param {String} element 元素class或者id * @returns {Promise} */getBoundingClientRect (element) { return new Promise((reslove) => { const query = wx.createSelectorQuery(); query.selectAll(element).boundingClientRect(); query.selectViewport().scrollOffset(); query.exec(res => reslove({ boundingClientRect: res[0], scrollOffset: res[1] })); });}复制代码

2、扩展Page方法

由于elementTracker方法需要在Page中定义以供wxml调用,如果每个页面手动编写就过于繁琐了,可以通过改写Page来实现自动扩展,代码如下

// 记录原Page方法const originPage = Page;// 重写Page方法Page = (page) => {  // 给page对象注入三个方法  page.elementTracker = function() {}  page.methodTracker = function() {}  page.isClickTrackArea = function() {}  return originPage(page);};复制代码

3、对页面函数埋点

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

const originPage = Page;// 重写Page方法Page = (page) => {  // 给onShow方法插入埋点  const originMethod = page['onShow'];  page['onShow'] = function() {    report() // 记录埋点    return originMethod();  }  return originPage(page);};复制代码

4、通过配置表设置埋点

上面介绍了页面元素和函数的埋点方式,下面讲一下如何管理埋点信息解决代码入侵问题,可以把埋点信息以配置表的方式声明,以后还可以做到动态配置,在服务端配置完毕下发到客户端。

const tracks = {  path: 'pages/film/detail',  elementTracks: [    {      element: '.buy-now',  // 声明需要监听的元素      dataKeys: ['film.filmId'], // 声明需要获取Data下的film对象下的filmId字段    },    methodTracks: [    {      method: 'toBannerDetail', // 声明需要监听的函数      dataKeys: ['imgUrls'], // 声明需要获取Data下的imgUrls数据    },  ],  ]};复制代码

最后

完整的代码已经封装成SDK了,可以快速集成到项目

转载于:https://juejin.im/post/5c4840196fb9a04a05400474

你可能感兴趣的文章
VMware vCenter 5.5 – You do not have permission to login to the server
查看>>
虚拟局域网(VLAN)
查看>>
Cgroup – Linux的IO资源隔离
查看>>
Java调用栈
查看>>
高级查询运算符:EXCEPT/INTERSECT/UNION
查看>>
passwd修改用户密码
查看>>
启用Windows2012R2 重复数据删除服务 的血泪史!
查看>>
mysql安装
查看>>
从强化学习到深度强化学习(上)
查看>>
Shell重定向&>file、2>&1、1>&2的区别
查看>>
windows server CMD命令汇总 不断更新中
查看>>
PPPOE基本配置
查看>>
.ASM实例的SGA ,查看所有ASM文件大小
查看>>
U盘通用PE安装CentOS
查看>>
jira6.04安装汉化破解工作记录
查看>>
Greenplum移除节点
查看>>
我的友情链接
查看>>
Dojo Mobile 1.8 中的新功能
查看>>
修改windowsvista系统的注册表实现开机自动拨号功能
查看>>
centos 7 关闭SELINUX
查看>>