久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

前端怎么埋點(diǎn)?淺析vue自定義指令進(jìn)行前端埋點(diǎn)的方法

怎么進(jìn)行前端埋點(diǎn)?下面本篇文章給大家介紹一下怎么通過Vue自定義指令實(shí)現(xiàn)前端埋點(diǎn),希望對大家有所幫助!

前端怎么埋點(diǎn)?淺析vue自定義指令進(jìn)行前端埋點(diǎn)的方法

(學(xué)習(xí)視頻分享:vue視頻教程)

在營銷活動(dòng)中,通過埋點(diǎn)可以獲取用戶的喜好及交互習(xí)慣,從而優(yōu)化流程,進(jìn)一步提升用戶體驗(yàn),提高轉(zhuǎn)化率。

在之前的埋點(diǎn)方案實(shí)現(xiàn)中,都是在具體的按鈕或者圖片被點(diǎn)擊或者被曝光時(shí)主動(dòng)通過事件去上報(bào)埋點(diǎn)。這種方法在項(xiàng)目中埋點(diǎn)比較少時(shí)還行,一旦項(xiàng)目中需要大量埋點(diǎn)時(shí),不可避免的要添加很多業(yè)務(wù)代碼。也很大程度上造成了埋點(diǎn)邏輯與業(yè)務(wù)邏輯的高耦合。

為了改造這種情況,我們對于原有的埋點(diǎn)方式做了一些小改進(jìn),使得埋點(diǎn)效率得到了極大提升。

在闡述我們的埋點(diǎn)改造之前,有必要對埋點(diǎn)的一些常識(shí)做下簡單的了解。

埋點(diǎn)上報(bào)方式都有哪些?

要知道埋點(diǎn)的類型有很多,上報(bào)的方式也是五花八門。前端常見的埋點(diǎn)方法有三種:

  • 手動(dòng)埋點(diǎn)
  • 可視化埋點(diǎn)
  • 無痕埋點(diǎn)

手動(dòng)埋點(diǎn),顧名思義就是純手動(dòng)寫代碼,調(diào)用埋點(diǎn) SDK 提供的函數(shù),在需要埋點(diǎn)的業(yè)務(wù)邏輯中添加對應(yīng)方法,上報(bào)埋點(diǎn)數(shù)據(jù)。這種也是之前一直在使用的方法。

可視化埋點(diǎn)是指通過可視化系統(tǒng)配置埋點(diǎn),這種方式接觸的不是很多,就不展開說了。

無痕埋點(diǎn),也叫自動(dòng)埋點(diǎn)、全埋點(diǎn)。即對全局所有事件和頁面加載周期進(jìn)行攔截埋點(diǎn)。

一般對哪些數(shù)據(jù)做埋點(diǎn)?

為了達(dá)到數(shù)據(jù)分析,便于后續(xù)的運(yùn)營及產(chǎn)品策略調(diào)整的目的,一般需要對以下幾點(diǎn)做埋點(diǎn)統(tǒng)計(jì):

  • 頁面埋點(diǎn):統(tǒng)計(jì)用戶進(jìn)入或者離開頁面的信息,如頁面瀏覽次數(shù)(pv)、瀏覽頁面人數(shù)(uv)、頁面停留時(shí)長、設(shè)備信息等
  • 點(diǎn)擊埋點(diǎn):統(tǒng)計(jì)用戶在頁面瀏覽過程中觸發(fā)的點(diǎn)擊事件,如按鈕、導(dǎo)航或者圖片的點(diǎn)擊次數(shù)
  • 曝光埋點(diǎn):統(tǒng)計(jì)具體元素是否得到有效曝光

需求分析

本文是基于最近項(xiàng)目中添加埋點(diǎn)的需求,我們需要的一種理想化方案是:

  • 埋點(diǎn)與業(yè)務(wù)盡量分離,埋點(diǎn)邏輯更應(yīng)該是獨(dú)立于業(yè)務(wù)的
  • 盡量不對業(yè)務(wù)代碼有侵入
  • 約定規(guī)范,通過統(tǒng)一收口來處理埋點(diǎn)邏輯

由于項(xiàng)目是Vue開發(fā)的,所以考慮使用自定義指令的方式來完成埋點(diǎn)上報(bào)。選擇自定義指令的原因也是因?yàn)樗芤欢ǔ潭壬夏茏寴I(yè)務(wù)和埋點(diǎn)解耦。

頁面埋點(diǎn)在框架層面已經(jīng)幫我們做掉了,這里主要關(guān)心的是點(diǎn)擊埋點(diǎn)和曝光埋點(diǎn)。

實(shí)現(xiàn)思路其實(shí)也很清晰:在需要埋點(diǎn)的DOM節(jié)點(diǎn)掛載特殊屬性,通過埋點(diǎn)SDK監(jiān)聽掛載了相應(yīng)屬性對應(yīng)的事件,在事件觸發(fā)時(shí)進(jìn)行埋點(diǎn)數(shù)據(jù)上報(bào)。

那么問題來了,怎么監(jiān)聽呢?

對于點(diǎn)擊事件,我們可以采用addEventListener來監(jiān)聽click事件。這很簡單。

對于元素的曝光就稍微有點(diǎn)麻煩了。

首先我們來看一下為什么需要監(jiān)測曝光:

前端怎么埋點(diǎn)?淺析vue自定義指令進(jìn)行前端埋點(diǎn)的方法

為了衡量用戶對產(chǎn)品的興趣程度,需要計(jì)算區(qū)域的點(diǎn)擊率(點(diǎn)擊次數(shù)/曝光次數(shù))。為了保證點(diǎn)擊率的準(zhǔn)確性,我們必須保證用戶真正的瀏覽到了這些產(chǎn)品(就比如上圖中最下方的機(jī)酒產(chǎn)品區(qū)域,由于需要滾動(dòng)頁面,用戶才有可能看到這一區(qū)域)。

那么怎么判斷元素出現(xiàn)在頁面的可視區(qū)域呢?

按照以往的做法:監(jiān)聽滾動(dòng)事件,通過getBoundingClientRect()方法計(jì)算監(jiān)測區(qū)域與視窗的位置,然后判斷元素是否出現(xiàn)在頁面的可視區(qū)域內(nèi)。但是由于scroll事件的頻繁觸發(fā),性能問題很大。

基于此,瀏覽器特意為我們打造了一個(gè)Intersection ObserverAPI,把性能相關(guān)的細(xì)節(jié)都處理掉,讓開發(fā)者只關(guān)心業(yè)務(wù)邏輯即可:

前端怎么埋點(diǎn)?淺析vue自定義指令進(jìn)行前端埋點(diǎn)的方法

由于用戶瀏覽頁面的不確定性,還必須要避免重復(fù)的曝光行為。這個(gè)在曝光之后,移除觀察即可。

代碼實(shí)現(xiàn)

上面的需求分析還是比較抽象,下面讓我們結(jié)合代碼來看一下最終的實(shí)現(xiàn)。

Click 類封裝

點(diǎn)擊事件的處理相對比較簡單,每次點(diǎn)擊觸發(fā)數(shù)據(jù)上報(bào)即可:

// src/directives/track/click.js import { sendUBT } from "../../utils/ctrip"  export default class Click {   add(entry) {     // console.log("entry", entry);     const traceVal = entry.el.attributes["track-params"].value     const traceKey = entry.el.attributes["trace-key"].value     const { clickAction, detail } = JSON.parse(traceVal)     const data = {       action: clickAction,       detail,     }     entry.el.addEventListener("click", function() {       console.log("上報(bào)點(diǎn)擊埋點(diǎn)", JSON.parse(traceVal))       console.log("埋點(diǎn)key", traceKey)       sendUBT(traceKey, data)     })   } }

Exposure 類封裝

曝光的相對復(fù)雜一些。

首先通過new IntersectionObserver() 實(shí)例化一個(gè)全局_observer,如果得到有效曝光的(這里當(dāng)元素出現(xiàn)一半以上則進(jìn)行曝光),就去獲取 DOM 節(jié)點(diǎn)上的trace-key(埋點(diǎn) key)和track-params(埋點(diǎn) value)。

// src/directives/track/exposure.js import "intersection-observer" import { sendUBT } from "../../utils/ctrip"  // 節(jié)流時(shí)間調(diào)整,默認(rèn)100ms IntersectionObserver.prototype["THROTTLE_TIMEOUT"] = 300  export default class Exposure {   constructor() {     this._observer = null     this.init()   }    init() {     const self = this      // 實(shí)例化監(jiān)聽     this._observer = new IntersectionObserver(       function(entries, observer) {         entries.forEach((entry) => {           // 出現(xiàn)在視窗內(nèi)           if (entry.isIntersecting) {             // 獲取參數(shù)             // console.log("埋點(diǎn)節(jié)點(diǎn)", entry.target.attributes);             const traceKey = entry.target.attributes["trace-key"].value             const traceVal = entry.target.attributes["track-params"].value             console.log("traceKey", traceKey)             console.log("traceVal", traceVal)              const { exposureAction, detail } = JSON.parse(traceVal)             const data = {               action: exposureAction,               detail,             }              // 曝光之后取消觀察             self._observer.unobserve(entry.target)                self.track(traceKey, data)           }         })       },       {         root: null,         rootMargin: "0px",         threshold: 0.5, // 元素出現(xiàn)面積,0 - 1,這里當(dāng)元素出現(xiàn)一半以上則進(jìn)行曝光       }     )   }    /**    * 元素添加監(jiān)聽    *    * @param {*} entry    * @memberof Exposure    */   add(entry) {     this._observer && this._observer.observe(entry.el)   }    /**    * 埋點(diǎn)上報(bào)    *    * @memberof Exposure    */   track(traceKey, traceVal) {     // console.log("曝光埋點(diǎn)", traceKey, JSON.parse(traceVal));     sendUBT(traceKey, traceVal)   }  }

指令封裝

有了點(diǎn)擊和曝光類,下一步就是 Vue 指令的封裝了,也是之所以能實(shí)現(xiàn)半自動(dòng)埋點(diǎn)的核心。

這里存在一個(gè)場景就是對于同一個(gè)按鈕或者圖片,同時(shí)存在既需要點(diǎn)擊埋點(diǎn)又需要曝光埋點(diǎn)的場景。所以在指令的設(shè)計(jì)時(shí)支持了單獨(dú)傳入和同時(shí)傳入的場景:

  • v-track:click|exposure
  • v-track:exposure
// src/directives/track/index.js import Vue from "vue" import Click from "./click" import Exposure from "./exposure"  // 實(shí)例化曝光和點(diǎn)擊 const exp = new Exposure() const cli = new Click()  Vue.directive("track", {   bind(el, binding) {     // 獲取指令參數(shù)     const { arg } = binding     arg.split("|").forEach((item) => {       // 點(diǎn)擊       if (item === "click") {         cli.add({ el })       } else if (item === "exposure") {         exp.add({ el })       }     })   }, })

同時(shí)需要在src/index.js引入即可:

import "./directives/track"

使用

在需要埋點(diǎn)的地方使用也是很簡單的:

<img   ref="imageDom"   trace-key="o_img"   v-track:click|exposure   :track-params="     JSON.stringify({       exposureAction: 's_pictures',       clickAction: 'c_pictures',       detail: {         value: '測試',       },     })   " />

不足

通過Vue自定義指令的一個(gè)簡單封裝,業(yè)務(wù)代碼和埋點(diǎn)代碼就達(dá)到了一定的解耦,相較之前,無論是埋點(diǎn)的開發(fā)成本還是維護(hù)成本都降低了很多。

但是這也只是一個(gè)最簡單的實(shí)現(xiàn),還有很多情況需要考慮:

  • 曝光時(shí)頻次很高,是否可以考慮批量上報(bào)?
  • 用戶訪問一半頁面,突然切出,之后又重新進(jìn)入,這種情況埋點(diǎn)又該如何上報(bào)?
  • 用戶設(shè)備不支持Intersection ObserverAPI 情況,是否要考慮向下兼容?

鑒于這套埋點(diǎn)方案還在不斷完善中,等后續(xù)完善并在業(yè)務(wù)中落地平穩(wěn)運(yùn)行后。我再分享其中的細(xì)節(jié)給到大家。

【相關(guān)視頻教程推薦:vuejs入門教程、web前端入門】

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
99riav1国产精品视频| 狠狠色狠狠色综合日日tαg| 国产精品yjizz视频网| 日本va欧美va精品| 91精品99| 久久蜜桃av| 亚洲天堂免费电影| 国产精品va视频| 欧美亚洲专区| 美美哒免费高清在线观看视频一区二区| av亚洲一区二区三区| 加勒比视频一区| 日本中文字幕不卡| 麻豆亚洲精品| 免费av一区| 色吊丝一区二区| 日韩av一二三| 丝袜美腿高跟呻吟高潮一区| 久久国产主播| 欧洲亚洲一区二区三区| 国产成人精品一区二区三区视频| 国产精品videossex久久发布| 日本欧美大码aⅴ在线播放| 亚洲欧美成人综合| 日韩一区二区免费看| 午夜精品一区二区三区国产| 激情欧美一区二区三区| 久久久久99| 日本精品在线中文字幕| 精品视频一区二区三区在线观看 | 欧美亚洲精品在线| 在线视频观看日韩| 免费黄色成人| 国产精品试看| 亚洲网址在线观看| 日韩中文字幕无砖| 日本a口亚洲| 国产亚洲欧美日韩在线观看一区二区| 欧美一区免费| 国产精品分类| 成人亚洲一区| 久久av网址| 国产成人精品三级高清久久91| 久久成人福利| 日韩伦理在线一区| 亚洲五月婷婷| 亚洲一区二区成人| 亚洲人成网77777色在线播放| 日韩欧美2区| 久久成人高清| 色婷婷精品视频| 亚洲黑丝一区二区| 视频在线观看一区二区三区| 日韩一区二区三免费高清在线观看 | 久久精品午夜| 97精品中文字幕| 婷婷中文字幕一区| 综合一区二区三区| 欧美国产日本| 色天使综合视频| 精品一区三区| 亚洲欧美专区| 欧美激情精品| 香蕉人人精品| 亚洲欧美日韩国产一区| 欧美片第1页综合| 日韩av在线播放网址| 午夜欧美精品久久久久久久| 日本在线一区二区三区| 国产精品探花在线观看| 最近高清中文在线字幕在线观看1| 蜜桃一区二区三区| 日韩和欧美一区二区| 国产精品一国产精品| 欧美一级二区| 亚洲性图久久| 国产精品乱战久久久| 欧美日韩四区| 福利在线一区| 亚洲伊人精品酒店| 91精品韩国| 国产精品啊v在线| 中文字幕成人| 99国产一区| 久久久久免费av| 麻豆视频观看网址久久| 亚洲精品在线二区| 亚洲国产影院| 日韩免费在线| 麻豆免费精品视频| 日本国产一区| 蜜乳av另类精品一区二区| 日韩精品一区二区三区免费观影 | 亚洲综合婷婷| 国产精品99免费看| 成人综合一区| 国产精品日韩精品在线播放| 亚洲人成亚洲精品| 欧美女激情福利| 亚洲va在线| 在线亚洲人成| 都市激情国产精品| 成人黄色av| 久久av电影| 国产日产精品_国产精品毛片| 综合激情视频| 视频在线观看国产精品| 午夜精品免费| 黄色成人在线网址| 亚洲国产综合在线看不卡| 蜜臀久久精品| 欧美日韩精品免费观看视完整| 国产一区二区精品福利地址| 国产精品videossex久久发布| 18国产精品| 欧美天堂一区| 国产免费av一区二区三区| 国产日韩免费| 欧美日韩一区二区三区四区在线观看 | 久久国产毛片| 亲子伦视频一区二区三区| 欧美精品日日操| 91精品一区国产高清在线gif | 成人免费电影网址| 亚洲精品在线影院| 久久精品青草| 亚洲高清久久| 在线午夜精品| 午夜宅男久久久| 亚洲婷婷丁香| 日韩国产精品久久久久久亚洲| 日韩黄色在线观看| 奇米亚洲欧美| 国产亚洲精品美女久久 | 樱桃视频成人在线观看| 在线人成日本视频| 日韩成人高清| 欧美日韩国产高清电影| 亚洲精品小说| 蜜臀av一区二区三区| 日韩视频一二区| 国产精品亚洲综合久久| 精品国产网站| 久久久久国产精品一区三寸| 亚洲成人av观看| 红桃视频欧美| 亚洲精品在线二区| 国产精品视频一区视频二区| 国产在线观看91一区二区三区| 夜鲁夜鲁夜鲁视频在线播放| 亚洲精品在线观看91| 亚洲日韩中文字幕一区| 国产精品激情| 涩涩av在线| 狠狠爱成人网| 日韩不卡一二三区| 激情中国色综合| 亚洲香蕉网站| 亚洲开心激情| 免费在线观看一区| 蜜臀久久精品| 快she精品国产999| 国产亚洲高清一区| 日韩精品电影| 一区二区三区网站| 久久亚洲人体| 欧美va天堂在线| 热久久久久久| 欧美精品资源| 亚洲va久久久噜噜噜久久| 精品国产精品久久一区免费式| 999久久久精品国产| 涩涩涩久久久成人精品| 国产一区国产二区国产三区 | 精品三级av| 欧美特黄视频| 国产精品亚洲成在人线| 激情综合自拍| 欧美日韩一区二区三区四区在线观看 | 日韩中文字幕视频网| 成人精品国产亚洲| 人人爽香蕉精品| 国产成人精品免费视| 免费在线观看视频一区| 国产精品18| 欧美精品一区二区久久| 国产欧美精品| 好吊一区二区三区| 麻豆国产精品| 丝袜美腿亚洲色图| 色婷婷综合网| 日韩一区二区三区精品| 久久天堂精品| 国产精品sm| 午夜在线播放视频欧美| 久久uomeier| 国产探花在线精品| 在线综合欧美| 欧美日韩免费观看视频| 日韩av成人高清|