2013-02-25 51 views
0

我使用RequireJS将所有JavaScript作为AMD模块加载。具体来说,我使用“shim”配置来加载非AMD模块。如何整合mixpanel和requirejs?

但是,当我尝试加载MixPanel时,我收到了一个'undefined'对象。

这里是相关的文件,与我成功shim'ed条纹js作比较。

main.js:

require.config({ 
    paths: { 
     stripe: 'libs/stripe/stripe', 
     mp: 'libs/mixpanel/mixpanel' 
    }, 
    shim: { 
     'stripe': { 
      exports: 'Stripe' 
     }, 
     'mp': { 
      exports: 'MP' 
     } 
    } 
}); 

libs/stripe/stripe.jslibs/mixpanel/mixpanel.js都有(function() {})();电话作为自己的单证建议。

我payment.js(它包装条纹):

define(['jquery', 'stripe'], function ($, Stripe) { 
    var key = "MY_KEY"; 
    Stripe.setPublishableKey(key); 
}); 

我track.js(它包装MixPanel):

define(['jquery', 'mp'], function ($, MP) { 
    var token = "MY_TOKEN"; 
    MP.init(token); 
}); 
+0

值得指出:你传递给define的第一个参数应该是* array *而不是_object_ – 2013-02-25 21:23:13

+0

这是我的问题中的一个错误。更新。 – 2013-02-25 21:27:11

回答

0

我不熟悉的垫片,但似乎你应该有

'mp': { 
    exports: 'mixpanel' 
} 

因为Mixpanel库公开了,而不是window.MP

+0

我也试过,但没有奏效。 MixPanel在命名空间上做了一些非常奇怪的事情。 – 2013-03-05 04:59:12

+0

你能否详细说明当你尝试时发生了什么? – raylu 2013-03-06 01:42:00

+0

当我尝试了你建议的shim配置时,即使'mixpanel'应该已经从全局命名空间中删除了,我的'track.js'脚本拥有了'MP === mixpanel'。另外,并不是所有的'MP.track()'或'mixpanel.track()'命令都能正常工作。 – 2013-03-08 00:47:29

2

我发现混合面板片段,我想你在libs/mixpanel/mixpanel.js中使用的是添加一个异步<script>标签,下载完整的mixpanel库。由于RequireJS阻止将mixpanel变量附加到窗口,因此永远不会更新它。

我仍然试图弄清楚如何使它工作,并编辑这个答案,如果我弄明白了。

编辑:

我已经发现,mixpanel希望能够重新分配window.mixpanel。所以你的情况,你可以这样做:

define(['mixpanel'], function (MP) { 
    window.mixpanel = MP; 
    window.mixpanel.init('TOKEN'); 
    ... 
}); 

而且你的处理程序mixpanel应该再使用window.mixpanel因为这将是真正的实例。

+0

谢谢你的回答。所以没有真正的AMD解决方案。你总是必须使用window.mixpanel,是吗? – 2014-01-15 14:39:55

+0

看起来像http://stackoverflow.com/questions/17729068/mixpanel-2-2-within-an-amd-structured-web-app-e-g-require-js有一个更好的问题和答案。你会同意吗?考虑删除我的Q. – 2014-01-15 14:56:31

+1

@EvanHammer确实看起来像是一个更好的答案。如果我仍然直接依赖Mixpanel,那将是我将走的方向(我们已更改为Segment.io来处理我们的跟踪和分析)。 – 2014-08-29 15:46:23