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


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 相关文章推荐
javascript提取URL的搜索字符串中的参数(自定义函数实现)
Jan 22 Javascript
Jquery实现的角色左右选择特效
May 21 Javascript
js中window.open打开一个新的页面
Aug 10 Javascript
js的toLowerCase方法用法实例
Jan 27 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
Apr 17 Javascript
深入浅出分析javaScript中this用法
May 09 Javascript
JavaScript中使用自然对数ln的方法
Jun 14 Javascript
js实现倒计时关键代码
May 05 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
Jun 22 Javascript
安装Node.js并启动本地服务的操作教程
May 12 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
Jul 10 Javascript
微信小程序实现电子签名功能
Jul 29 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数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
2014过年倒计时示例
2014/01/31 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
php服务器的系统详解
2019/10/12 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
javascript使用avalon绑定实现checkbox全选
2015/05/06 Javascript
javascript中this的四种用法
2015/05/11 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
利用vue + koa2 + mockjs模拟数据的方法教程
2017/11/22 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
jQuery实现回到顶部效果
2020/10/19 jQuery
Python程序员面试题 你必须提前准备!(答案及解析)
2018/01/23 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
python解析json串与正则匹配对比方法
2018/12/20 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
python实现从ftp服务器下载文件
2020/03/03 Python
毕业自荐书
2013/12/09 职场文书
五型班组建设方案
2014/02/10 职场文书
网站客服岗位职责
2014/04/05 职场文书
信访工作经验交流材料
2014/05/23 职场文书
优秀班集体先进事迹材料
2014/05/28 职场文书
四群教育工作总结
2015/08/10 职场文书
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
2021/04/01 PHP