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

发布时间 2023-04-16 19:12:46作者: 疾风_剑豪

公司有个小程序需要埋点,然后我看了之前的前辈写的代码,是每个页面在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!'
  }
})

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