激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語言 - JavaScript - js教程 - 詳解微信小程序(Taro)手動埋點(diǎn)和自動埋點(diǎn)的實(shí)現(xiàn)

詳解微信小程序(Taro)手動埋點(diǎn)和自動埋點(diǎn)的實(shí)現(xiàn)

2022-01-25 16:07燕行者 js教程

這篇文章主要介紹了詳解微信小程序(Taro)手動埋點(diǎn)和自動埋點(diǎn)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

每一個公司要想用戶增長,都要收集和分析用戶操作數(shù)據(jù),因此埋點(diǎn)是必不可少的事情。
而對于前端職業(yè)發(fā)展來說,傳統(tǒng)的手動埋點(diǎn),無疑是繁瑣又無聊的事情,能簡化就簡化。

一、手動埋點(diǎn)

手動埋點(diǎn)就是在每一處需要的地方,都加一段上報埋點(diǎn)的代碼。影響代碼的閱讀體驗(yàn),且散落的埋點(diǎn)代碼不方便管理。
以頁面 pv 為例,我們此前是在每一個頁面中上報 pv:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// src/manual/home/index.tsx
 
import tracking from "./tracking";
 
// pageSn 是前端和產(chǎn)品約定的「頁面在埋點(diǎn)系統(tǒng)的唯一標(biāo)識」,比如這個項(xiàng)目首頁的標(biāo)識符是數(shù)字 11664
const pageSn = 11111;
 
export default () => {
 // useDidShow 是 Taro 專有的 Hook,等同于小程序原生 componentDidShow 生命周期,會在頁面展示的時候調(diào)用。
 useDidShow(() => {
 // 通過統(tǒng)一封裝的 sendPv 方法發(fā)送 pv 埋點(diǎn)
 sendPv(pageSn);
 });
 return <View>手動埋點(diǎn)頁面</View>;
};

二、自動埋點(diǎn)

自動埋點(diǎn)可分為全自動埋點(diǎn)和半自動埋點(diǎn)。全自動埋點(diǎn)則是不管需不需要,將所有的點(diǎn)都埋了。前端肯定開心了 “以后埋點(diǎn)產(chǎn)品都不要不要找我啦”,可數(shù)據(jù)同學(xué)就哭唧唧了。

比如,騰訊和 Taro 團(tuán)隊(duì)共同推出 騰訊有數(shù)自動化埋點(diǎn),接入超級簡單。比如配置 proxyPage 為 true 即可 “上報所有頁面的 browse 、leave、share 等事件”,配置 autoTrack 為 true 即可 “自動上報所有元素的 tap、change、longpress、confirm 事件”。

可從數(shù)據(jù)量和有效性來說,「全埋」等于「不埋」,因?yàn)椤溉瘛挂环矫鎸?shù)據(jù)存儲量要求很高,另一方面會給我們負(fù)責(zé)數(shù)據(jù)清洗的同學(xué)帶來大量工作。

所以接下來,還是從中尋求平衡,著重看半自動埋點(diǎn)。

1、頁面曝光(pv)

頁面曝光(pv),理想的上報方式是:

在一個統(tǒng)一的地方(如 trackingConf.ts),配置好每個要埋點(diǎn)的頁面的標(biāo)識符(即 pageSn)
頁面顯示后,自動判斷下是否需要上報(是否在 trackingConf.ts 配置文件中),要就直接上報。

具體實(shí)現(xiàn)

(1)統(tǒng)一配置埋點(diǎn)字段,pageSn 表示頁面在埋點(diǎn)系統(tǒng)中的標(biāo)識符

?
1
2
3
4
5
6
// trackingConf.ts
export default {
 "auto/home/index": {
 pageSn: 11111,
 },
};

當(dāng)然,如果你的業(yè)務(wù)允許三七二十一,上報所有頁面 pv(帶上 path 讓產(chǎn)品自己篩選),那(1)這步可以省了,直接看(2),這種方式可稱為「pv 全自動埋點(diǎn)」。

(2)封裝 usePv hook,在頁面展示時,獲取當(dāng)前頁面 pageSn、判斷是否要埋 pv、要的話發(fā)送 pv

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// usePv.ts
 
// 獲取當(dāng)前頁面 path,借助 Taro 的 getCurrentInstance
export const getPath = () => {
 const path = Taro.getCurrentInstance().router?.path || "";
 // 去掉開頭的 /,比如將 '/auto/home/index' 改為 'auto/home/index'
 return path.match(/^\/*/) ? path.replace(/^\/*/, "") : path;
};
 
// 獲取當(dāng)前頁面 pageSn、判斷是否要埋 pv、要的話發(fā)送 pv
// 入?yún)?getExtra 支持?jǐn)y帶額外參數(shù)
const usePv = ({
 getExtra,
}: {
 getExtra?: () => any;
} = {}) => {
 // 頁面曝光
 useDidShow(() => {
 const currentPath = getPath();
 // 從 trackingConf 中獲取 pageSn
 const pageSn = trackingConf[currentPath]?.pageSn;
 console.log("自動獲取 pageSn", currentPath, pageSn);
 if (pageSn) {
  const extra = getExtra?.();
  // 通過統(tǒng)一封裝的 sendPv 方法發(fā)送 pv 埋點(diǎn)
  extra ? sendPv(pageSn, extra) : sendPv(pageSn);
 }
 });
};

(3)然后封裝頁面組件 WrapPage ,使用上述的 usePv():

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import React from "react";
import { View } from "@tarojs/components";
import usePv from "./usePv";
 
function WrapPage(Comp) {
 return function MyPage(props) {
 usePv();
 return (
  <View>
  <Comp {...props} />
  </View>
 );
 };
}
 
export default WrapPage;

(4)最后在所有頁面組件,包一層 WrapPage 即可實(shí)現(xiàn)「所有頁面按需埋點(diǎn)」:

?
1
2
3
4
5
// src/auto/home/index.tsx
 
const Index = WrapPage(() => {
 return <View>自動埋點(diǎn)頁面</View>;
});

后續(xù)新開發(fā)一個頁面,除了用 WrapPage 包裹外,只需要在第(1)步的 trackingConf.ts 中增加該頁面的 pageSn 即可。

提問環(huán)節(jié)

好奇寶寶們可能要問了:

(1)WrapPage 里這樣封裝了 usePv(),應(yīng)該如何支持上報自定義字段呢?
舉個例子,產(chǎn)品希望 src/auto/home/index.tsx 這個頁面上報 pv 的時候,額外上報一下 當(dāng)前頁面 URL 查詢參數(shù)即 params。
很簡單,就是這個頁面不要用 WrapPage 包裹,而是拿到 params 后直接調(diào)用 usePv 函數(shù):

?
1
2
3
4
5
6
7
8
9
10
11
// src/auto/home/index.tsx
 
const Index = () => {
 usePv({
 getExtra: () => {
  const params = Taro.getCurrentInstance().router?.params;
  return { params };
 },
 });
 return <View>自動埋點(diǎn)頁面</View>;
});

(2)這里每個頁面組件,都要用 WrapPage 包裹一下,對業(yè)務(wù)還是有侵入型了,原生小程序可以改寫 Page,在 Page 中直接 usePv()。Taro 項(xiàng)目應(yīng)該也可以這么做,實(shí)現(xiàn) 0 業(yè)務(wù)侵入吧?

Taro 項(xiàng)目中,確實(shí)可以也可以和原生小程序一樣,在 App 中統(tǒng)一攔截原生 Page,但這樣的話,上面「某些頁面要計算額外參數(shù)并上報」就不好解決了。

2、頁面分享

微信小程序中,存在兩種分享:

  • 分享給好友:useShareAppMessage。
  • 分享到朋友圈:useShareTimeline。小程序基礎(chǔ)庫 v2.11.3 開始支持,目前只在 Android 平臺可用。

具體實(shí)現(xiàn)

以 useShareAppMessage 為例(useShareTimeline 同理):
(1)仍在 trackingConf.ts 統(tǒng)一配置文件中,增加分享埋點(diǎn)的標(biāo)識字段 eleSn (及額外參數(shù))

?
1
2
3
4
5
6
7
// trackingConf.ts
export default {
 "auto/home/index": {
 pageSn: 11111,
 shareMessage: { eleSn: 2222, destination: 0 }, // 增加 shareMessage 包含分享好友的 eleSn、業(yè)務(wù)額外參數(shù) destination
 }
};

(2)封裝 useShareAppMessage 方法,業(yè)務(wù)調(diào)用 Taro.useShareAppMessage 的地方全局替換為這個 useShareAppMessage。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 分享給好友,統(tǒng)一埋點(diǎn)
export const useShareAppMessage = (
 callback: (payload: ShareAppMessageObject) => ShareAppMessageReturn
) => {
 let newCallback = (payload: ShareAppMessageObject) => {
 const result = callback(payload)
 
 const currentPath = getPath(); // getPath 獲取當(dāng)前頁面路徑,可參考「1、頁面曝光(pv)」中的 getPath
 // 從 trackingConf 中獲取 pageSn、shareMessage 等
 const { pageSn, shareMessage } = trackingConf[currentPath]
 const { eleSn, ...extra } = shareMessage || {}
 let page_el_sn = eleSn
 const { imageUrl: image_url, path: share_url } = result
 const { from: from_ele } = payload
 
 const reportInfo = {
  from_ele,
  share_to: 'friend', // 'friend' 表示分享給好友
  image_url,
  share_url,
  ...extra
 }
 console.log('...useShareAppMessage tracking', { pageSn, page_el_sn, reportInfo })
 sendImpr(pageSn, page_el_sn, reportInfo) // 可自行封裝 sendImpr 方法,發(fā)送分享埋點(diǎn)信息
 return result
 }
 Taro.useShareAppMessage(newCallback)
}

這樣,如果有個頁面需增加分享好友的埋點(diǎn),直接在 trackingConf.ts 中增加 shareMessage 的 eleSn 即可,useShareTimeline 同理。

提問環(huán)節(jié)

好奇寶寶們可能要問了:頁面需要增加分享好友/朋友圈的埋點(diǎn),可否 0 配置(即不用修改上述的  trackingConf.ts 文件)?
與前文中「pv 全自動埋點(diǎn)」類似,只要和產(chǎn)品約定好撈數(shù)據(jù)的方式也可以,比如筆者和產(chǎn)品約定了:
每個頁面分享好友/朋友圈,eleSn 都是 444444,然后產(chǎn)品通過 pageSn 判斷是哪個頁面,通過 share_to 判斷是分享好友 / 朋友圈,對于分享好友的場景,再通過 from_ele 判斷通過右上角分享還是點(diǎn)擊頁面中的按鈕分享。
這樣頁面分享也可以全自動埋點(diǎn)了。

3、元素埋點(diǎn)

元素自動埋點(diǎn)的調(diào)研遇到阻力,尚未落地。下文主要談不同思路遇到的問題,有好的建議歡迎評論區(qū)溝通。

我們元素埋點(diǎn),較高頻的有曝光、點(diǎn)擊事件,中低頻的有滾動、懸停等事件。

手動埋點(diǎn)的方式就是在元素指定事件觸發(fā)的時候,手動執(zhí)行 sendImpr 上報埋點(diǎn)(帶上頁面唯一標(biāo)識符 pageSn、 元素唯一標(biāo)識符 eleSn)。

那這個環(huán)節(jié)是否可以省事一些呢?對業(yè)務(wù)無侵入,大概的做法還是:

在 Component 指定事件觸發(fā)增加個 hook -> 判斷是否要上報埋點(diǎn) -> 滿足條件則上報

問題一分為二:

(1)攔截元素事件回調(diào)

可以攔截并遍歷小程序 Component 接收到的 options.methods,如果是一個自定義函數(shù),則在函數(shù)被調(diào)用的時候判斷第一個參數(shù)(假設(shè)命名為 e)的 type 是否等于 tap 等事件。這時候可以根據(jù) e 等信息決定是否滿足埋點(diǎn)上報條件了。
原生小程序中的實(shí)現(xiàn),大致如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// App.js
App({
 onLaunch() {
 let old = Component
 Component = function(config) {
  // 攔截業(yè)務(wù)傳入的 config
  const newConf = proxyConfig(config)
  old(newConf)
 }
 }
})
 
const proxyConfig = function(conf) {
 const methods = conf.methods
 // 獲取自定義方法(按需排除一些不埋點(diǎn)的方法)
 let diyMethods = Object.entries(methods).filter(function (method) {
 let methodName = method[0]
 return ![
  "onLoad",
  "onShow",
  "onReady",
  "onHide",
  "onUnload",
  "onPullDownRefresh",
  "onReachBottom",
  "onPageScroll",
  "onShareAppMessage",
  "onResize",
  "onTabItemTap",
  "observer",
 ].includes(methodName);
 })
 diyMethods.forEach(function(method) {
 const [methodName, methodFn] = method
 // 修改 conf 中的 methods
 methods[methodName] = function (...args) {
  const e = args && args[0]
  if (e && e.type === 'tap') {
  console.log('...tapping', methodName, args) // 觸發(fā)點(diǎn)擊事件的時候,按需上報埋點(diǎn)
  }
  methodFn.call(this,...args)
 }
 });
 // 返回修改后的 conf
 return conf
}

Taro 項(xiàng)目中,不能直接在組件代碼里用 Component,但可以迂回一些的方式實(shí)現(xiàn)相同目的,比如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// myProxy.js
module.exports = (function() {
 let OriginPage = Page
 let OriginComponent = Component
 
 return (Page = function(conf) {
 conf.forEach(function(e) {
  let [methodName, methodFn] = e
 
  if (typeof methodFn === 'function') {
  conf[methodName] = function(...args) {
   // 做你想做的事,如改寫 conf 等
   methodFn.call(this, ...args)
  }
  }
 })
 return OriginPage(conf)
 })(
 (Component = function(conf) {
  const methods = conf.methods
  methods.forEach(function(e) {
  // 做你想做的事,如改寫 conf 等
  })
 
  OriginComponent(conf)
 })
 )
})()

然后在 app.tsx 中直接引入 myProxy.js 即可

(2)如何自動生成元素唯一標(biāo)識符

目前是通過埋點(diǎn)系統(tǒng)中申請下來的 eleSn 來唯一標(biāo)識元素的,如果想要自動標(biāo)識,可細(xì)分為:

  • XPath:在 pc / mobile 中還可以,但在小程序中不支持直接獲取節(jié)點(diǎn)的 XPath / 根據(jù) XPath 獲取節(jié)點(diǎn)。微信小程序可否支持通過 XPath 獲取 DOM 元素?
  • 自動獲取 組件方法名:原生小程序中,因?yàn)橹苯訑r截了 Component options 中的 methods,所以在事件觸發(fā)時可以獲取到原始的方法名,但 Taro 項(xiàng)目中不行,因?yàn)?methods 被代理了一道,事件觸發(fā)后,你看到的方法名都是 eh。
  • AST 解析源碼分析出頁面名、方法名和方法對應(yīng)的注釋來標(biāo)識元素:Taro 項(xiàng)目中目測只能用這個方法,但成本較大,且「在代碼不斷迭代后,存量數(shù)據(jù)是否還能用」也是個問題,所以筆者未做嘗試。

三、總結(jié)

本文概述了一下微信小程序(Taro)從手動埋點(diǎn)到自動埋點(diǎn)的思路。并按照頁面埋點(diǎn)(pv、分享)以及元素埋點(diǎn),分析了實(shí)現(xiàn)方式:

  • 頁面 pv:
    • 封裝 usePv,根據(jù)當(dāng)前頁面 path 從配置文件中讀取出 pageSn
    • 封裝頁面組件 WrapPage 調(diào)用 usePv()
  • 分享好友/朋友圈:自定義 useShareAppMessage、useShareTimeline,根據(jù)當(dāng)前頁面 path 從配置文件中讀取出 pageSn 和分享 eleSn,然后獲取傳入?yún)?shù)后埋點(diǎn)上報
  • 元素埋點(diǎn):提供了改寫 Component 方法來攔截事件回調(diào)的思路,但因元素唯一標(biāo)識符不能自動獲取,所以不大適合自動化埋點(diǎn)。

到此這篇關(guān)于詳解微信小程序(Taro)手動埋點(diǎn)和自動埋點(diǎn)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)小程序手動埋點(diǎn)和自動埋點(diǎn)內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://juejin.cn/post/6934900764192030733

延伸 · 閱讀

精彩推薦
  • js教程原生JavaScript實(shí)現(xiàn)留言板

    原生JavaScript實(shí)現(xiàn)留言板

    這篇文章主要為大家詳細(xì)介紹了原生JavaScript實(shí)現(xiàn)留言板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    棟棟很優(yōu)秀啊5472021-12-29
  • js教程聊一聊六個JavaScript圖表庫

    聊一聊六個JavaScript圖表庫

    作為一名前端 Web 開發(fā)人員,能夠像制作漂亮的交互式網(wǎng)頁一樣多地可視化數(shù)據(jù)是一項(xiàng)很棒的技能。這些 JavaScript 庫使這項(xiàng)任務(wù)變得更容易,因?yàn)殚_發(fā)人員...

    粵嵌教育6582022-01-12
  • js教程TypeScript類型體操:索引類型的映射再映射

    TypeScript類型體操:索引類型的映射再映射

    TypeScript 給 JavaScript 加了套靜態(tài)類型系統(tǒng)。其中,JavaScript 中的數(shù)組、對象等聚合多個元素的類型在 TypeScript 中對應(yīng)的是索引類型。...

    神光的編程秘籍7742022-01-20
  • js教程用Javascript實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼間隔功能

    用Javascript實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼間隔功能

    這篇文章主要介紹了用Javascript實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼間隔功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以...

    愛前端的茂茂9292022-01-19
  • js教程JS+CSS實(shí)現(xiàn)過渡特效

    JS+CSS實(shí)現(xiàn)過渡特效

    這篇文章主要為大家詳細(xì)介紹了JS+CSS實(shí)現(xiàn)過渡特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Dr_空山3622021-12-23
  • js教程JavaScript實(shí)現(xiàn)點(diǎn)擊切換功能

    JavaScript實(shí)現(xiàn)點(diǎn)擊切換功能

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)點(diǎn)擊切換功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    _he_dan_10442022-01-10
  • js教程js面向?qū)ο蠓绞綄?shí)現(xiàn)拖拽效果

    js面向?qū)ο蠓绞綄?shí)現(xiàn)拖拽效果

    這篇文章主要為大家詳細(xì)介紹了js面向?qū)ο蠓绞綄?shí)現(xiàn)拖拽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    web前端的清流7212022-01-25
  • js教程js屬性對象的hasOwnProperty方法的使用

    js屬性對象的hasOwnProperty方法的使用

    這篇文章主要介紹了js屬性對象的hasOwnProperty方法的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友...

    weiqinl11002022-01-17
主站蜘蛛池模板: 久久久一区二区精品 | 一区二区三区四区高清视频 | 4p一女两男做爰在线观看 | 久久久久久久亚洲精品 | 欧美福利视频一区二区三区 | 骚av在线 | 日本黄色一级电影 | 黄色一级片在线免费观看 | 美女视频黄a视频免费全过程 | 国产一级不卡毛片 | 大西瓜永久免费av在线 | 一级一级一级毛片 | 欧美人与禽性xxxxx杂性 | 香蕉视频破解 | 色成人在线 | 草妞视频 | 成人国产精品一区二区毛片在线 | 男人午夜视频 | 久久久日韩精品一区二区三区 | 三级国产网站 | 精品一区二区亚洲 | 色诱亚洲精品久久久久久 | 看一级毛片 | 精品中文字幕视频 | 黄色毛片免费视频 | 久久99国产伦子精品免费 | 最新在线中文字幕 | 福利一区二区三区视频在线观看 | 91情侣在线偷精品国产 | 亚洲影视在线 | 久久艹逼 | 国产午夜精品一区二区三区免费 | www.热| 久久久久久久国产视频 | 国产乱一区二区三区视频 | 亚洲va久久久噜噜噜久牛牛影视 | 色播视频在线播放 | 特级黄一级播放 | 欧美国产精品一区二区 | 欧美日韩免费看 | 午夜精品成人 |