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


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 相关文章推荐
关于使用runtimeStyle属性问题讨论文章
Mar 08 Javascript
javascript基本语法分析说明
Jun 15 Javascript
!DOCTYPE声明对JavaScript的影响分析
Apr 12 Javascript
jquery之empty()与remove()区别说明
Sep 10 Javascript
js单例模式详解实例
Nov 21 Javascript
使用JSLint提高JS代码质量方法分享
Dec 16 Javascript
用C/C++来实现 Node.js 的模块(一)
Sep 24 Javascript
Javascript学习笔记之数组的遍历和 length 属性
Nov 23 Javascript
javascript原型模式用法实例详解
Jun 04 Javascript
JS中使用 after 伪类清除浮动实例
Mar 01 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
Apr 19 Javascript
javaScript实现一个队列的方法
Jul 14 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/01/13 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
详解php的socket通信
2015/08/11 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
基于Bootstrap表单验证功能
2017/11/17 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
pygame学习笔记(4):声音控制
2015/04/15 Python
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
python 的列表遍历删除实现代码
2020/04/12 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
检举信的格式及范文
2014/04/04 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
锦旗标语大全
2014/06/23 职场文书
金融管理专业求职信
2014/07/10 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
如何在python中实现ECDSA你知道吗
2021/11/23 Python
Python OpenCV形态学运算示例详解
2022/04/07 Python
Win10开机修复磁盘错误怎么跳过?Win10关闭开机磁盘检查的方法
2022/09/23 数码科技