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

Vue手動埋點設(shè)計的方法實例

 更新時間:2022年03月11日 09:19:11   作者:奇幻心靈  
這篇文章主要給大家介紹了關(guān)于Vue手動埋點設(shè)計的相關(guān)資料,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,需要的朋友可以參考下

目標

  • 使用簡單;
  • 減少代碼侵入性,不影響業(yè)務(wù)代碼閱讀

簡述

  • 埋點一般是按頁面來管理的;
  • 埋點的事件類型一般分為:點擊、曝光和頁面的進入和離開;
  • 埋點的實質(zhì)就是在恰當?shù)臅r機去發(fā)送請求,上送業(yè)務(wù)參數(shù)

按頁面管理埋點

在每個頁面目錄下創(chuàng)建events.js,管理當前頁面的所有埋點事件。

為了減少埋點對業(yè)務(wù)代碼的影響,events.js中每個埋點的設(shè)置都是一個方法,可以在這個方法中處理數(shù)據(jù)得到埋點需要上送的數(shù)據(jù)。

該埋點設(shè)置的方法,返回一個埋點需要上送的參數(shù)的對象。

// src/views/PageA/events.js

export default {
  // 按事件類型管理
  CLICK: {
    back(ctx, data) {
      let { param1, param2 } = data;
      // ...處理傳入的數(shù)據(jù)
      return {
        eventValue: '返回',
        elementId: 'pageA-返回',
        // 需要上送的處理后的業(yè)務(wù)參數(shù)
        customData: {
          param1,
          param2
        }
      };
    }
  }
}

遵循使用簡單的原則,調(diào)用埋點

// src/views/PageA/index.vue

this.$track('CLICK.back', data);

實現(xiàn)上面的調(diào)用

  • 使用require.context()聚合各個頁面目錄下的埋點設(shè)置(events.js)。
  • 聚合后的埋點設(shè)置按頁面作為模塊管理,使用頁面文件夾名稱作為模塊名。
  • 結(jié)合路由管理,可以獲得當前頁面的埋點配置模塊名。
  • 在Vue.prototype下新增一個$track()方法。
// src/events/index.js
import router from '@/router';

const ctx = require.context('@/views', true, /events\.js/);
const configs = {};
ctx.keys().reduce((configs, path) => {
  if (/\.\/(\w+?)\/events\.js/.test(path)) {
    const moduleName = RegExp.$1; // 第一個子項
    configs[moduleName] = resolveModule(moduleName, ctx(path));
  }
  return configs;
}, configs);

function resolveModule(moduleName, module) {
  return Object.entries(module.default).reduce((all, [EVENT_TYPE, events]) => {
    all[EVENT_TYPE] = Object.keys(events).reduce((typeAll, key) => {
      typeAll[key] = buildTrackRequest(
        EVENT_TYPE.toLowerCase(),
        key,
        events[key]
      );
      return typeAll;
    }, {});
  });
}

function buildTrackRequest(eventType, trackName, trackSetting) {
  return function trackRequest(...args) {
    // 看完后面再回過來看
    if (typeof trackSetting !== 'function') {
      trackSetting = obj2fn(trackSetting);
    }
    // 執(zhí)行用戶定義的方法,返回埋點上送參數(shù)
    const [success, result] = invokeUserFn(trackSetting.bind(this, {}));
    if (!success) return result;
    // 傳入?yún)?shù),發(fā)送埋點請求
    return tracker(result);
  }
}

export function track(eventPath, ...args) {
  let event = configs;
  let seg;
  const segs = eventPath.split('.');
  // 2段式 沒有提供模塊名,則需要去路由配置上取
  if (segs.length === 2) {
    const moduleName = router.currentRoute.meta?.eventModule;
    if (!moduleName) {
      throwError(`${eventPath} 沒有在路由配置中設(shè)置"meta.eventModule" 或者配置成3段式`);
    }
    event = event[moduleName];
  }
  while ((seg = segs.shift())) event = event[seg];
  if (!event) throwError(`${eventPath} 不存在`);
  // 給event綁定當前調(diào)用環(huán)境
  return event.call(this, ...args);
}

function throwError(err) {
  throw Error(`[Track Error] ${err}`);
}

export default function install(Vue) {
  Vue.prototype.$track = track;
}

埋點設(shè)置支持對象形式

很多時候,可能不需要上送業(yè)務(wù)參數(shù),寫成一個對象更加簡單。

{
  CLICK: {
    back: {
      eventValue: '返回',
      elementId: 'pageA-返回',
    }
  }
}

有時候只需要上送簡單的業(yè)務(wù)字段,無需額外處理,也想使用對象的形式。

支持{{param1}}模板語法,同vue-template用法。(param1是埋點調(diào)用組件的屬性)

{
  CLICK: {
    back: {
      eventValue: '返回',
      elementId: 'pageA-返回',
      customData: {
        param1: '{{param1}}'
      }
    }
  }
}

將對象格式的埋點配置轉(zhuǎn)成方法形式的

const templateRE = /\{\{(.+?)\}\}/g;
// 處理對象形式的埋點設(shè)置
function obj2fn(obj) {
  return function() {
    const that = this;
    // 處理模板字符串
    (function resolveObj(obj) {
      Object.keys(obj).forEach(key => {
        const val = obj[key];
        // 解析模板字符串
        if (typeof val === 'string' && templateRE.test(val)) {
          obj[key] = val.replace(templateRE, (...match) => {
            // js嚴格模式下無法執(zhí)行with語法,以下是一種變通
            return new Function(`with(this){return ${match[1]}}`).call(that);
          });
        }
        // 遞歸處理
        else if (isPlainObject(val)) resolve(val);
      });
    })(obj);
    return obj;
  };
}

提供頁面級別的參數(shù)設(shè)置

很多時候一個頁面下的埋點都需要上送相同的參數(shù),如頁面名稱等。

提供beforeModuleEach和afterModuleEach兩個鉤子。

一般使用beforeModuleEach設(shè)置模塊(頁面)通用的埋點參數(shù),再合并單獨的埋點設(shè)置參數(shù),得到所有需要上送的參數(shù)。

function resolveModule(moduleName, module) {
  // 獲取`events.js`文件中設(shè)置的鉤子
  const { beforeModuleEach, afterModuleEach } = module;
  // 獲取動態(tài)設(shè)置鉤子
  const { beforeHooks, afterHooks } = getHooksByModule(moduleName);
  beforeModuleEach && beforeHooks.unshift(beforeModuleEach);
  afterModuleEach && afterHooks.unshift(afterModuleEach);
  
  return Object.entries(module.default).reduce((all, [EVENT_TYPE, events]) => {
    all[EVENT_TYPE] = Object.keys(events).reduce((typeAll, key) => {
      typeAll[key] = buildTrackRequest(
        EVENT_TYPE.toLowerCase(),
        key,
        events[key],
        beforeHooks,
        afterHooks
      );
      return typeAll;
    }, {});
  });
}

總結(jié)

到此這篇關(guān)于Vue手動埋點設(shè)計的文章就介紹到這了,更多相關(guān)Vue手動埋點設(shè)計內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue 集成jTopo 處理方法

    vue 集成jTopo 處理方法

    這篇文章主要介紹了vue 集成jTopo 處理方法,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-08-08
  • vue搜索頁開發(fā)實例代碼詳解(熱門搜索,歷史搜索,淘寶接口演示)

    vue搜索頁開發(fā)實例代碼詳解(熱門搜索,歷史搜索,淘寶接口演示)

    這篇文章主要介紹了vue搜索頁開發(fā)實例(熱門搜索,歷史搜索,淘寶接口演示),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 詳解vue beforeRouteEnter 異步獲取數(shù)據(jù)給實例問題

    詳解vue beforeRouteEnter 異步獲取數(shù)據(jù)給實例問題

    這篇文章主要介紹了vue beforeRouteEnter 異步獲取數(shù)據(jù)給實例問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Vue仿今日頭條實例詳解

    Vue仿今日頭條實例詳解

    這篇文章主要介紹了Vue仿今日頭條實例詳解,并把相關(guān)代碼做了說明,對此有興趣的朋友參考下吧。
    2018-02-02
  • Vue中對iframe實現(xiàn)keep alive無刷新的方法

    Vue中對iframe實現(xiàn)keep alive無刷新的方法

    這篇文章主要介紹了Vue中對iframe實現(xiàn)keep alive無刷新的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • vue實現(xiàn)分頁組件

    vue實現(xiàn)分頁組件

    這篇文章主要為大家詳細介紹了vue實現(xiàn)分頁組件的具體代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • vue項目webpack中配置src路徑別名及使用方式

    vue項目webpack中配置src路徑別名及使用方式

    這篇文章主要介紹了vue項目webpack中配置src路徑別名及使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Vue使用Proxy代理后仍無法生效的解決

    Vue使用Proxy代理后仍無法生效的解決

    這篇文章主要介紹了Vue使用Proxy代理后仍無法生效的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • vue解決跨域問題的幾種方式

    vue解決跨域問題的幾種方式

    這篇文章主要給大家介紹了關(guān)于vue解決跨域問題的幾種方式,跨域跨域報錯是前端開發(fā)中非常經(jīng)典的一個錯誤,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • 淺談vue中使用圖片懶加載vue-lazyload插件詳細指南

    淺談vue中使用圖片懶加載vue-lazyload插件詳細指南

    本篇文章主要介紹了淺談vue中使用圖片懶加載vue-lazyload插件詳細指南,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-10-10

最新評論

太和县| 衡阳市| 尼勒克县| 清徐县| 丹东市| 晋州市| 仁布县| 易门县| 灵璧县| 淳化县| 华池县| 额济纳旗| 鸡泽县| 兴化市| 敦化市| 建水县| 博兴县| 喜德县| 清苑县| 内丘县| 望江县| 青龙| 珠海市| 临安市| 微山县| 蚌埠市| 安岳县| 宁波市| 桦川县| 东光县| 长汀县| 赣榆县| 来宾市| 泰顺县| 南乐县| 外汇| 安图县| 桓台县| 安达市| 阿拉尔市| 图片|