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


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 相关文章推荐
js与C#进行时间戳转换
Nov 14 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
Nov 20 Javascript
JavaScript实现点击文字切换登录窗口的方法
May 11 Javascript
JS动态添加iframe的代码
Sep 14 Javascript
基于jquery实现省市联动效果
Nov 23 Javascript
基于JavaScript操作DOM常用的API小结
Dec 01 Javascript
jQuery通过写入cookie实现更换网页背景的方法
Apr 15 Javascript
js动态获取子复选项并设计全选及提交的实现方法
Jun 24 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
Jan 09 Javascript
详解vue移动端项目的适配(以mint-ui为例)
Aug 17 Javascript
Vue-Cli项目优化操作的实现
Oct 27 Javascript
用vue写一个日历
Nov 02 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
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
PHP实现对二维数组某个键排序的方法
2016/09/14 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
Yii2中简单的场景使用介绍
2017/06/02 PHP
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
2017/01/05 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
2018/11/13 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
Python中文字符串截取问题
2015/06/15 Python
python opencv检测目标颜色的实例讲解
2018/04/02 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
Python3.4解释器用法简单示例
2019/03/22 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
Python中有几个关键字
2020/06/04 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
银行实习生自我鉴定范文
2013/09/19 职场文书
大学生职业生涯规划范文
2014/01/08 职场文书
2014新年寄语
2014/01/20 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
施工安全保证书
2015/05/09 职场文书