AMD 结构化网络应用程序中的 Mixpanel 2.2 - 例如需要.js

2024-01-16

我正在尝试在基于 Backbone.js 和 require.js 的单页面站点中使用 Mixpanel 事件跟踪。

看着snippet https://mixpanel.com/help/reference/tracking-an-event#install-the-libraryMixpanel 提供了剪切并粘贴到常规网页的功能,我可以看出他们已经推出了自己的异步加载机制,可以引入实际的内容混合面板API http://api.mixpanel.com/site_media/js/api/mixpanel-2.2.js从独立资源中,做一些额外的工作来设置“people”和其他属性,最后通过全局命名空间公开“mixpanel”对象。

我尝试为代码片段或独立 API 添加 shim 配置条目,但效果都不好。

通过我的研究,我发现了一个github上的项目 https://github.com/dzello/mixpanel-amd这正是我想要的,但是它已有几年历史并且基于“旧”mixpanel API。在新版本中,Mixpanel 对代码片段和 API 进行了一些重要的更改,但我无法理解这些更改。

我希望有人理解 Mixpanel 代码片段和/或 AMD 和 require.js 并能指导我完成这个过程。


有两件有趣的事情使得这个问题变得很奇怪:

  1. mixpanel 库要求您在加载之前定义 window.mixpanel。
  2. mixpanel lib 重新定义了 window.mixpanel 作为其 init 进程的一部分。

在加载 lib 之前,mixpanel 代码片段开箱即用,不支持 get_distinct_id (以及根据定义是同步的任何调用),但在加载 mixpanel lib 之前会存根其他方法(例如 track)排队。因此我们有两个选择:

选项 1. 放弃异步支持并等待库加载 -Gist https://gist.github.com/jbwyme/6677532

此方法的工作原理是创建一个预初始化模块来设置 mixpanel 库所需的 window.mixpanel 依赖项,然后将其指定为该库本身的依赖项。然后,需要“mixpanel”将阻塞,直到库完全加载。

<html>
    <head>
        <title>Mixpanel AMD Example - Sync</title>
        <script type="text/javascript" src="http://requirejs.org/docs/release/2.1.8/minified/require.js"></script>
        <script type="text/javascript">
            requirejs.config({
                paths : { 'mixpanel': "//cdn.mxpnl.com/libs/mixpanel-2.2.min" },
                shim: {
                    'mixpanel': {
                        deps: ['mixpanel-preinit'],
                        exports: 'mixpanel'
                    }
                }
            });
            define("mixpanel-preinit", function(require) {
                // this is a stripped down version of the mixpanel snippet that removes the loading of the lib via external script tag and the stubs for queuing calls
                var b=window.mixpanel=window.mixpanel||[];var i,g;b._i=[];b.init=function(a,e,d){function f(b,h){var a=h.split(".");2==a.length&&(b=b[a[0]],h=a[1]);b[h]=function(){b.push([h].concat(Array.prototype.slice.call(arguments,0)))}}"undefined"!==typeof d?c=b[d]=[]:d="mixpanel";b._i.push([a,e,d])};b.__SV=1.2;
                b.init("YOUR TOKEN");
            });
        </script>
    </head>
    <body>
        <script type="text/javascript">
            require(['mixpanel'], function(mixpanel) {
                mixpanel.track("my event", {prop1: "val1"}); 
                console.log(mixpanel.get_distinct_id()); 
            });
        </script>
    </body>
</html>

选项 2. 提供“已加载”回调来更新模块的属性。 -Gist https://gist.github.com/jbwyme/6677566

如果您确实想要异步支持,则需要在加载 mixpanel 库后更新存根的方法。我不推荐这样做,因为(除其他原因外)它会在复制后产生 window.mixpanel !== mixpanel 。这也意味着您必须防止同步调用(如 get_distinct_id())出现竞争条件。如果库尚未加载,它将是未定义的。注意:我建议,如果您必须有异步支持,您应该只通过 window.mixpanel 进行调用,而不是进行所有这些疯狂的调用。

<html>
    <head>
        <title>Mixpanel AMD Example - Async</title>
        <script type="text/javascript" src="http://requirejs.org/docs/release/2.1.8/minified/require.js"></script>
        <script type="text/javascript">
            requirejs.config({
                paths : { 'mixpanel-lib': "//cdn.mxpnl.com/libs/mixpanel-2.2.min" }
            });

            define("mixpanel", function(require) {
                var b = window.mixpanel || [];
                if (!b.__SV) { var i, g; window.mixpanel = b; b._i = []; b.init = function (a, e, d) { function f(b, h) { var a = h.split("."); 2 == a.length && (b = b[a[0]], h = a[1]); b[h] = function () { b.push([h].concat(Array.prototype.slice.call(arguments, 0))) } } var c = b; "undefined" !== typeof d ? c = b[d] = [] : d = "mixpanel"; c.people = c.people || []; c.toString = function (b) { var a = "mixpanel"; "mixpanel" !== d && (a += "." + d); b || (a += " (stub)"); return a }; c.people.toString = function () { return c.toString(1) + ".people (stub)" }; i = "disable track track_pageview track_links track_forms register register_once alias unregister identify name_tag set_config people.set people.set_once people.increment people.append people.track_charge people.clear_charges people.delete_user".split(" "); for (g = 0; g < i.length; g++) f(c, i[g]); b._i.push([a, e, d]) }; b.__SV = 1.2 }

                // go ahead and start loading the mixpanel-lib
                require(['mixpanel-lib']);

                b.init("YOUR TOKEN", {loaded: function() { 
                    // now that we know mixpanel is loaded, copy the prop references to our module def
                    for(var prop in window.mixpanel) {
                        b[prop] = window.mixpanel[prop];
                    }
                }}); 
                return b;
            });
        </script>
    </head>
    <body>
        <script type="text/javascript">
            require(['mixpanel'], function(mixpanel) {
                mixpanel.track("my event", {prop1: "val1"}); 
                console.log(mixpanel.get_distinct_id()); // probably undefined
            });
        </script>
    </body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AMD 结构化网络应用程序中的 Mixpanel 2.2 - 例如需要.js 的相关文章

  • Webpack ProvidePlugin 与外部插件?

    我正在探索使用的想法Webpack http webpack github io with 骨干网 js http backbonejs org 我已经遵循了快速入门指南 并且对 Webpack 的工作原理有了大致的了解 但我不清楚如何加载
  • 在浏览器中使用Q库

    我需要使用Q图书馆 http documentup com kriskowal q http documentup com kriskowal q 在浏览器中 我想用RequireJS加载这个库 但我不知道如何做到这一点 我知道如何加载我自
  • grunt requirejs 忽略我的 mainConfigFile 中的路径

    项目介绍 我的项目是一个单页店面 该项目有多个模块 每个模块包含一组controller js view js和model js文件 以及一个template html文件 并使用requirejs来管理依赖关系 问题陈述 我想使用 mai
  • require.js:访问所有加载的模块

    有没有办法访问require js所有加载的模块 背景 我想自动调用init 我的 javascript 模块在全部加载后的功能 请参阅require js backbone js 如何构建具有初始化功能的模块 https stackove
  • 使用 require.js 加载 spin.js

    我最近启动了一个 Javascript 项目 现在将其转移到 require js 到目前为止一切都运行良好 除了spin js http fgnass github com spin js 图书馆 当我尝试访问与 spin js 相关的任
  • 骨干获取回调的正确方法

    我的 Backbone 应用程序有一个名为schedule 我对成功和错误调用正确函数的区别有点困惑 我尝试了下面列出的两种可能的方法 但我不知道有什么区别以及从放置的路由器调用函数的正确方法是什么在外部视图中 第一种方式 require
  • 使用 RequireJS(和 Jasmine/Sinon)时如何在另一个视图渲染方法中存根 Backbone View 实例化

    我正在尝试使用 Jasmine 和 Sion 编写单元测试 但在使用 RequireJs 加载模块时 我很难找到与以下内容等效的内容 sinon stub window MyItemView 使用 RequireJs 时 我无法以这种方式存
  • 在没有 RequireJS 的情况下使用 Angular Dragula

    我很想使用 angular dragula 模块在我的 Angular 项目中实现拖放 https github com bevacqua angular dragula https github com bevacqua angular
  • 如何将 jquery 样板转换为 require 样板?

    如何将 jquery 命名空间插件转换或放入 require 样板中 例如 这通常是我的标准 jquery 样板 A namepace structure function Initial setting var pluginName BR
  • Backbone.js 和 requirejs:如何将模型、视图和集合转换为 requirejs 模块?

    我正在使用backbone js开发一个javascript应用程序 也就是说 为了便于开发 我以这种方式构建我的文件 app views L movieRow js L movieDetail js models L movie js L
  • 使用 Chrome 控制台通过 RequireJS 访问 Knockout ViewModel

    既然我正在使用 RequireJS 如何在 Chrome 控制台中访问 KnockOut ViewModel 变量 在使用 RequireJS 之前 我遵循命名空间模式 将所有内容隐藏在单个全局中 我可以通过在 Chrome 控制台中输入以
  • 如何使用 RequireJS 构建多个页面

    如何使用RequireJS构建多个页面 就像下面的示例一样 在 app js 中声明每个类是正确的做法吗 有每个 html 文件来声明 我想避免的是当用户到达网站的第一页时加载所有脚本 main js 定义所有外部依赖项 require b
  • 如何使用squire模拟内联requirejs依赖项以进行单元测试?

    我将 requirejs 与内联需求一起使用 例如 define someDep function someDep return someFn function require anotherDep function anotherDep
  • 检测应用程序的阶段(alpha、beta 或生产)

    我正在使用 cordova 开发一个 android 应用程序 我希望使用三个给定的阶段来逐步发布它 IT 测试的 Alpha 合作伙伴测试版 为其他人生产 但是 我正在使用 mixpanel 来跟踪一些用户输入 Mixpanel 需要一个
  • Babel/RequireJS + typeof“RangeError:超出最大调用堆栈大小”

    我有一个非常基本的 JS 错误 我很羞愧无法解决它 我正在使用 ES6 和 Babel 进行开发 并且正在做一些实验 请注意 我在 Babel 中使用了这些参数 presets es2015 plugins transform es2015
  • 将 RequireJS 与遗留代码结合使用

    我正在处理一个非常大的项目 该项目使用 包含带有脚本标记的 javascript 文件的旧版 JSP 页面 使用其他 javascript 模块而不使用 RequireJS 的骨干模型和视图 现在 我们希望开始将 RequireJS 与 j
  • 类型错误:require.config 不是一个函数

    我正在使用 require js 作为早午餐项目的一部分 这段代码抛出错误 require config require config is not a function paths jquery lib jquery underscore
  • 如何调试requireJS模块定义的路径/文件

    我是 RequireJS 世界的新手 我越来越Load Timeout error对于我已经在主文件中定义的模块之一 我在 Chrome 的 网络 选项卡中没有看到任何请求 可能是因为 require 之前已经加载了该文件 我已经迷上了on
  • Web Worker 中的 RequireJS

    我正在尝试在网络工作者中使用 RequireJS 问题是我在使用它时不断收到以下错误 Uncaught Error importScripts failed for underscore at lib underscore js 我已经测试
  • system.js可以替代require.js吗

    我在一个大型项目中使用 requirejs 该项目很快就会升级到 Angular2 Angular2 使用 system js 所以我也在考虑切换到 system js 我是否应该能够删除对 requirejs 库的引用并包含 system

随机推荐

  • Android 通知管理器在屏幕关闭时不起作用

    我有一个倒计时器 当它关闭 到零 时 它会检查应用程序是否具有焦点 如果没有 它会在通知栏中启动通知 当您单击通知时 将重新打开应用程序 现在所有这些都工作正常 但如果屏幕碰巧关闭 计时器会继续运行 并且通知会在正确的时间可用 但在我重新打
  • 如何识别 Teradata 用户的所有权限?

    我正在寻找一种方法来识别授予特定数据库中用户的默认权限 我已经尝试过这个 select from dbc allrights where username user id and databasename database name 上述有
  • 像地址栏一样的资源管理器窗口[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 以与创建相反的顺序处理对象?

    我在编写的代码中遇到一个反复出现的问题 修改某些全局值 我将使用注册表值作为示例 然后尝试将修改恢复到原始状态 我想我会尝试使用 IDisposable 来解决这个问题 创建时 该对象将读取注册表值 将其存储在本地 然后对其进行修改 当被破
  • 以编程方式配置 Eclipse 安装的 JRE

    我想将 Eclipse 环境配置为使用 JDK 而不是标准 JRE 我这样做是因为我使用 m2eclipse 它需要 JDK 中的 tools jar 才能运行 我在 Windows 7 32 位和 JDK 1 6 0 16 上运行 Ecl
  • clang format 可以格式化 C/C++ 函数以在逗号之前打破参数列表吗?

    我注意到你可以做到这一点 From https clang llvm org docs ClangFormatStyleOptions html https clang llvm org docs ClangFormatStyleOptio
  • 为什么 document.body.offsetHeight + document.body.bottomMargin 不等于 document.documentElement.offsetHeight

    我正在尝试计算 iFrame 的高度 但不明白为什么 document body offsetHeight document body bottomMargin 不相等 document documentElement offsetHeig
  • 哈斯克尔空间泄漏

    all 在尝试解决一些编程测验时 https www hackerrank com challenges missing numbers https www hackerrank com challenges missing numbers
  • Postgresql 增量物化视图维护 (IVM) 挑战,为什么再次推迟到目标版本 16? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 来自 commit fest 的最新消息https wiki postgresql org wiki Incremental View Main
  • 在进程启动之前向进程注入 dll 的优雅方法

    我正在制作一个 mod dll 来修改目标进程的行为 我成功地注入了我的dll并挂钩了目标的一些函数 但是 当我需要在主模块启动之前 更清楚地说 在入口点之前 挂钩一些 API 时 需要做更多的工作 我需要使用 CREATE SUSPEND
  • 如何将 270 度旋转的文本对齐到左上角?

    这应该是一个你会想到的非常简单的问题 我有一个带有一些标题文本的框 我想将其旋转 90 度 我希望它是绝对定位的 以便单词的末尾被轻推到左上角 我可以很容易地将其对齐到底部 但问题是 对于可变长度文本 在对齐到顶部时似乎不可能始终将其保留在
  • Java 中的日语字符编码

    这是我的问题 我现在正在使用 Java Apache POI 读取 Excel xls 或 xlsx 文件 并显示内容 电子表格中有一些日语字符 我得到的所有日语字符都是 在我的输出中 我尝试过使用Shift JIS UTF 8等多种编码方
  • 抽象超类中的通用 @Inject'd 字段

    考虑一组类似 MVP 的类型 存在一个抽象的 Presenter 带有一个 View 接口 public interface View public abstract class AbstractPresenter
  • 在 TextView 中省略文本大小而不指定 maxLines

    我有一个 TextView 其高度会根据屏幕中的其他组件而变化 我要在此 TextView 中设置很长的文本 因此我想省略它 简单地指定 android ellipsize end 是行不通的 只有同时指定 maxLines 时 椭圆化才起
  • 将图像序列转换为视频文件 android java

    我知道这是一个老问题 我对此进行了很多研究 但似乎没有适当的解决方案 我已经看到了一些方法可以做到这一点 例如 使用 FFmpeg 但它取决于本机代码 所以对我来说不是一个选择 Xuggler API 与上面的原因相同 我正在寻找可以将多个
  • 如何使用R连接两台计算机?

    是否可以在两台不同计算机上的两个 R 会话之间打开通信流 如果会话位于同一台计算机上 我使用套接字来连接会话 我想对于两台不同的计算机 我应该尝试网络套接字 httpuv支持 R 作为 Web 套接字服务器 但不幸的是 我找不到任何支持 R
  • WPF MVVM 在代码后面绑定动态控件并传入View

    我正在使用 MVVM 开发 WPF 应用程序 我有两页 我在第 1 页中有多个 UserControl 在从第 1 页选择 UserControl 时 我想在第 2 页中显示所选的 userControl 下面是我的代码 视图模型代码 pu
  • 无法在 Android Studio 中启动模拟器

    我尝试在 ubuntu 14 04 中的 android Studio 模拟器中启动应用程序 它显示以下错误 gradle 构建过程中显示错误 home next NTE MachineSetup android sdk linux too
  • JSF 和 f:ajax 用于隐藏/显示 div

    我正在考虑在我的网络应用程序上制作一个可隐藏 可显示的菜单 在此之前 我为此目的广泛使用了 PHP 和 AJAX 然而 由于 HTML 元素 id 在 JSF 框架中重新生成 我发现这种方法至少在我的范围内不再可行 我已经阅读了 JSF 中
  • AMD 结构化网络应用程序中的 Mixpanel 2.2 - 例如需要.js

    我正在尝试在基于 Backbone js 和 require js 的单页面站点中使用 Mixpanel 事件跟踪 看着snippet https mixpanel com help reference tracking an event