目錄
埋點上報方式都有哪些?
一般對哪些資料做埋點?
需求分析
程式碼實作
Click 類別封裝
Exposure 類封裝
指令封裝
使用
不足
首頁 web前端 Vue.js 前端怎麼埋點?淺析vue自訂指令進行前端埋點的方法

前端怎麼埋點?淺析vue自訂指令進行前端埋點的方法

Jul 14, 2022 pm 08:44 PM
vue

怎麼進行前端埋點?以下這篇文章跟大家介紹一下怎麼透過Vue自訂指令實現前端埋點,希望對大家有幫助!

前端怎麼埋點?淺析vue自訂指令進行前端埋點的方法

(學習影片分享:vue影片教學

在行銷活動中,透過埋點可以取得使用者的喜好及互動習慣,進而優化流程,進一步提升使用者體驗,提升轉換率。

在先前的埋點方案實作中,都是在具體的按鈕或圖片被點擊或是被曝光時主動透過事件去上報埋點。這種方法在專案中埋點比較少時還行,一旦專案中需要大量埋點時,不可避免的要增加許多業務程式碼。也很大程度造成了埋點邏輯與業務邏輯的高耦合。

為了改造這個情況,我們對於原有的埋點方式做了一些小改進,使得埋點效率得到了極大提升。

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

埋點上報方式都有哪些?

要知道埋點的類型很多,上報的方式也是五花八門。前端常見的埋點方法有三種:

  • 手動埋點
  • 可視化埋點
  • 無痕埋點

手動埋點,顧名思義就是純手動寫程式碼,呼叫埋點SDK 提供的函數,在需要埋點的業務邏輯中加入對應方法,上報埋點資料。這種也是之前一直在使用的方法。

視覺化埋點是指透過視覺化系統配置埋點,這種方式接觸的不是很多,就不展開說了。

無痕埋點,也叫自動埋點、全埋點。即對全域所有事件和頁面載入週期進行攔截埋點。

一般對哪些資料做埋點?

為了達到資料分析,便於後續的營運及產品策略調整的目的,一般需要對以下幾點做埋點統計:

  • 頁埋:統計使用者進入或離開頁面的訊息,如頁面瀏覽次數(pv)、瀏覽頁面人數(uv)、頁面停留時間、裝置資訊等
  • 點擊埋點:統計使用者在頁面瀏覽過程中觸發的點擊事件,如按鈕、導航或圖片的點擊次數
  • 曝光埋點:統計具體元素是否有效曝光

需求分析

#本文是基於最近專案中添加埋點的需求,我們需要的一種理想化方案是:

  • #埋點與業務盡量分離,埋點邏輯更應該是獨立於業務的
  • 盡量不對業務代碼有侵入
  • 約定規範,透過統一收口來處理埋點邏輯

由於專案是Vue開發的,所以考慮使用自訂指令的方式來完成埋點上報。選擇自訂指令的原因也是因為他能一定程度上能讓業務和埋點解耦。

頁面埋點在框架層面已經幫我們做掉了,這裡主要關心的是點擊埋點和曝光埋點。

實現想法其實也很清晰:在需要埋點的DOM節點掛載特殊屬性,透過埋點SDK監聽掛載了對應屬性對應的事件,在事件觸發時進行埋點資料回報。

那麼問題來了,怎麼監聽呢?

對於點擊事件,我們可以採用addEventListener來監聽click事件。這很簡單。

對於元素的曝光就稍微有點麻煩了。

首先我們來看看為什麼需要監控曝光:

前端怎麼埋點?淺析vue自訂指令進行前端埋點的方法

為了衡量使用者對產品的興趣程度,需要計算區域的點擊率(點擊次數/曝光次數)。為了確保點擊率的準確性,我們必須確保用戶真正的瀏覽到了這些產品(就比如上圖中最下方的機酒產品區域,由於需要滾動頁面,用戶才有可能看到這一區域)。

那麼要怎麼判斷元素出現在頁面的視覺區域呢?

依照以往的做法:監聽捲動事件,透過getBoundingClientRect()方法計算監控區域與視窗的位置,然後判斷元素是否出現在頁面的視覺區域內。但是由於scroll事件的頻繁觸發,性能問題很大。

基於此,瀏覽器特意為我們打造了一個Intersection ObserverAPI,把效能相關的細節都處理掉,讓開發者只關心業務邏輯即可:

前端怎麼埋點?淺析vue自訂指令進行前端埋點的方法

由於使用者瀏覽頁面的不確定性,也必須避免重複的曝光行為。這個在曝光之後,移除觀察即可。

程式碼實作

上面的需求分析還是比較抽象,以下讓我們結合程式碼來看一下最終的實作。

Click 類別封裝

點擊事件的處理相對比較簡單,每次點擊觸發資料回報即可:

// 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("上报点击埋点", JSON.parse(traceVal))
      console.log("埋点key", traceKey)
      sendUBT(traceKey, data)
    })
  }
}
登入後複製

Exposure 類封裝

曝光的相對複雜。

首先透過new IntersectionObserver() 實例化一個全域_observer,如果得到有效曝光的(這裡當元素出現一半以上則進行曝光),就去獲取DOM 節點上的trace-key(埋點key)和track-params(埋點value)。

// src/directives/track/exposure.js
import "intersection-observer"
import { sendUBT } from "../../utils/ctrip"

// 节流时间调整,默认100ms
IntersectionObserver.prototype["THROTTLE_TIMEOUT"] = 300

export default class Exposure {
  constructor() {
    this._observer = null
    this.init()
  }

  init() {
    const self = this

    // 实例化监听
    this._observer = new IntersectionObserver(
      function(entries, observer) {
        entries.forEach((entry) => {
          // 出现在视窗内
          if (entry.isIntersecting) {
            // 获取参数
            // console.log("埋点节点", 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, // 元素出现面积,0 - 1,这里当元素出现一半以上则进行曝光
      }
    )
  }

  /**
   * 元素添加监听
   *
   * @param {*} entry
   * @memberof Exposure
   */
  add(entry) {
    this._observer && this._observer.observe(entry.el)
  }

  /**
   * 埋点上报
   *
   * @memberof Exposure
   */
  track(traceKey, traceVal) {
    // console.log("曝光埋点", traceKey, JSON.parse(traceVal));
    sendUBT(traceKey, traceVal)
  }

}
登入後複製

指令封裝

有了點擊和曝光類,下一步就是 Vue 指令的封裝了,也是之所以能實現半自動埋點的核心。

這裡存在一個場景就是對於同一個按鈕或圖片,同時存在著既需要點擊埋點又需要曝光埋點的場景。所以在指令的設計時支援了單獨傳入和同時傳入的場景:

  • v-track:click|exposure
  • v -track:exposure
// src/directives/track/index.js
import Vue from "vue"
import Click from "./click"
import Exposure from "./exposure"

// 实例化曝光和点击
const exp = new Exposure()
const cli = new Click()

Vue.directive("track", {
  bind(el, binding) {
    // 获取指令参数
    const { arg } = binding
    arg.split("|").forEach((item) => {
      // 点击
      if (item === "click") {
        cli.add({ el })
      } else if (item === "exposure") {
        exp.add({ el })
      }
    })
  },
})
登入後複製

同時需要在src/index.js引進即可:

import "./directives/track"
登入後複製

使用

#在需要埋點的地方使用也是很簡單的:

<img
  ref="imageDom"
  trace-key="o_img"
  v-track:click|exposure
  :track-params="
    JSON.stringify({
      exposureAction: &#39;s_pictures&#39;,
      clickAction: &#39;c_pictures&#39;,
      detail: {
        value: &#39;测试&#39;,
      },
    })
  "
/>
登入後複製

不足

透過Vue自訂指令的一個簡單封裝,業務程式碼和埋點程式碼就達到了一定的解耦,相較之前,無論是埋點的開發成本還是維護成本都降低了很多。

但這也只是一個最簡單的實現,還有很多情況要考慮:

  • 曝光時頻次很高,是否可以考慮批次上報?
  • 用戶造訪一半頁面,突然切出,之後又重新進入,這種情況埋點又該如何上報?
  • 使用者裝置不支援Intersection ObserverAPI 情況,是否要考慮向下相容?

#鑑於這套埋藏點方案還在不斷完善中,等後續完善並在業務中落地平穩運行後。我再分享其中的細節給大家。

【相關影片教學推薦:vuejs入門教學web前端入門

以上是前端怎麼埋點?淺析vue自訂指令進行前端埋點的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vue怎麼給按鈕添加函數 vue怎麼給按鈕添加函數 Apr 08, 2025 am 08:51 AM

可以通過以下步驟為 Vue 按鈕添加函數:將 HTML 模板中的按鈕綁定到一個方法。在 Vue 實例中定義該方法並編寫函數邏輯。

vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

vue.js怎麼引用js文件 vue.js怎麼引用js文件 Apr 07, 2025 pm 11:27 PM

在 Vue.js 中引用 JS 文件的方法有三種:直接使用 &lt;script&gt; 標籤指定路徑;利用 mounted() 生命週期鉤子動態導入;通過 Vuex 狀態管理庫進行導入。

vue中的watch怎麼用 vue中的watch怎麼用 Apr 07, 2025 pm 11:36 PM

Vue.js 中的 watch 選項允許開發者監聽特定數據的變化。當數據發生變化時,watch 會觸發一個回調函數,用於執行更新視圖或其他任務。其配置選項包括 immediate,用於指定是否立即執行回調,以及 deep,用於指定是否遞歸監聽對像或數組的更改。

vue返回上一頁的方法 vue返回上一頁的方法 Apr 07, 2025 pm 11:30 PM

Vue.js 返回上一頁有四種方法:$router.go(-1)$router.back()使用 &lt;router-link to=&quot;/&quot;&gt; 組件window.history.back(),方法選擇取決於場景。

vue多頁面開發是啥意思 vue多頁面開發是啥意思 Apr 07, 2025 pm 11:57 PM

Vue 多頁面開發是一種使用 Vue.js 框架構建應用程序的方法,其中應用程序被劃分為獨立的頁面:代碼維護性:將應用程序拆分為多個頁面可以使代碼更易於管理和維護。模塊化:每個頁面都可以作為獨立的模塊,便於重用和替換。路由簡單:頁面之間的導航可以通過簡單的路由配置來管理。 SEO 優化:每個頁面都有自己的 URL,這有助於搜索引擎優化。

怎樣查詢vue的版本 怎樣查詢vue的版本 Apr 07, 2025 pm 11:24 PM

可以通過以下方法查詢 Vue 版本:使用 Vue Devtools 在瀏覽器的控制台中查看“Vue”選項卡。使用 npm 運行“npm list -g vue”命令。在 package.json 文件的“dependencies”對像中查找 Vue 項。對於 Vue CLI 項目,運行“vue --version”命令。檢查 HTML 文件中引用 Vue 文件的 &lt;script&gt; 標籤中的版本信息。

vue怎麼用函數截流 vue怎麼用函數截流 Apr 08, 2025 am 06:51 AM

Vue 中的函數截流是一種技術,用於限制函數在指定時間段內被調用的次數,防止性能問題。實現方法為:導入 lodash 庫:import { debounce } from 'lodash';使用 debounce 函數創建截流函數:const debouncedFunction = debounce(() =&gt; { / 邏輯 / }, 500);調用截流函數,控制函數在 500 毫秒內最多被調用一次。

See all articles