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


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 IE 浏览器判定代码
Mar 21 Javascript
工作需要写的一个js拖拽组件
Jul 28 Javascript
JS获取URL中参数值(QueryString)的4种方法分享
Apr 12 Javascript
Javascript中的匿名函数与封装介绍
Mar 15 Javascript
jQuery实现的在线答题功能
Apr 12 Javascript
js实现上传图片预览方法
Oct 25 Javascript
AngularJS Controller作用域
Jan 09 Javascript
JavaScript利用Date实现简单的倒计时实例
Jan 12 Javascript
在vue项目中安装使用Mint-UI的方法
Dec 27 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
Dec 09 Javascript
p5.js绘制创意自画像
Nov 04 Javascript
vue2路由方式--嵌套路由实现方法分析
Mar 06 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
容易被忽略的JS脚本特性
2011/09/13 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
2016/07/27 Javascript
HTML5 canvas 9绘制图片实例详解
2016/09/06 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
简单的三步vuex入门
2018/05/20 Javascript
javascript合并两个数组最简单的实现方法
2019/09/14 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
使用python绘制人人网好友关系图示例
2014/04/01 Python
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
Python3之文件读写操作的实例讲解
2018/01/23 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
Python zip函数打包元素实例解析
2019/12/11 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
告诉你怎样写创业计划书
2014/01/27 职场文书
综治工作心得体会
2014/09/11 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
实习生矿工检讨书
2014/10/13 职场文书
股东大会通知
2015/04/24 职场文书
承诺书模板大全
2015/05/04 职场文书
python办公自动化之excel的操作
2021/05/23 Python
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS
Python find()、rfind()方法及作用
2022/12/24 Python