我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue手动埋点设计的方法实例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue手动埋点设计的方法实例

目标

  • 使用简单;
  • 减少代码侵入性,不影响业务代码阅读

简述

  • 埋点一般是按页面来管理的;
  • 埋点的事件类型一般分为:点击、曝光和页面的进入和离开;
  • 埋点的实质就是在恰当的时机去发送请求,上送业务参数

按页面管理埋点

在每个页面目录下创建events.js,管理当前页面的所有埋点事件。

为了减少埋点对业务代码的影响,events.js中每个埋点的设置都是一个方法,可以在这个方法中处理数据得到埋点需要上送的数据。

该埋点设置的方法,返回一个埋点需要上送的参数的对象。

// class="lazy" data-src/views/PageA/events.js

export default {
  // 按事件类型管理
  CLICK: {
    back(ctx, data) {
      let { param1, param2 } = data;
      // ...处理传入的数据
      return {
        eventValue: '返回',
        elementId: 'pageA-返回',
        // 需要上送的处理后的业务参数
        customData: {
          param1,
          param2
        }
      };
    }
  }
}

遵循使用简单的原则,调用埋点

// class="lazy" data-src/views/PageA/index.vue

this.$track('CLICK.back', data);

实现上面的调用

  • 使用require.context()聚合各个页面目录下的埋点设置(events.js)。
  • 聚合后的埋点设置按页面作为模块管理,使用页面文件夹名称作为模块名。
  • 结合路由管理,可以获得当前页面的埋点配置模块名。
  • 在Vue.prototype下新增一个$track()方法。
// class="lazy" data-src/events/index.js
import router from '@/router';

const ctx = require.context('@/views', true, /events\.js/);
const configs = {};
ctx.keys().reduce((configs, path) => {
  if (/\.\/(\w+?)\/events\.js/.test(path)) {
    const moduleName = RegExp.$1; // 第一个子项
    configs[moduleName] = resolveModule(moduleName, ctx(path));
  }
  return configs;
}, configs);

function resolveModule(moduleName, module) {
  return Object.entries(module.default).reduce((all, [EVENT_TYPE, events]) => {
    all[EVENT_TYPE] = Object.keys(events).reduce((typeAll, key) => {
      typeAll[key] = buildTrackRequest(
        EVENT_TYPE.toLowerCase(),
        key,
        events[key]
      );
      return typeAll;
    }, {});
  });
}

function buildTrackRequest(eventType, trackName, trackSetting) {
  return function trackRequest(...args) {
    // 看完后面再回过来看
    if (typeof trackSetting !== 'function') {
      trackSetting = obj2fn(trackSetting);
    }
    // 执行用户定义的方法,返回埋点上送参数
    const [success, result] = invokeUserFn(trackSetting.bind(this, {}));
    if (!success) return result;
    // 传入参数,发送埋点请求
    return tracker(result);
  }
}

export function track(eventPath, ...args) {
  let event = configs;
  let seg;
  const segs = eventPath.split('.');
  // 2段式 没有提供模块名,则需要去路由配置上取
  if (segs.length === 2) {
    const moduleName = router.currentRoute.meta?.eventModule;
    if (!moduleName) {
      throwError(`${eventPath} 没有在路由配置中设置"meta.eventModule" 或者配置成3段式`);
    }
    event = event[moduleName];
  }
  while ((seg = segs.shift())) event = event[seg];
  if (!event) throwError(`${eventPath} 不存在`);
  // 给event绑定当前调用环境
  return event.call(this, ...args);
}

function throwError(err) {
  throw Error(`[Track Error] ${err}`);
}

export default function install(Vue) {
  Vue.prototype.$track = track;
}

埋点设置支持对象形式

很多时候,可能不需要上送业务参数,写成一个对象更加简单。

{
  CLICK: {
    back: {
      eventValue: '返回',
      elementId: 'pageA-返回',
    }
  }
}

有时候只需要上送简单的业务字段,无需额外处理,也想使用对象的形式。

支持{{param1}}模板语法,同vue-template用法。(param1是埋点调用组件的属性)

{
  CLICK: {
    back: {
      eventValue: '返回',
      elementId: 'pageA-返回',
      customData: {
        param1: '{{param1}}'
      }
    }
  }
}

将对象格式的埋点配置转成方法形式的

const templateRE = /\{\{(.+?)\}\}/g;
// 处理对象形式的埋点设置
function obj2fn(obj) {
  return function() {
    const that = this;
    // 处理模板字符串
    (function resolveObj(obj) {
      Object.keys(obj).forEach(key => {
        const val = obj[key];
        // 解析模板字符串
        if (typeof val === 'string' && templateRE.test(val)) {
          obj[key] = val.replace(templateRE, (...match) => {
            // js严格模式下无法执行with语法,以下是一种变通
            return new Function(`with(this){return ${match[1]}}`).call(that);
          });
        }
        // 递归处理
        else if (isPlainObject(val)) resolve(val);
      });
    })(obj);
    return obj;
  };
}

提供页面级别的参数设置

很多时候一个页面下的埋点都需要上送相同的参数,如页面名称等。

提供beforeModuleEach和afterModuleEach两个钩子。

一般使用beforeModuleEach设置模块(页面)通用的埋点参数,再合并单独的埋点设置参数,得到所有需要上送的参数。

function resolveModule(moduleName, module) {
  // 获取`events.js`文件中设置的钩子
  const { beforeModuleEach, afterModuleEach } = module;
  // 获取动态设置钩子
  const { beforeHooks, afterHooks } = getHooksByModule(moduleName);
  beforeModuleEach && beforeHooks.unshift(beforeModuleEach);
  afterModuleEach && afterHooks.unshift(afterModuleEach);
  
  return Object.entries(module.default).reduce((all, [EVENT_TYPE, events]) => {
    all[EVENT_TYPE] = Object.keys(events).reduce((typeAll, key) => {
      typeAll[key] = buildTrackRequest(
        EVENT_TYPE.toLowerCase(),
        key,
        events[key],
        beforeHooks,
        afterHooks
      );
      return typeAll;
    }, {});
  });
}

总结

到此这篇关于Vue手动埋点设计的文章就介绍到这了,更多相关Vue手动埋点设计内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue手动埋点设计的方法实例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue移动端实现手指滑动效果的方法

本篇内容主要讲解“vue移动端实现手指滑动效果的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue移动端实现手指滑动效果的方法”吧!本文实例为大家分享了vue移动端实现手指滑动效果的具体代
2023-06-20

Android实现手机振动设置的方法

本文实例讲述了Android实现手机振动设置的方法。分享给大家供大家参考。具体如下: main.xml布局文件:
2022-06-06

Vue级联下拉框的设计和实现方法

这篇文章主要介绍“Vue级联下拉框的设计和实现方法”,在日常操作中,相信很多人在Vue级联下拉框的设计和实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue级联下拉框的设计和实现方法”的疑惑有所帮助!
2023-06-20

vue-meta实现router动态设置meta标签的方法

这篇文章主要介绍了vue-meta实现router动态设置meta标签,实现思路非常简单内容包括mata标签的特点和mata标签共有两个属性,分别是http-equiv属性和name属性,本文通过实例代码给大家详细讲解需要的朋友可以参考下
2022-11-21

treeSelect树组件设置父节点禁用的方法实例

这篇文章主要给大家介绍了关于treeSelect树组件设置父节点禁用的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
2022-12-24

Linux系统设置开机自动运行脚本的方法实例

前言 大家好,我是良许。 在工作中,我们经常有个需求,那就是在系统启动之后,自动启动某个脚本或服务。在 Windows 下,我们有很多方法可以设置开机启动,但在 linux 系统下我们需要如何操作呢? Linux 下同样可以设置开机启动,但
2022-06-04

实例讲解Python设计模式编程之工厂方法模式的使用

工厂方法模式是简单工厂模式的进一步抽象和推广,它不仅保持了简单工厂模式能够向客户隐藏类的实例化过程这一优点,而且还通过多态性克服了工厂类过于复杂且不易于扩展的缺点。在工厂方法模式中,处于核心地位的工厂类不再负责所有产品的创建,而是将具体的创
2022-06-04

云服务器cvm实例的计费模式有哪些功能设置方法

1.计费模式腾讯云服务器CVM实例的计费模式主要有以下几种:1.1包年包月包年包月是指用户预付一定的费用,购买一定时长的CVM实例使用权。这种计费模式适合长期稳定的业务,价格相对较低。1.2按量计费按量计费是指用户按照实际使用的资源量进行计费,不需要预付费用。这种计费模式适合短期、突发性的业务,价格相对较高。1.3预留实例预留实例是指用户预付一定的费用,购买一定数量的CVM实例使用
2023-10-26

编程热搜

目录