小程序從手動(dòng)埋點(diǎn)到自動(dòng)埋點(diǎn)的實(shí)現(xiàn)方法
前言
小程序由于封閉性較強(qiáng),要像web應(yīng)用一樣實(shí)現(xiàn)靈活的數(shù)據(jù)收集,會(huì)有一定難度。目前開(kāi)源的埋點(diǎn)SDK,一般采用手動(dòng)埋點(diǎn)的方式,這種方式有較強(qiáng)的侵入型,為了解決這個(gè)問(wèn)題就有了該文章。
手動(dòng)埋點(diǎn)
以騰訊移動(dòng)分析的SDK為例,如果要記錄埋點(diǎn)信息,只要插入一句代碼即可
// 例如,記錄搜索行為 search(keyword) { if (keyword) { ...業(yè)務(wù)代碼 } mta.Event.stat("ico_search", {"query":keyword}); }
示例代碼看起來(lái)是比較簡(jiǎn)潔的,但是埋點(diǎn)需要收集的數(shù)據(jù)往往不是單一的,復(fù)雜的埋點(diǎn)代碼插入業(yè)務(wù)代碼,會(huì) 影響代碼的閱讀體驗(yàn) ,而且 埋點(diǎn)代碼散落在各個(gè)地方,不方便管理 。
由于手動(dòng)埋點(diǎn)必須插入到函數(shù)中,有時(shí)候我們?yōu)榱双@取頁(yè)面某一元素點(diǎn)擊信息,產(chǎn)生了一種叫無(wú)業(yè)務(wù)相關(guān)埋點(diǎn),簡(jiǎn)單來(lái)說(shuō)就是你的函數(shù)定義,就只有埋點(diǎn)代碼,當(dāng)這種埋點(diǎn)頻繁出現(xiàn), 代碼會(huì)被嚴(yán)重污染 。
// wxml <view bindtap="track">這只是一個(gè)展示view</view>
//js track() { mta.Event.stat("eleClick", {"name":xxxxx}); }
另外,由于PM會(huì)頻繁調(diào)整埋點(diǎn)信息,而 埋點(diǎn)是一個(gè)繁瑣又無(wú)聊的工作 ,基于Don't Repeat Yourself 原則,手動(dòng)埋帶要不得。
總結(jié)以上,手動(dòng)埋點(diǎn)有下列問(wèn)題
- 影響代碼的閱讀體驗(yàn)
- 埋點(diǎn)代碼散落在各個(gè)地方,不方便管理
- 代碼會(huì)被污染
- 埋點(diǎn)是一個(gè)繁瑣又無(wú)聊的工作
自動(dòng)埋點(diǎn)
實(shí)現(xiàn)思路:監(jiān)聽(tīng)用戶點(diǎn)擊-->讀取埋點(diǎn)配置JOSN,判斷是否需要上報(bào)--> 上報(bào)數(shù)據(jù)
1、小程序監(jiān)聽(tīng)用戶點(diǎn)擊行為
web應(yīng)用監(jiān)聽(tīng)用戶點(diǎn)擊行為是比較容易,但是小程序沒(méi)有提供Dom的事件監(jiān)聽(tīng),不過(guò)我們可以通過(guò)事件冒泡的方式捕獲。
// web監(jiān)聽(tīng)頁(yè)面點(diǎn)擊 document.addEventListener('click',(e) => {console.log(e)}) // 小程序監(jiān)聽(tīng)頁(yè)面點(diǎn)擊,用戶的點(diǎn)擊行為都會(huì)執(zhí)行elementTracker方法 <view catchtap='elementTracker'> <view class='buy-now'> <button bindtap='buy' animation="{{scaleAnim}}">立即購(gòu)票</button> </view> </view>
2、判斷點(diǎn)擊位置是否落在監(jiān)聽(tīng)元素中
假設(shè)需要監(jiān)聽(tīng)用戶是否點(diǎn)擊class為buy-now元素,可以通過(guò)獲取buy-now元素長(zhǎng)寬,定位和點(diǎn)擊位置坐標(biāo)判斷是否出現(xiàn)重疊,以判斷是否被點(diǎn)擊。
/** * 判斷點(diǎn)擊是否落在目標(biāo)元素 * @param {Object} clickInfo 用戶點(diǎn)擊坐標(biāo) * @param {Object} boundingClientRect 目標(biāo)元素信息 * @param {Object} scrollOffset 頁(yè)面位置信息 * @returns {Boolean} */ export const isClickTrackArea = function (clickInfo, boundingClientRect, scrollOffset) { if (!boundingClientRect) return false; const { x, y } = clickInfo.detail; // 點(diǎn)擊的x y坐標(biāo) const { left, right, top, height } = boundingClientRect; const { scrollTop } = scrollOffset; if (left < x && x < right && scrollTop + top < y && y < scrollTop + top + height) { return true; } return false; };
3、通過(guò)配置表聲明埋點(diǎn)
為了解決代碼入侵問(wèn)題,可以將所有埋點(diǎn)信息統(tǒng)一管理,通過(guò)配置表的方式,除了方便管理,以后還可以做到動(dòng)態(tài)配置,在服務(wù)端配置完畢下發(fā)到客戶端。
const tracks = { path: 'pages/film/detail', elementTracks: [ { element: '.buy-now', // 聲明需要監(jiān)聽(tīng)的元素 dataKeys: ['film.filmId'], // 聲明需要獲取Data下的哪些數(shù)據(jù) }, ] };
4、對(duì)頁(yè)面函數(shù)埋點(diǎn)
有些場(chǎng)景我們除了對(duì)頁(yè)面元素點(diǎn)擊埋點(diǎn),還要對(duì)頁(yè)面函數(shù)進(jìn)行埋點(diǎn),例如用戶下拉刷新的時(shí)候,可以對(duì)原方法進(jìn)行包裝,插入埋點(diǎn)代碼。
rewritePage() { const originPage = Page; Page = (page) => { Object.keys(page).forEach((methodName) => { // 執(zhí)行埋點(diǎn)邏輯 typeof page[methodName] === 'function' && this.recordPageFn(page, methodName); }); // 執(zhí)行原Page對(duì)象 return originPage(page); }; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用apifm-wxapi快速開(kāi)發(fā)小程序過(guò)程詳解
這篇文章主要介紹了使用apifm-wxapi快速開(kāi)發(fā)小程序過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08JavaScript 特有方法計(jì)算二進(jìn)制中1的個(gè)數(shù) split方法
這是一道網(wǎng)上看到的前端的筆試題,主要思想是利用JavaScript的toString方法將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制的字符串。然后for循環(huán)遍歷計(jì)算字符串中”1″出現(xiàn)的次數(shù)。2010-05-05關(guān)于JS中match() 和 exec() 返回值和屬性的測(cè)試
這篇文章主要介紹了關(guān)于JS中match() 和 exec() 返回值和屬性的測(cè)試 的相關(guān)資料,需要的朋友可以參考下2016-03-03微信小程序開(kāi)發(fā)之全局配置與頁(yè)面配置實(shí)現(xiàn)
本文主要介紹了微信小程序開(kāi)發(fā)之全局配置與頁(yè)面配置實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07js實(shí)現(xiàn)網(wǎng)頁(yè)收藏功能
這篇文章主要介紹了js實(shí)現(xiàn)動(dòng)態(tài)添加或刪除網(wǎng)址功能,以及js實(shí)現(xiàn)網(wǎng)頁(yè)收藏功能,感興趣的小伙伴們可以參考一下2015-12-12