本文介紹了針對vue的聲明式埋點,如何作vue的聲明式埋點,使用方便,與腳本邏輯解耦,目前應用在斑馬和捕手等衆多平臺html
目前現有的埋點方案有命令式埋點、聲明式埋點、可視化埋點、無痕埋點前端
本埋點應用在電商平臺,要埋的點比較繁多善變,使用聲明式埋點是比較合適的vue
vue中提供了自定義指令,在模版元素中插入自定義指令,能夠跟蹤元素的結構變化,跟蹤數據變化,比DOM的data屬性更加方便抓取跟蹤git
按照官方文檔一個指令定義對象提供以下幾個鉤子函數:github
指令鉤子函數會被傳入如下參數:後端
其中bind和update是比較重要的兩個鉤子函數,它能跟蹤DOM的出現和變化,獲取數據並數據上報埋點,具體的代碼以下:數組
Vue.directive('bury-click', {
bind(el, binding) {
_ga.buryClick(el, binding)
},
update(el, binding) {
_ga.buryClickUpdate(el, binding)
},
unbind(el) {
_ga.cancelBuryClick(el)
}
})
複製代碼
整個指令的生命週期以及埋點的數據收集方式以下圖所示緩存
根據現有的埋點需求,主要實現了頁面曝光、坑位曝光、坑位點擊三種形式app
針對以上三種狀況,不入侵業務的腳本邏輯,制定了三個自定義指令v-page-exposure、v-exposure、v-bury-click函數
<div class="root" v-page-exposure="'1.1.0.0'"></div>
複製代碼
如代碼指令所示,a.b.c.d分別爲應用代碼.頁面代碼.模塊代碼.坑位代碼,就是埋點統計須要的代碼信息,把信息收集上報便可。須要注意的是指令信息是一個js表達式,若是不加引號會默認執行js變成一個對象取值報錯。
<div v-exposure="{gcms:[{type:1, uri:22},{type:2, uri:41}],seq:[1],spm:'1.0.0.0'}"></div>
複製代碼
坑位曝光收集的是一個js對象,包含一些坑位的代碼信息、位置信息、商品信息、跳轉信息等。坑位曝光采用實時上報,且曝光一次就再也不曝光,因此每次bind的時候把全部曝光坑位收集在一個數組,坑位出如今用戶可視範圍內一次就上報彈出數組,具體的代碼以下:
buryExposure(el, binding) {
this.exposureList.push({
el,
binding: binding.value
})
}
exposure() {
if (this.exposureList.length !== 0) {
for (let i = 0; i < this.exposureList.length; i++) {
let item = this.exposureList[i]
const currTop = item.el.getBoundingClientRect().top + window.pageYOffset
const scrollTop = document.documentElement.scrollTop
// 修正5像素的誤差
if (currTop + 5 >= scrollTop && currTop < (scrollTop + window.innerHeight)) {
// 發送曝光事件
if (isWebview) {
this.appAction()
} else {
this.action()
}
this.exposureList.splice(i, 1)
i--
}
}
}
}
複製代碼
<div v-bury-click="JSON.stringify({gcms:[{type:1, uri:22},{type:2, uri:41}],spm:'1.0.0.0'})"></div>
複製代碼
坑位點擊也是一個js對象,包含坑位的各類信息,在頁面加載的時候綁定點擊事件,用戶點擊的時候上報埋點。在實際使用過程當中埋點須要跟蹤最新的數據信息,好比在加入購物車的環節中,加入購物車的按鈕是同一個不變,但下一次選擇商品的信息可能發生改變,因此每次點擊按鈕須要傳遞最新的埋點信息。因爲指令信息是一個js表達式,對象是一個引用類型,改變對象的值不會觸發update鉤子函數,因此須要JSON字符串化一下。具體的代碼以下:
buryClick(el, binding) {
el.addEventListener('click', this.click.bind(this, el))
}
click(el) {
...
this.gaData.ext = encodeURIComponent(JSON.stringify({ eventId: '2', ...value }))
if (isWebview) {
this.appAction()
} else {
this.action()
}
}
複製代碼
除了埋點點位信息以外,還須要一些經常使用的基礎信息,好比用戶信息、系統信息、會話信息、端信息等等,都是能夠經過頁面初次加載的時候收集。另外還須要驗證埋點請求,要在業務請求頭中埋入埋點的信息,這些信息只存在於埋點的緩存中,因而就重寫XHR和fetch請求,在每次發送請求前加入須要的埋點信息,與業務解耦。