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


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 得到当前页面高度和宽度的两个函数
Feb 21 Javascript
10款非常有用的 Ajax 插件分享
Mar 14 Javascript
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
Jul 26 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
Nov 17 Javascript
在Node.js中使用Javascript Generators详解
May 05 Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
Dec 16 Javascript
js判断节假日实例代码
Dec 27 Javascript
详解vue-cli官方脚手架配置
Jul 20 Javascript
Angular2中监听数据更新的方法
Aug 31 Javascript
详解Vue.js自定义tipOnce指令用法实例
Dec 19 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
Dec 09 Javascript
解决vue+webpack项目接口跨域出现的问题
Aug 10 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
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
PHP 安全检测代码片段(分享)
2013/07/05 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
js调用图片隐藏&amp;显示实现代码
2013/09/13 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
vue2.0中goods选购栏滚动算法的实现代码
2017/05/17 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
Python的Twisted框架中使用Deferred对象来管理回调函数
2016/05/25 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
美食节策划方案
2014/05/26 职场文书
经典团队口号
2014/06/06 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
年度考核个人总结
2015/03/06 职场文书
2015年法院工作总结范文
2015/04/28 职场文书
销售人员管理制度
2015/08/06 职场文书
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS
DE1103使用报告
2022/04/05 无线电
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技
vue实现登陆页面开发实践
2022/05/30 Vue.js
Python中tqdm的使用和例子
2022/09/23 Python