Adobe 推荐的新一代数据层:Adobe Client Data Layer(ACDL)详解

Adobe Analytics Haran 4年前 (2022-01-07) 3511次浏览 0个评论
文章目录[隐藏]

 更新时间:2024年7月7号

长期以来,行业依赖W3C的Customer Experience Digital Data Layer (CEDDL)标准,使用digitalData对象来管理页面数据。但随着单页应用(SPA)和事件驱动架构的兴起,这种静态数据层逐渐显露出局限性。
Adobe敏锐地捕捉到这一痛点,于2020年推出Adobe Client Data Layer (ACDL),作为新一代事件驱动数据层解决方案。它不仅标准化了数据暴露方式,还无缝集成Adobe生态,帮助企业实现更精简、更可靠的分析实施。

认识ACDL

Adobe Client Data LayerACDL)是一套由 Adobe 官方维护的数据层标准和实现库。

它的作用是:

  • 统一管理页面上的数据与用户行为
  • 以结构化方式向前端工具暴露这些数据
  • 更好地支持 Adobe 生态(Analytics、Launch、Target、AEP)
  • 让数据层成为“前端数据的唯一可信来源”

简单来说,ACDL 让前端追踪从“拼凑式开发”变为“标准化工程化”。

ACDL 的核心特性

ACDL 的核心优势:从静态到动态

事件驱动的架构

ACDL 的核心是基于 push() 方法。当业务事件(例如:“商品添加到购物车”、“用户登录”)发生时,前端代码不再是直接修改数据层对象,而是将一个包含事件和数据的对象推送到 ACDL 堆栈中:

adobeDataLayer.push({
    "event": "addToCart",
    "data": {
        "productID": "P456",
        "quantity": 1
    }
});

这种机制带来的巨大好处是:

  • 可观测性(Observability): Adobe Launch可以侦听(Listen)这些推送的事件,一旦匹配,即可立即触发相应的分析规则。
  • 时间戳记录: 每次推送都会被记录在案,形成一个可追溯的数据流。

 

内置状态管理(State Management)

ACDL 的一个革命性功能是其自动维护计算状态的能力。

当数据被推送到 ACDL 时,它会自动聚合并生成一个最新的、当前状态的数据对象。这个最终状态是所有历史推送的累积结果。

例如,如果您先推送用户 ID,然后推送用户偏好,ACDL 会自动将这些数据合并到一个最新的状态对象中。这样,Adobe Launch在需要数据时,无需手动从复杂的数组中解析,只需简单读取最新的“计算状态”即可,确保了数据源的单一性和准确性。

 

 

ACDL的使用案例

Step 1:安装 ACDL 扩展

在 Tags/Launch 属性中安装 Adobe Client Data Layer 扩展。它默认使用 adobeDataLayer 变量名。

 

Step 2:在页面用发送数据

页面用ACDL的写法如下:

adobeDataLayer.push({"event":"myEvent",
                                  "data":{"foo":"bar",
                                         "key":"value"}})

event是触发条件,data里面就是发送的数据。

 

Step 3:自动记录最新数据

ACDL会自动将 push 的内容合并进全局 State,供Adobe Launch 或代码读取。

这一步就是前面提到的内置状态管理,它是自动的,不需要你做什么设置。

 

Step 4:事件侦听器

新建一个Rules,命名为ACDL在Rules新建event,做如下设置:

Adobe 推荐的新一代数据层:Adobe Client Data Layer(ACDL)详解

这个设置的意思是,当myEvent触发的的时候才执行,也就是接收到ACDL的数据。

 

Step 5:数据元素

接下来看如何在data element里拿到data里的数据,也就是foo和key,创建一个数据元素,命名为AB,然后做如下设置:

Adobe 推荐的新一代数据层:Adobe Client Data Layer(ACDL)详解

这个是ACDL内置的传入数据的方法,data.foo就拿到bar,如果是data.key,就拿到的value。(这种方式有时候会拿不到数据)然后这个data element就可以被Rules或Extensions引用。

 

最后下来就是配置Action,可以将data element拿到的数据设置成eVars或props发送给Adobe analytics。

如果要检查ACDL是否已经将数据发送出去,可以在浏览器的控制台里用adobeDataLayer去查询。

 

ACDL与AEM的用法

AEM里面已经集成有ACDL的,可以开启使用。

以https://wknd.site/content/wknd/us/en.html为例,这个站点是AEM建立的,且开启了ACDL,可以在代码查看中通过关键字“ adobeDataLayer.push”找到ACDL的数据:

Adobe 推荐的新一代数据层:Adobe Client Data Layer(ACDL)详解

它发送的数据就有json数据,而且格式还比较特别,可以在浏览器控制台下看看它具体的数据结构:

Adobe 推荐的新一代数据层:Adobe Client Data Layer(ACDL)详解

发送的数据page里面签到一个page-2eee4f8914,这个动态的页面id,而且里面还有一个特别的数据结构,里面有很多的数据。

像这种情况就不能像一般的ACDL那么处理的,这类情况需要用自定义js去监听event,然后重构数据层里面的信息,提取page-2eee4f8914里面的数据从重新发送,使得能够被Adobe Launch获取和使用。

新建一个Rules,命名为Page Load。

Event选择Custom Code,然后将下面的代码监听event的代码黏贴进入:

ar pageShownEventHandler = function(evt) {
   // defensive coding to avoid a null pointer exception
   if(evt.hasOwnProperty("eventInfo") && evt.eventInfo.hasOwnProperty("path")) {
      //trigger Launch Rule and pass event
      console.debug("cmp:show event: " + evt.eventInfo.path);
      var event = {
         //include the path of the component that triggered the event
         path: evt.eventInfo.path,
         //get the state of the component that triggered the event
         component: window.adobeDataLayer.getState(evt.eventInfo.path)
      };

      //Trigger the Launch Rule, passing in the new `event` object
      // the `event` obj can now be referenced by the reserved name `event` by other Launch data elements
      // i.e `event.component['someKey']`
      trigger(event);
   }
}

//set the namespace to avoid a potential race condition
window.adobeDataLayer = window.adobeDataLayer || [];
//push the event listener for cmp:show into the data layer
window.adobeDataLayer.push(function (dl) {
   //add event listener for `cmp:show` and callback to the `pageShownEventHandler` function
   dl.addEventListener("cmp:show", pageShownEventHandler);
});

 

效果如下:

Adobe 推荐的新一代数据层:Adobe Client Data Layer(ACDL)详解

在配置发送数据之前,我们还可以通过data element去获取page-2eee4f8914里面的具体的数据,假设现在想获取@type这个信息:

Adobe 推荐的新一代数据层:Adobe Client Data Layer(ACDL)详解

那么可以新建一个data element,命名为AA,选择Custom Code,然后将以下代码黏贴进去:

if(event && event.component && event.component.hasOwnProperty('@type')) {
    return event.component['@type'];
}

 

这段代码的作用就是监听Rule里面的自定义代码触发的事件,然后返回具体的值。

设置后可以在浏览器控制台测试,看是否拿到信息:

Adobe 推荐的新一代数据层:Adobe Client Data Layer(ACDL)详解

已经拿到@type的值,同理可以拿到其他的值到data element。

然后将这些值设置成eVars或props发送给Adobe Analytics

 

 

Adobe数据层和ACDL的对比

Adobe 推荐的新一代数据层:Adobe Client Data Layer(ACDL)详解

  • 左边的是Adobe数据层,它是页面上静态的数据,所以是“=”。
  • 右边的是ACDL,它是主动主动推送数据,可以看到它有个push的字段,这个是ACDL函数,ACDL一共有4个函数,如”push() getState() addEventListener() removeEventListener()。

ACDL和GTM的数据层对比

Adobe 推荐的新一代数据层:Adobe Client Data Layer(ACDL)详解

ACDL与GTM的DataLayer非常类似,如发送的调用的函数,里面的数据结构都高度相似,但ACDL的会更强,它支持数据嵌套、json格式的数据,其实adobeDataLayer和dataLayer都可以修改的,可以就GTM可以ACDL数据层数据,ACDL可以获取GTM里的数据层数据。

 

 

注意点:push覆盖的问题

ACDL连续push,会导致后面一个值覆盖掉前面的,如:

adobeDataLayer.push({
  event: 'first push',
  foo: {
    bar: 'stamp'
  }
});
adobeDataLayer.push({
  event: 'second push',
  foo: {
    bar: 'baz'
  }
});

 

这个是有两个push,但实际上后面的值会覆盖前面的,实际两个事件获取到都是baz,这个是Launch的bug,目前官方在处理它。

目前有两种处理方式:

  • 一种是采用延迟发送的方式
  • 一种是action里采用event的方式,如直接用%event.fullState.foo.bar%

 


如有疑问,可以在文章底部留言或邮件(haran.huang@ichdata.com) 我~
喜欢 (6)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址