【问题标题】:How is Google analytics gtag supposed to work in a SPA?谷歌分析 gtag 应该如何在 SPA 中工作?
【发布时间】:2018-07-07 01:35:01
【问题描述】:

据我所知,谷歌建议如何设置 gtag,它是一个总是将更多变量推送到数组中的函数:

window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}

按照有关如何在 SPA 中使用它的文档,看来我实际上是在制造内存泄漏。

gtag('config', 'GA_TRACKING_ID', {'page_path': '/new-page.html'});
console.log('window.dataLayer', window.dataLayer);

我的控制台显示,每次我导航到新页面时,window.dataLayer 数组都会变大。

我假设有一些我不理解的东西,因为我怀疑 Google 是否希望我在我的应用程序中创建内存泄漏,但我现在很难过。

【问题讨论】:

    标签: google-analytics single-page-application gtag.js


    【解决方案1】:

    dataLayer 的大小目前上限为 300(FIFO 样式)。

    目前没有记录,未来可能会发生变化。但是限制正是为了避免在同一页面内发生重复事件的情况下炸毁内存。

    【讨论】:

    • 好的,谢谢,很有趣。即使我从googletagmanager.com/gtag/js 加载了脚本,为什么我看不到数组被清除(我认为一旦数据发送到谷歌就应该清除它)?如果 google 脚本无法加载或由于某种原因无法工作,会发生什么情况。那么这个数组会一直增长,直到页面可能崩溃?
    • dataLayer 的设计是尽可能保留所有的突变。现在它似乎没有多大意义,但 gtag 是最近添加的标签,这种设计将来会派上用场。是的,如果谷歌标签不加载这个数组会增长,它不太可能大到足以破坏你的页面,但我想这可能取决于用户在不离开页面的情况下可以触发多少次点击。如果你想避免这种情况,你可以手动修剪它。
    • 我看到它确实最多可容纳 300 件商品。谢谢。
    【解决方案2】:

    我不太清楚,但我认为这只是一个在加载 gtag 之前初始化的普通数组。如果唯一关心的是防止这个数组变大,那么我们不能创建一个数组来防止它自己变大到一个设定的限制吗?像这样?:

    function createDL(limit){
        var dL = [],//the array
            iCounts = [];//the log of arg. length every time push is called
        dL.push = function(){
            if(this.length >= limit) {
                return (
                    !!iCounts[1] 
                    && 
                    (
                        this.splice(iCounts[0],iCounts[1]),
                        iCounts.splice(1,1),
                        this.push.apply(this,arguments)
                    )
                );
            }
            this.constructor.prototype.push.apply(this,arguments);
            iCounts.push(arguments.length);
            return this;
        }
        return dL;
    }
    

    用法:

    window.dataLayer = dataLayer || createDL(5);
    dataLayer.push(1,2,3);//1,2,3
    dataLayer.push(4,5);//1,2,3,4,5
    dataLayer.push(6);//1,2,3,6
    dataLayer.push(8,9,10,11);//1,2,3,6,8,9,10,11
    dataLayer.push("aaa");//1,2,3,"aaa"
    

    我没有触及推送到 dataLayer 的第一件事,因为它们包含“config”指令和一些可选参数。如果推送到数组的第一件事大于限制,显然它总是会返回 false,你不能再推送了。

    在您的情况下,限制为 300。

    还是我错过了什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多