最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue項目前端埋點(diǎn)的實現(xiàn)

 更新時間:2019年03月06日 14:41:31   作者:penjoyer  
這篇文章主要介紹了vue項目前端埋點(diǎn)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

埋點(diǎn)方案的確定。業(yè)界的埋點(diǎn)方案主要分為以下三類:

  • 代碼埋點(diǎn):在需要埋點(diǎn)的節(jié)點(diǎn)調(diào)用接口,攜帶數(shù)據(jù)上傳。如百度統(tǒng)計等;
  • 可視化埋點(diǎn):使用可視化工具進(jìn)行配置化的埋點(diǎn),即所謂的「無痕埋點(diǎn)」,前端在頁面加載時,可以讀取配置數(shù)據(jù),自動調(diào)用接口進(jìn)行埋點(diǎn)。如開源的Mixpanel;
  • 無埋點(diǎn):前端自動采集全部事件并上報埋點(diǎn)數(shù)據(jù)。如國內(nèi)的神策數(shù)據(jù)等;

在當(dāng)時排期緊湊,人力緊缺的情況下,顯然不允許我們?nèi)ラ_發(fā)可視化埋點(diǎn)方案和無埋點(diǎn)方案,所以只能采取代碼埋點(diǎn)方案。

命令式埋點(diǎn)

命令式埋點(diǎn),顧名思義,開發(fā)者需要手動在需要埋點(diǎn)的節(jié)點(diǎn)處進(jìn)行埋點(diǎn)。如點(diǎn)擊按鈕或鏈接后的回調(diào)函數(shù)、頁面ready時進(jìn)行請求的發(fā)送。大家肯定都很熟悉這樣的代碼:

// 頁面加載時發(fā)送埋點(diǎn)請求
$(document).ready(function(){
  // ... 這里存在一些業(yè)務(wù)邏輯
  sendRequest(params);
});
// 按鈕點(diǎn)擊時發(fā)送埋點(diǎn)請求
$('button').click(function(){
  // ... 這里存在一些業(yè)務(wù)邏輯
  sendRequest(params);
});

可以很容易發(fā)現(xiàn),這樣的做法很有可能會將埋點(diǎn)代碼侵入業(yè)務(wù)代碼,這使整體業(yè)務(wù)代碼變得繁瑣,容易出錯,且后續(xù)代碼會愈加膨脹,難以維護(hù)。所以,我們需要讓埋點(diǎn)的代碼與具體的業(yè)務(wù)邏輯解耦,即 聲明式埋點(diǎn) ,從而提高埋點(diǎn)的效率和代碼的可維護(hù)性。

聲明式埋點(diǎn)

理論上,聲明式埋點(diǎn)只需要關(guān)注兩個問題:

  • 需要埋點(diǎn)的DOM節(jié)點(diǎn);
  • 所需攜帶的數(shù)據(jù)

因此,可以很快想出一個聲明式埋點(diǎn)的方法:

// key表示埋點(diǎn)的唯一標(biāo)識;act表示埋點(diǎn)方式
<button data-stat="{key:'111', act: 'click'}">埋點(diǎn)</button>

那么可以去遍歷DOM樹,找到 [data-stat] 的節(jié)點(diǎn),給這個button綁上click事件,把這些參數(shù)在回調(diào)函數(shù)中通過請求發(fā)出去。

在DOM節(jié)點(diǎn)(html)上聲明埋點(diǎn),與業(yè)務(wù)邏輯(通常在Javascript文件中)就解耦了。調(diào)用也很方便。

看起來很美,但這樣就能解決問題了嗎?顯然是不夠的。還需要解決以下問題:

  • 遍歷DOM樹的時機(jī)問題,一個簡單的例子,一個表格的行數(shù)據(jù)是通過異步加載,而表格行中的操作按鈕需要埋點(diǎn),那么在DOM ready的時候去遍歷,顯然是無法找到的
  • 綁定埋點(diǎn)事件次數(shù)的問題,怎樣保證埋點(diǎn)事件不會被重復(fù)綁定到元素上,一次操作發(fā)了N個埋點(diǎn)請求?
  • 如何處理特有的埋點(diǎn)行為,如頁面展現(xiàn)埋點(diǎn),區(qū)域展現(xiàn)埋點(diǎn)?
  • 如何在解綁時,銷毀已綁定的事件?

1.自定義指令實現(xiàn)埋點(diǎn)數(shù)據(jù)統(tǒng)計

在項目中通常需要做數(shù)據(jù)埋點(diǎn),這個時候,使用自定義指令將會變非常簡單

在項目入口文件 main.js 中配置我們的自定義指令

// 坑位埋點(diǎn)指令
Vue.directive('stat', {
 bind(el, binding) {
  el.addEventListener('click', () => {
   const data = binding.value;
   let prefix = 'store';
   if (OS.isAndroid || OS.isPhone) {
    prefix = 'mall';
   }
   analytics.request({
    ty: `${prefix}_${data.type}`,
    dc: data.desc || ''
   }, 'n');
  }, false);
 }
});

2.使用路由攔截統(tǒng)計頁面級別的 PV

由于第一次在單頁應(yīng)用中嘗試數(shù)據(jù)埋點(diǎn),在項目上線一個星期之后,數(shù)據(jù)統(tǒng)計后臺發(fā)現(xiàn),首頁的 PV 遠(yuǎn)遠(yuǎn)高于其它頁面,數(shù)據(jù)很不正常。后來跟數(shù)據(jù)后臺的人溝通詢問他們的埋點(diǎn)統(tǒng)計原理之后,才發(fā)現(xiàn)其中的問題所在。

傳統(tǒng)應(yīng)用,一般都在頁面加載的時候,會有一個異步的 js 加載,就像百度的統(tǒng)計代碼類似,所以我們每個頁面的加載的時候,都會統(tǒng)計到數(shù)據(jù);然而在單頁應(yīng)用,頁面加載初始化只有一次,所以其它頁面的統(tǒng)計數(shù)據(jù)需要我們自己手動上報

解決方案

使用 vue-router 的 beforeEach 或者 afterEach 鉤子上報數(shù)據(jù),具體使用哪個最好是根據(jù)業(yè)務(wù)邏輯來選擇。

const analyticsRequest = (to, from) => {
 // 只統(tǒng)計頁面跳轉(zhuǎn)數(shù)據(jù),不統(tǒng)計當(dāng)前頁 query 不同的數(shù)據(jù)
 // 所以這里只使用了 path, 如果需要統(tǒng)計 query 的,可以使用 to.fullPath
 if (to.path !== from.path) {
  analytics.request({
   url: `${location.protocol}//${location.host}${to.path}`
  });
 }
};

router.beforeEach((to, from, next) => {
 if (to.matched.some(record => record.meta.requiresAuth)) {
  // 這里做登錄等前置邏輯判斷
  // 判斷通過之后,再上報數(shù)據(jù)
  ...
  analyticsRequest(to, from);
 } else {
  // 不需要判斷的,直接上報數(shù)據(jù)
  analyticsRequest(to, from);
  next();
 }
});

在組件中使用我們的自定義指令

基于 jquery + widget 的老項目,

那么在這些項目中的DOM操作是jquery甚至原生DOM API來實現(xiàn),Vue的自定義指令就無法工作

基于MutationObserver API的Mixin

MutationObserver是在DOM3標(biāo)準(zhǔn)中提出的標(biāo)準(zhǔn)API,提供讓開發(fā)者感知到在某一個DOM節(jié)點(diǎn)變更的能力。可以監(jiān)聽以下場景:

  • childList: 目標(biāo)節(jié)點(diǎn)的子節(jié)點(diǎn)插入刪除引起的變更
  • attributes: 目標(biāo)節(jié)點(diǎn)屬性改變引起的變更
  • characterData: 目標(biāo)節(jié)點(diǎn)的文本節(jié)點(diǎn)改變引起的變更,如通過appendData()等
  • subtree: 目標(biāo)節(jié)點(diǎn)的子孫節(jié)點(diǎn)改變引起的變更
  • attributeOldValue:當(dāng)attribute監(jiān)聽被設(shè)定為true時,可以記錄改變前的屬性值
  • characterDataOldValue:當(dāng)characterData監(jiān)聽被設(shè)定為true時,可以記錄改變前的屬性值
  • attributeFilter:可以設(shè)定需要監(jiān)聽的屬性列表

但為了保證MutationObserver可以在所有瀏覽器上正常工作,我們?nèi)匀灰肓诉@個API的polyfill,詳情可見這里

在此能力的前提下,我們就可以在任意的DOM操作下觸發(fā)Vue進(jìn)行重新解析指令。

我們將 MutationObserver 封裝進(jìn)一個 Vue mixin , 非Vue應(yīng)用的業(yè)務(wù)代碼只需要引入這個mixin,這樣也可以很好地解耦。
詳細(xì)的實現(xiàn)原理可以見以下偽代碼:

let observer;
export default {
 ready() {
  // 開啟監(jiān)聽
  observer = new MutationObserver(mutations => {
   this.$compile(this.$el);
  });
  observer.observe(this.$el, config);
 },
 destroyed() {
  // 清理工作
  observer.disconnect();
  observer.takeRecords();
 }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • element-ui?el-upload實現(xiàn)上傳文件及簡單的上傳文件格式驗證功能

    element-ui?el-upload實現(xiàn)上傳文件及簡單的上傳文件格式驗證功能

    前端上傳文件后,后端接受文件進(jìn)行處理后直接返回處理后的文件,前端直接再將文件下載下來,下面這篇文章主要給大家介紹了關(guān)于element-ui?el-upload實現(xiàn)上傳文件及簡單的上傳文件格式驗證功能的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Vue3初始化如何調(diào)用函數(shù)

    Vue3初始化如何調(diào)用函數(shù)

    這篇文章主要介紹了Vue3初始化如何調(diào)用函數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Vue2實現(xiàn)圖片的拖拽,縮放和旋轉(zhuǎn)效果的示例代碼

    Vue2實現(xiàn)圖片的拖拽,縮放和旋轉(zhuǎn)效果的示例代碼

    這篇文章主要為大家介紹了如何基于vue2?實現(xiàn)圖片的拖拽、旋轉(zhuǎn)、鼠標(biāo)滾動放大縮小等功能。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-11-11
  • 淺談vue中$event理解和框架中在包含默認(rèn)值外傳參

    淺談vue中$event理解和框架中在包含默認(rèn)值外傳參

    這篇文章主要介紹了淺談vue中$event理解和框架中在包含默認(rèn)值外傳參,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vue3?+?async-validator實現(xiàn)表單驗證的示例代碼

    vue3?+?async-validator實現(xiàn)表單驗證的示例代碼

    表單驗證可以有效的過濾不合格的數(shù)據(jù),減少服務(wù)器的開銷,并提升用戶的使用體驗,今天我們使用?vue3?來做一個表單驗證的例子,需要的朋友跟隨小編一起學(xué)習(xí)下吧
    2022-06-06
  • Vue中CSS動畫原理的實現(xiàn)

    Vue中CSS動畫原理的實現(xiàn)

    這篇文章主要介紹了Vue中CSS動畫原理的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • vue項目動態(tài)設(shè)置iframe元素高度的操作代碼

    vue項目動態(tài)設(shè)置iframe元素高度的操作代碼

    在現(xiàn)代Web開發(fā)中,iframe元素常用于嵌入外部內(nèi)容到當(dāng)前網(wǎng)頁中,比如在線文檔、視頻播放器或是廣告,Vue框架提供了強(qiáng)大的工具來解決這個問題,通過動態(tài)設(shè)置iframe元素的高度,我們可以確保頁面布局既美觀又高效,本文給大家介紹了vue項目動態(tài)設(shè)置iframe元素高度的操作
    2024-10-10
  • Vue使用pages構(gòu)建多頁應(yīng)用的實現(xiàn)步驟

    Vue使用pages構(gòu)建多頁應(yīng)用的實現(xiàn)步驟

    在大部分實際場景中,我們都可以構(gòu)建單頁應(yīng)用來進(jìn)行項目的開發(fā)和迭代,然而對于項目復(fù)雜度過高或者頁面模塊之間差異化較大的項目,我們可以選擇構(gòu)建多頁應(yīng)用來實現(xiàn),那么什么是多頁應(yīng)用,本文就給大家介紹了Vue使用pages構(gòu)建多頁應(yīng)用的實現(xiàn)步驟
    2024-12-12
  • Vue 使用typescript如何優(yōu)雅的調(diào)用swagger API

    Vue 使用typescript如何優(yōu)雅的調(diào)用swagger API

    這篇文章主要介紹了Vue 使用typescript如何優(yōu)雅的調(diào)用swagger API,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • vue模態(tài)框?qū)崿F(xiàn)動態(tài)錨點(diǎn)

    vue模態(tài)框?qū)崿F(xiàn)動態(tài)錨點(diǎn)

    這篇文章主要為大家詳細(xì)介紹了vue模態(tài)框?qū)崿F(xiàn)動態(tài)錨點(diǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評論

怀安县| 顺义区| 航空| 金昌市| 招远市| 聂拉木县| 伊金霍洛旗| 黄大仙区| 嫩江县| 曲阜市| 彭山县| 铜川市| 英山县| 灌阳县| 泸溪县| 天全县| 绵阳市| 金沙县| 夹江县| 绥棱县| 子长县| 乌恰县| 昌都县| 绵阳市| 大厂| 镇原县| 黔西县| 行唐县| 宜兰市| 宜宾市| 新疆| 息烽县| 蓬莱市| 黔西县| 乌鲁木齐县| 定日县| 胶州市| 本溪| 雷波县| 淮北市| 威信县|