Taro3无埋点的探索与实践

本文探讨了Taro3框架下无埋点技术的挑战与解决方案。在Taro3中,由于框架改动,原有的无埋点实现不再适用。通过分析,作者提出在运行时拦截用户事件和编译时保留用户方法名两方面解决问题。通过修改Taro3的事件处理和开发Babel插件,成功实现了无埋点功能,确保了在Taro3上稳定地收集用户行为数据。

引言

对于Taro框架,相信大多数小程序开发者都是有一定了解的。借助Taro框架,开发者们可以使用React进行小程序的开发,并实现一套代码就能够适配到各端小程序。这种促使开发成本降低的能力使得Taro被各大小程序开发者所使用。使用Taro打包出来的小程序和原生相比是有一定区别的,GrowingIO小程序的原生SDK还不足以直接在Taro中使用,需要针对其框架的特别进行适配。这点在Taro2时期已经是实现完美适配的,但在Taro3之后,由于Taro团队对其整体架构的调整,使得之前的方式已经无法实现准确的无埋点,促使了本次探索。

 

背景

GrowingIO小程序SDK无埋点功能的实现有两个核心问题:

  1. 如何拦截到用户事件的触发方法

  2. 如何为节点生成一个唯一且稳定的标识符

只要能处理好这两个问题,那就能实现一个稳定小程序无埋点SDK。在Taro2中,框架在编译期和运行期有不同的工作内容。其中编译时主要是将 Taro 代码通过 Babel 转换成小程序的代码,如:JS、WXML、WXSS、JSON。在运行时Taro2提供了两个核心ApicreateApp,createComponent,分别用来创建小程序App和实现小程序页面的构建。

GrowingIO 小程序SDK通过重写createComponent方法实现了对页面中用户事件的拦截,拦截到方法后便能在事件触发的时候获取到触发节点信息和方法名,若节点存在id,则用id+方法名作为标识符,否则就直接使用方法名作为标识符。这里方法名获取上sdk并没有任何处理,因为在Taro2的编译期已经做好了这一系列的工作,它会将用户方法名完整的保留下来,并且对于匿名方法,箭头函数也会进行编号赋予合适的方法名。

但是在Taro3之后,Taro的整个核心发生了巨大的变化,不论是编译期还是运行期和之前都是不一样的。createApp和createComponent接口也不再提供,编译期也会对用户方法进行压缩,不在保留用户方法名也不会对匿名方法进行编号。这样就导致现有GrowingIO 小程序SDK无法在Taro3上实现无埋点能力。

 

问题分析

在面对Taro3的这种变化,GrowingIO之前也做过适配。在分析Taro3运行期的代码中发现,Taro3会为页面内所有节点分配一个相对稳定的id,并且节点上的所有事件监听方法都是页面实例中的eh方法。在此条件下之前的GrowingIO便是按照原生小程序SDK的处理方式拦截该eh方法,在用户事件触发的时候获取到节点上的id以生成唯一标识符。这种处理方式在一定程度上也是解决了无埋点SDK的两个核心问题。

不难想到,GrowingIO之前的处理方式上,是没办法做到获取一个稳定的节点标识符的。当页面中节点的顺序发生变化,或者动态的增删了部分节点,这时Taro3都会给节点分配一个新的id,这样的话那就无法提供一个稳定的标识符了,导致之前圈选定义的无埋点事件失效。

如果想处理掉已定义无埋点事件失效问题,那就必须能提供一个稳定的标识符。类比与在Taro2上的实现,如果也能在拦截到事件触发的时候获取到用户方法名,那就可以了。也就是说只要能把以下两个问题处理掉,便能实现这个目标了。

  1. 运行时SDK能拦截用户方法

  2. 能在生产环境将用户方法名保留下来

 

逐一攻破

获取用户方法

先看第一个问题,SDK如何获取到用户绑定的方法,并拦截它。分析下Taro3的源码,不难就能解决掉。

所有的页面配置都是通过createPageConfig方法返回的,每个page配置都会有一个eh,从这里下手便能获取到绑定的方法。可见taro-runtime源码中的 eventHandlerdispatchEvent方法。

// page配置中的eh即为该方法
export function eventHandler (event: MpEvent) {
  if (event.currentTarget == null) {
    event.currentTarget = event.target
  }
  // 运行时的document是Taro3.0定
Taro 框架中实现小程序埋点的方案可以分为 **无痕埋点** 和 **自定义埋点** 两种方式。Taro 提供了良好的跨端兼容能力,使得开发者可以统一处理不同平台小程序的埋点逻辑。 ### 无痕埋点 Taro 支持引入第三方埋点 SDK,例如腾讯有数等,这些 SDK 提供了自动化的埋点能力,涵盖小程序的生命周期事件和用户行为事件。例如: - 小程序启动、显示、隐藏 - 页面浏览、页面离开 - 分享、下拉刷新、上拉触底等 通过集成这些 SDK,开发者可以实现“真·零开发”的无痕埋点,无需手动编写埋点代码即可完成基础埋点工作。此外,SDK 还支持更高级的分析能力,如经营分析、直播分析、导购分析等[^1]。 ### 自定义埋点 对于特定业务场景,如搜索行为、商品点击归因、按钮点击等,可以通过手动埋点的方式实现。具体实现方式如下: 1. **封装埋点工具函数** 创建统一的埋点方法,用于兼容不同平台的埋点接口,例如: ```javascript // utils/tracker.js export const trackEvent = (eventName, params = {}) => { if (process.env.TARO_ENV === &#39;weapp&#39;) { // 微信小程序埋点 wx.reportEvent(eventName, params); } else if (process.env.TARO_ENV === &#39;swan&#39;) { // 百度小程序埋点 swan.reportEvent(eventName, params); } else if (process.env.TARO_ENV === &#39;alipay&#39;) { // 支付宝小程序埋点 my.reportEvent(eventName, params); } } ``` 2. **在组件中调用埋点函数** 在页面或组件中调用封装好的埋点方法,例如点击某个按钮时上报事件: ```javascript import { trackEvent } from &#39;@/utils/tracker&#39;; const MyButton = () => { const handleClick = () => { trackEvent(&#39;button_click&#39;, { button_name: &#39;search_button&#39; }); }; return ( <Button onClick={handleClick}>搜索</Button> ); }; ``` 3. **结合生命周期进行埋点** 可在页面的生命周期中埋点,例如页面加载、显示、隐藏等: ```javascript import { trackEvent } from &#39;@/utils/tracker&#39;; const IndexPage = () => { useEffect(() => { trackEvent(&#39;page_view&#39;, { page_name: &#39;index_page&#39; }); }, []); return <View>首页内容</View>; }; ``` ### 注意事项 - **平台兼容性**:不同平台的小程序 API 有差异,埋点方法需要根据 `process.env.TARO_ENV` 进行判断和适配。 - **埋点数据结构标准化**:建议制定统一的事件命名规范和参数结构,便于后期数据分析。 - **性能优化**:避免频繁上报埋点数据,可采用节流、防抖等方式减少请求频率。 ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值