Comment enterrer les points front-end ? L'article suivant vous présentera comment implémenter l'intégration frontale via les instructions personnalisées de Vue. J'espère que cela sera utile à tout le monde !
(Partage vidéo d'apprentissage : tutoriel vidéo Vue)
Dans les activités de marketing, les préférences et les habitudes d'interaction des utilisateurs peuvent être obtenues en enterrant des points, optimisant ainsi le processus, améliorant encore l'expérience utilisateur et augmentant le taux de conversion.
Dans la précédente implémentation du système de points cachés, le point caché était activement signalé via des événements lorsqu'un bouton ou une image spécifique était cliqué ou exposé. Cette méthode convient lorsqu'il y a relativement peu de points enterrés dans le projet. Une fois qu'un grand nombre de points enterrés est nécessaire dans le projet, il est inévitable d'ajouter beaucoup de code métier. Cela est également en grande partie à l’origine du couplage élevé entre la logique cachée et la logique métier.
Afin d'améliorer cette situation, nous avons apporté quelques petites améliorations à la méthode d'enfouissement des points d'origine, ce qui a grandement amélioré l'efficacité de l'enfouissement des points.
Avant d'élaborer sur notre transformation de points enterrés, il est nécessaire d'avoir une brève compréhension du bon sens concernant les points enterrés.
Il faut savoir qu'il existe de nombreux types de points cachés, et qu'il existe différentes manières de les signaler. Il existe trois méthodes courantes d'enfouissement des points à l'avant :
L'enfouissement manuel, comme son nom l'indique, consiste à écrire du code purement manuellement, en appelant les fonctions fournies par l'enfouissement. SDK et, si nécessaire, ajoutez les méthodes correspondantes à la logique métier des points enterrés pour rapporter les données des points enterrés. C’est aussi la méthode qui a été utilisée auparavant.
Les points enterrés visuels font référence à la configuration des points enterrés via le système visuel Peu de personnes ont été exposées à cette méthode, je n'entrerai donc pas dans les détails.
Enfouissement sans trace, également appelé enfouissement automatique et enfouissement complet. Autrement dit, interceptez et enterrez tous les événements globaux et les cycles de chargement des pages.
Afin de réaliser l'analyse des données et de faciliter les opérations ultérieures et les ajustements de la stratégie produit, il est généralement nécessaire de réaliser des statistiques sur les points suivants :
Cet article est basé sur la nécessité d'ajouter des points enterrés dans les projets récents. Le besoin est le suivant :
Étant donné que le projet est développé par Vue
, pensez à l'utiliser Personnalisez les instructions pour compléter le rapport sur les points cachés. La raison du choix des instructions personnalisées est également parce qu'elles peuvent dans une certaine mesure découpler l'activité et les points cachés. Vue
开发的,所以考虑使用自定义指令的方式来完成埋点上报。选择自定义指令的原因也是因为他能一定程度上能让业务和埋点解耦。
页面埋点在框架层面已经帮我们做掉了,这里主要关心的是点击埋点和曝光埋点。
实现思路其实也很清晰:在需要埋点的DOM
节点挂载特殊属性,通过埋点SDK
监听挂载了相应属性对应的事件,在事件触发时进行埋点数据上报。
那么问题来了,怎么监听呢?
对于点击事件,我们可以采用addEventListener
来监听click
事件。这很简单。
对于元素的曝光就稍微有点麻烦了。
首先我们来看一下为什么需要监测曝光:
为了衡量用户对产品的兴趣程度,需要计算区域的点击率(点击次数/曝光次数)。为了保证点击率的准确性,我们必须保证用户真正的浏览到了这些产品(就比如上图中最下方的机酒产品区域,由于需要滚动页面,用户才有可能看到这一区域)。
那么怎么判断元素出现在页面的可视区域呢?
按照以往的做法:监听滚动事件,通过getBoundingClientRect()
方法计算监测区域与视窗的位置,然后判断元素是否出现在页面的可视区域内。但是由于scroll
事件的频繁触发,性能问题很大。
基于此,浏览器特意为我们打造了一个Intersection Observer
L'idée d'implémentation est en fait très claire : monter des attributs spéciaux sur le nœud DOM
qui doit être enterré, et surveiller et monter les événements correspondant aux attributs correspondants via le point enterré SDK. Signale les données cachées lorsqu'un événement est déclenché.
Alors la question est : comment surveiller ?
🎜Pour les événements de clic, nous pouvons utiliseraddEventListener
pour écouter les événements click
. C'est très simple. 🎜🎜C'est un peu gênant d'exposer des éléments. 🎜🎜Tout d'abord, voyons pourquoi nous devons surveiller l'exposition : 🎜🎜🎜🎜Afin de mesurer l'intérêt de l'utilisateur pour le produit, il est nécessaire de calculer le taux de clics (nombre de clics/nombre d'expositions) de la zone. Afin de garantir l'exactitude du taux de clics, nous devons nous assurer que les utilisateurs parcourent réellement ces produits (par exemple, la zone de produits de vin de machine en bas de l'image ci-dessus, car les utilisateurs doivent faire défiler la page, il est possible pour que les utilisateurs puissent voir cette zone). 🎜🎜Alors comment déterminer si un élément apparaît dans la zone visible de la page ? 🎜🎜Suivez la pratique passée : écoutez l'événement de défilement, calculez la position de la zone de surveillance et de la fenêtre via la méthode getBoundingClientRect()
, puis déterminez si l'élément apparaît dans la zone visible de la page. Cependant, en raison du déclenchement fréquent d'événements scroll
, les problèmes de performances sont énormes. 🎜🎜Sur cette base, le navigateur a spécialement créé pour nous une API Intersection Observer
, qui gère tous les détails liés aux performances et permet aux développeurs de se soucier uniquement de la logique métier : 🎜🎜🎜🎜🎜Parce que les utilisateurs L'incertitude de parcourir la page doit également éviter les comportements d’exposition répétés. Une fois exposé, retirez-le simplement pour observation. 🎜L'analyse des exigences ci-dessus est encore relativement abstraite. Jetons un coup d'œil à l'implémentation finale basée sur le code.
Le traitement des événements de clic est relativement simple. Chaque clic déclenche un rapport de données :
// 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) }) } }
L'exposition est relativement compliquée.
Instanciez d'abord un _observer
global via new IntersectionObserver()
Si vous obtenez une exposition efficace (ici, l'élément sera exposé lorsque plus de la moitié des éléments apparaîtront), puis activez le nœud DOM trace-key
(clé de point enterré) et track-params
(valeur de point enterré). 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: 's_pictures', clickAction: 'c_pictures', detail: { value: '测试', }, }) " />
通过Vue
自定义指令的一个简单封装,业务代码和埋点代码就达到了一定的解耦,相较之前,无论是埋点的开发成本还是维护成本都降低了很多。
但是这也只是一个最简单的实现,还有很多情况需要考虑:
Intersection Observer
rrreee
v-track:click|exposure
v-track: exhibition
src/index.js
: 🎜rrreeeVue
, code métier et points enterrés Le code a atteint un certain degré de découplage Par rapport à avant, les coûts de développement et de maintenance des points enterrés ont été considérablement réduits. 🎜🎜Mais il ne s'agit que de la mise en œuvre la plus simple, et de nombreuses situations doivent être prises en compte : 🎜Intersection Observer
, devons-nous envisager une compatibilité ascendante ? 🎜🎜🎜Compte tenu du fait que ce plan d'enfouissement est encore en cours d'amélioration, nous attendrons des améliorations ultérieures et un bon fonctionnement de l'entreprise. Je partagerai les détails avec vous. 🎜🎜【Tutoriels vidéo associés recommandés : 🎜Tutoriel d'introduction à Vuejs🎜, 🎜Démarrer avec le front-end Web🎜】🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!