更新时间:2024年7月7号
认识ACDL
Adobe Client Data Layer(ACDL)是一套由 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,做如下设置:
这个设置的意思是,当myEvent触发的的时候才执行,也就是接收到ACDL的数据。
Step 5:数据元素
接下来看如何在data element里拿到data里的数据,也就是foo和key,创建一个数据元素,命名为AB,然后做如下设置:
这个是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的数据:
它发送的数据就有json数据,而且格式还比较特别,可以在浏览器控制台下看看它具体的数据结构:
发送的数据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);
});
效果如下:
在配置发送数据之前,我们还可以通过data element去获取page-2eee4f8914里面的具体的数据,假设现在想获取@type这个信息:
那么可以新建一个data element,命名为AA,选择Custom Code,然后将以下代码黏贴进去:
if(event && event.component && event.component.hasOwnProperty('@type')) {
return event.component['@type'];
}
这段代码的作用就是监听Rule里面的自定义代码触发的事件,然后返回具体的值。
设置后可以在浏览器控制台测试,看是否拿到信息:
已经拿到@type的值,同理可以拿到其他的值到data element。
然后将这些值设置成eVars或props发送给Adobe Analytics。
Adobe数据层和ACDL的对比
- 左边的是Adobe数据层,它是页面上静态的数据,所以是“=”。
- 右边的是ACDL,它是主动主动推送数据,可以看到它有个push的字段,这个是ACDL函数,ACDL一共有4个函数,如”push() getState() addEventListener() removeEventListener()。
ACDL和GTM的数据层对比
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%












