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 的相关文章

  • RequireJS:如何将变量从一个文件传递到另一个文件?

    我将 require 与骨干 骨干形式一起使用 我目前正在使用 RequireJS 将代码分成多个文件 我将模型存储在单独的文件中 并希望单独保留表单验证器 但是 我无法访问一个文件以及依赖于该文件的另一个文件中定义的变量 我得到的是Unc
  • 如何使用 gulp 构建 JavaScript 包?

    我想用gulp http gulpjs com 构建 JavaScript 文件包 例如 我的项目中有以下结构 供应商 供应商1 供应商1 js 供应商 供应商2 供应商2 js js includes include1 js js inc
  • 访问RequireJS路径配置

    我注意到文档中有一种方法将自定义配置传递到模块中 http requirejs org docs api html config moduleconfig requirejs config baseUrl js paths jquery l
  • 使用 requirejs 加载 firebase js 时出错

    我使用 RequireJS 加载 Firebase js 库 如下所示 require firebase app firebase storage function firebase firebase initializeApp fireb
  • 编写无需 requirejs 即可运行的 Requirejs 模块

    我想以某种方式创建我的模块 它们可以与 requirejs 一起使用 也可以不与 requirejs 一起使用 如果没有 require js 它们应该正常工作 所以我必须确保它们正确加载 比如以正确的顺序放置脚本标签 所以 jQuery
  • Webpack ProvidePlugin 与外部插件?

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

    我正在用 JS 为网页编写库 并通过 Webpack 编译 它 我需要在单独的 Webpack 项目中的页面上导入 需要 如 requirejs 这些库 库可以托管在两个单独的路径上 一个是相对路径 第二个是绝对路径 我如何配置 webpa
  • 未注入通过 RequireJS 从 CDN 加载 Angular

    在我的项目中 我想使用 RequireJS 并引导我的应用程序 如下所示 requirejs config baseUrl scripts vendor paths jquery https ajax googleapis com ajax
  • 如何使用 mixpanel API?

    我无法连接到 mixpanel 我尝试过使用正确的 api key 和 api secret 如下所示
  • 加载时时区返回 Uncaught TypeError 的时刻

    我正在努力将 Moment Timezone 实现到 Django 应用程序中 以便纠正从不同时区访问它的用户 并且在通过 Require js 导入文件时遇到错误 moment js moment timezone js 和 moment
  • 覆盖 require.js 中的 setTimeout

    我们在项目中使用 require js 我们需要重写设置超时时间在第 705 行 这是我们需要的代码以某种方式忽略 省略这个 setTimeout 根本 我的意思是运行它 问题是 如果我在更改版本时显式地在开源代码中更改它 代码将丢失 我应
  • Backbone.js 和 requirejs:如何将模型、视图和集合转换为 requirejs 模块?

    我正在使用backbone js开发一个javascript应用程序 也就是说 为了便于开发 我以这种方式构建我的文件 app views L movieRow js L movieDetail js models L movie js L
  • 无法使用 Require.js 调用函数

    我尝试使用 require js 为我的 node js 服务器编写一个模块 它只返回我想从 url 获取的对象 但不知何故 我无法返回用我的方法获得的值 http get 在我返回值后执行 所以我只是得到 未定义 但为什么呢 请你帮助我好
  • CommonJS 规范中概述的 Define() 协议给我带来了什么?

    我明白事情是怎样的正确的名称间距 https stackoverflow com questions 881515 javascript namespace declaration和模块模式 http www adequatelygood
  • 使用 requirejs 和 r.js 优化器时无法加载 jQuery 插件

    我的 requirejs 优化器遇到了一些麻烦 运行优化器后 我在构建 编译文件中收到一些错误消息 在没有优化步骤的情况下运行我的网络应用程序时 我没有任何错误 这是我的 client js 文件 包含配置 coffeescript req
  • 使用 require.js 缓存时的调试

    使用 require js 我注意到 依赖项通常由浏览器缓存 即使我强制页面完全重新加载 command shift R 也不会更新 为了始终拥有更新的文件 我让 require js 要求文件在 url 后添加 datestamp 这种方
  • 使用 requirejs 调用函数

    如何使用 requirejs 调用函数 这是一个过于简单的问题 但令人惊讶的是 到目前为止没有任何教程或示例能够帮助我 这是我的 html 文件中的代码
  • RequireJS 在加载/解析依赖项之前调用回调

    我遇到了 RequireJS 问题 其中我的 main js 脚本引用了一个依赖项 当运行 main js 中请求此依赖项的回调时 该依赖项已加载但未解析 我的目录结构是 index htm scripts require js main
  • 检测应用程序的阶段(alpha、beta 或生产)

    我正在使用 cordova 开发一个 android 应用程序 我希望使用三个给定的阶段来逐步发布它 IT 测试的 Alpha 合作伙伴测试版 为其他人生产 但是 我正在使用 mixpanel 来跟踪一些用户输入 Mixpanel 需要一个
  • 使用 RequireJS 的条件注释仅加载 IE7/8 jQuery

    我在我的项目中使用 Require JS 它加载 jQuery 和其他一些与整个网站和所有浏览器相关的 JavaScript 文件 但是 我需要在 Internet Explorer 7 和 8 上使用一些条件 jQuery 我尝试将其放在

随机推荐

  • 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