亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

vue項目前端埋點的實現

2019-11-19 12:01:57
字體:
來源:轉載
供稿:網友

埋點方案的確定。業界的埋點方案主要分為以下三類:

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

在當時排期緊湊,人力緊缺的情況下,顯然不允許我們去開發可視化埋點方案和無埋點方案,所以只能采取代碼埋點方案。

命令式埋點

命令式埋點,顧名思義,開發者需要手動在需要埋點的節點處進行埋點。如點擊按鈕或鏈接后的回調函數、頁面ready時進行請求的發送。大家肯定都很熟悉這樣的代碼:

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

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

聲明式埋點

理論上,聲明式埋點只需要關注兩個問題:

  • 需要埋點的DOM節點;
  • 所需攜帶的數據

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

// key表示埋點的唯一標識;act表示埋點方式<button data-stat="{key:'111', act: 'click'}">埋點</button>

那么可以去遍歷DOM樹,找到 [data-stat] 的節點,給這個button綁上click事件,把這些參數在回調函數中通過請求發出去。

在DOM節點(html)上聲明埋點,與業務邏輯(通常在Javascript文件中)就解耦了。調用也很方便。

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

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

1.自定義指令實現埋點數據統計

在項目中通常需要做數據埋點,這個時候,使用自定義指令將會變非常簡單

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

// 坑位埋點指令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.使用路由攔截統計頁面級別的 PV

由于第一次在單頁應用中嘗試數據埋點,在項目上線一個星期之后,數據統計后臺發現,首頁的 PV 遠遠高于其它頁面,數據很不正常。后來跟數據后臺的人溝通詢問他們的埋點統計原理之后,才發現其中的問題所在。

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

解決方案

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

const analyticsRequest = (to, from) => { // 只統計頁面跳轉數據,不統計當前頁 query 不同的數據 // 所以這里只使用了 path, 如果需要統計 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)) {  // 這里做登錄等前置邏輯判斷  // 判斷通過之后,再上報數據  ...  analyticsRequest(to, from); } else {  // 不需要判斷的,直接上報數據  analyticsRequest(to, from);  next(); }});

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

基于 jquery + widget 的老項目,

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

基于MutationObserver API的Mixin

MutationObserver是在DOM3標準中提出的標準API,提供讓開發者感知到在某一個DOM節點變更的能力。可以監聽以下場景:

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

但為了保證MutationObserver可以在所有瀏覽器上正常工作,我們仍然引入了這個API的polyfill,詳情可見這里。

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

我們將 MutationObserver 封裝進一個 Vue mixin , 非Vue應用的業務代碼只需要引入這個mixin,這樣也可以很好地解耦。
詳細的實現原理可以見以下偽代碼:

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久久国产| 日韩在线观看免费网站| 成人www视频在线观看| 成人精品久久一区二区三区| 亚洲自拍在线观看| 亚洲人成绝费网站色www| 日韩美女毛茸茸| 成人a在线观看| 91国自产精品中文字幕亚洲| 成人黄色午夜影院| 欧美诱惑福利视频| 日韩av免费在线| 午夜精品久久久久久久久久久久久| 亚洲夜晚福利在线观看| 亚洲图片在线综合| 亚洲专区中文字幕| 日韩大胆人体377p| 日韩免费在线视频| 久久久久久亚洲精品不卡| 最好看的2019的中文字幕视频| 久久激情视频免费观看| 欧美成人精品一区二区三区| 成人性生交大片免费观看嘿嘿视频| 久久久久久久久中文字幕| 亚洲精品视频二区| 国语自产偷拍精品视频偷| 亚洲人成电影网站色xx| 欧美国产日韩一区二区在线观看| 欧美韩国理论所午夜片917电影| 青青久久av北条麻妃海外网| 国产精品久久99久久| 久久久亚洲影院| 亚洲精品suv精品一区二区| 91久久久久久国产精品| 亚洲欧美国内爽妇网| 欧美日本精品在线| 成人久久久久爱| 97婷婷涩涩精品一区| 91精品在线看| 日韩在线一区二区三区免费视频| 国产成人精品999| 久久激情视频免费观看| 久久久久久久久久国产| 亚洲一区二区久久久久久久| 亚洲一二三在线| 国产自产女人91一区在线观看| 日韩经典第一页| 国产精品69久久久久| 欧美成人全部免费| 欧美久久精品一级黑人c片| 久久久免费在线观看| 日韩欧美中文字幕在线播放| 日韩在线视频一区| 日本欧美一二三区| 久久久国产一区二区三区| 精品国产一区二区三区久久久狼| 久精品免费视频| 久久久亚洲欧洲日产国码aⅴ| 亚洲精品综合久久中文字幕| 日韩精品视频观看| 欧美理论片在线观看| 久久国内精品一国内精品| 成人伊人精品色xxxx视频| 欧美富婆性猛交| 亚洲午夜女主播在线直播| 国产视频观看一区| 成人妇女淫片aaaa视频| 日韩av手机在线看| yellow中文字幕久久| 国产精品大片wwwwww| 2019中文字幕全在线观看| 久久99精品久久久久久噜噜| 中文字幕日韩在线观看| 成人日韩在线电影| www.亚洲免费视频| 欧美限制级电影在线观看| 国产精品久久久久久久久免费看| 日韩亚洲欧美成人| 欧美在线一级va免费观看| 日韩一中文字幕| 国产婷婷成人久久av免费高清| 国产精品www| 亚洲欧美日韩一区二区在线| 最近2019年好看中文字幕视频| 日韩美女写真福利在线观看| 91久久久久久| 91高清在线免费观看| 美女av一区二区| 欧美做爰性生交视频| 精品少妇v888av| 91久久国产精品91久久性色| 国产精品久久久久久久久久久久久| 欧美亚洲激情在线| 日韩中文字幕不卡视频| 国产欧美一区二区三区久久人妖| 欧美激情久久久久| 色噜噜狠狠狠综合曰曰曰| 亚洲久久久久久久久久| 久久成人免费视频| 日韩欧美国产免费播放| 欧美精品第一页在线播放| 午夜精品蜜臀一区二区三区免费| 这里只有精品在线观看| 国产亚洲精品久久久久久牛牛| 少妇高潮久久久久久潘金莲| 欧美性猛交xxxx乱大交| 国产一区视频在线| 日本三级韩国三级久久| 欧美夜福利tv在线| 精品香蕉一区二区三区| 欧美视频中文字幕在线| 日韩成人在线播放| 亚洲va久久久噜噜噜久久天堂| 亚洲国产91精品在线观看| 欧美午夜激情视频| 亚洲性av网站| 国产美女精品免费电影| 国产精品久久久av| 国产精品偷伦一区二区| 国产成人精品av在线| 亚洲va欧美va在线观看| 欧美一级大片视频| 精品视频一区在线视频| www日韩中文字幕在线看| 日本一区二区在线播放| 91亚洲精品一区二区| 日韩在线免费视频观看| 韩国福利视频一区| 国产一区二区日韩| 久久精品国产亚洲精品2020| 欧美色视频日本高清在线观看| 草民午夜欧美限制a级福利片| 欧美激情亚洲视频| 欧美极品第一页| 久久久在线观看| 久久91亚洲精品中文字幕| 日韩免费在线播放| 国产国产精品人在线视| 国产日韩精品视频| 日韩av快播网址| 亚洲精品小视频在线观看| 欧美精品免费看| 91sao在线观看国产| 欧美日韩xxxxx| 国产精品jvid在线观看蜜臀| 91免费精品视频| 国产一区二区成人| 亚洲四色影视在线观看| 精品中文字幕视频| 成人妇女免费播放久久久| 欧美猛交免费看| 亚洲精品一区中文字幕乱码| 91性高湖久久久久久久久_久久99| 国产亚洲欧美另类中文| 日韩欧美在线视频观看| 中文字幕国内精品| 欧美成人sm免费视频| 亚洲最大成人网色| 欧美成人四级hd版| 日韩av免费看网站| 成人黄色网免费| 91国语精品自产拍在线观看性色| 久久久久久成人| 久久亚洲精品小早川怜子66|