首页 > 编程语言 >小程序埋点方案思路及部分实现

小程序埋点方案思路及部分实现

时间:2023-04-16 19:24:02浏览次数:33  
标签:思路 函数 程序 options originalFunc key 埋点 Page

公司有个小程序需要埋点,然后我看了之前的前辈写的代码,是每个页面在onshow  onhide(或者在点击)等生命周期或者事件写的调用后端接口。这样就很麻烦,每个页面都要去写重复的代码。有没有简单点的方式?

嗯,这个可以有:

  小程序每个页面的Page就是一个函数咯,那可不可以重写。。。。。。。。。

  试试看

  

function MyPage(options) {
  // 在Page函数中调用原生的Page函数,并传入options参数
  const originalPage = Page;
  options = options || {};
  // 重写options中的生命周期函数和事件处理函数
  ['onLoad', 'onShow', 'onHide', 'onUnload'].forEach(function(key) {
    const originalFunc = options[key];
    options[key] = function(options) {
      // 在生命周期函数中添加相应的埋点代码
      console.log(`Page ${key} called`);
      if (originalFunc) {
        originalFunc.call(this, options);
      }
    }
  });
  // 调用原生的Page函数,并传入重写后的options参数
  return originalPage(options);
}

  试了一下好像OK耶,嗯。。。。。那.........我们再把事件也加上吧,就变成了以下这样的了

function MyPage(options) {
  // 在Page函数中调用原生的Page函数,并传入options参数
  const originalPage = Page;
  options = options || {};
  // 重写options中的生命周期函数和事件处理函数
  ['onLoad', 'onShow', 'onHide', 'onUnload'].forEach(function(key) {
    const originalFunc = options[key];
    options[key] = function(options) {
      // 在生命周期函数中添加相应的埋点代码
      console.log(`Page ${key} called`);
      if (originalFunc) {
        originalFunc.call(this, options);
      }
    }
  });
  ['bindtap', 'bindlongpress', 'bindinput'].forEach(function(key) {
    const originalFunc = options[key];
    options[key] = function(e) {
      // 在事件处理函数中添加相应的埋点代码
      console.log(`Event ${key} called`);
      if (originalFunc) {
        originalFunc.call(this, e);
      }
    }
  });
  // 调用原生的Page函数,并传入重写后的options参数
  return originalPage(options);
}

在以上代码中,我们创建了一个新的MyPage函数,并重写了Page函数的行为。在重写的MyPage函数中,我们首先调用了原生的Page函数,并将options参数传递给它。然后,我们在options中找到生命周期函数和事件处理函数,并重写它们的行为,以便添加相应的埋点代码。在重写的生命周期函数中,我们添加了输出日志的代码,可以根据具体需求替换成实际的埋点代码。在重写的事件处理函数中,我们也添加了输出日志的代码,可以根据具体需求替换成实际的埋点代码。

接下来-------------------------------------------------------------------

我们把页面的代码替换一下,将所有的Page函数改为MyPage函数。

Page({
  data: {
    message: 'Hello, world!'
  }
})

  换成这样

MyPage({
  data: {
    message: 'Hello, world!'
  }
})

  这样,就可以在所有页面中自动添加相应的埋点代码,从而实现全局埋点的需求。

 

标签:思路,函数,程序,options,originalFunc,key,埋点,Page
From: https://www.cnblogs.com/maomao93/p/17323849.html

相关文章

  • python中如何对程序运行时长进行计时?
      在python中对程序运行的是时长进行计时这里主要介绍两种方式:自定义和TimePinner。1、自定义计时  自定义计时,我们这里只需要简单记录开始时间和结束时间,计算出时差进行打印。  首先导入datetime库importdatetime  记录开始时间和结束时间#开始时间start_time......
  • Modbus应用程序协议规范V1.1b3
    1.介绍1.1本文件范围MODBUS是一种应用层消息传递协议,位于OSI模型的第7级,它在不同类型的总线或网络上连接的设备之间提供客户端/服务器通信。MODBUS是一种请求/回复协议,并提供由功能码指定的服务。MODBUS功能码是MODBUS请求/回复pdu的元素。本文档的目的是描述在MODBUS事务......
  • python程序中如何结束程序的运行?
    结束程序运行主要的方式有四种:sys.exit()threading.Thread._stop()os._exit()os.kill(os.getpid(),signal.SIGTERM)1、单线程或单进程结束程序。(1)sys.exit()  sys.exit()指令可以直接结束整个Python程序的运行,包括所有线程。(2)threading.Thread._stop()  threading......
  • 操作系统试验-进程间通信:借鉴生产者-消费者示例程序,利用FIFO或消息队列实现操作系统中
    实验名称操作系统试验-进程间通信实验目的借鉴生产者-消费者示例程序,利用FIFO或消息队列实现操作系统中的经典生产者-消费者问题,要求:1、仓库有26个存储单元;2、具有两个以上的生产者与消费者;3、生产者和消费者以随机的方式对仓库进行访问;4、在任意时刻,仓库里面只有一个进程;5、仓库满......
  • Web实验二 服务器端简单程序设计
    实验项目名称:实验二  服务器端简单程序设计 一、实验目的通过一个小型网站的开发,掌握JSP基础知识,加深对session,request,response,cookie等对象的理解,掌握其使用方法,进一步深入掌握HTML、CSS和JavaScript等知识。二、实验内容和基本要求1)编写index.jsp文件,展示某一类物品或......
  • 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序怎么办
    去微软官网下载DownloadMicrosoftAccess2010数据库引擎可再发行程序包fromOfficialMicrosoftDownloadCenter下载地址32位下载链接分享链接:https://pan.baidu.com/s/1dLXgBZVUV8_sHBc1dnVfGA?pwd=nvll提取码:nvll--来自百度网盘超级会员V1的分享 64位下载链接分......
  • 通讯录的思路与实现(C语言)
     目录前言程序的分装程序的结构函数实现通讯录的初始化通讯录的扩容将数据保存到本地增加联系人显示通讯录所有联系人目标联系人的检索(根据名称)目标联系人的检索(根据号码)检索发展来的函数删除联系人查询目标联系人联系人信息的更改按名称对通讯录进行排序找到属于目标类别的联......
  • [软件人生]关于程序员的坚持与成功
    给灵科弟兄的一段话:我不希望大家照着上面说的,变得世故。虽然有些时候,有些事情是矛盾的。但是,我还是坚持认为,保持自己,可能比随波逐流更重要,如果你真得想成为程序员中的翘楚,而不是被众人淹没。高潮和低谷都是会有的,高潮期往往很短暂,而低谷期往往很漫长,不是感觉的漫长,而是实际上的漫长......
  • 微信小程序开发(学习记录1.0)
    首先,把遇到的问题贴出来,主要是这个解决问题的思路,供大家参考。现在的问题是将下面的导航栏做出来,但是在自己做的时候遇到的问题在app.json文件中输入tarBar,就会生成模板代码,默认会生成一个list的模板代码,几个list就是下面的导航栏有几部分,我们想要分成三部分,所以我们就会有三个lis......
  • java: 程序包org.springframework.web.bind.annotation不存在(已解决)
    今天在创建了一个新的SpringBoot模块后,和往常一样将文件从别的模块中复制过来,然后运行鑫模块就报错了:java:程序包org.springframework.web.bind.annotation不存在,第一反应是将文件所在的包Rebuild一下,但是这次并没有起到作用。然后就想着清除一下缓存,进行步骤:File-->Invalidat......