0

我正在使用 RequireJS 将我的所有 javascript 加载为 AMD 模块。具体来说,我使用“shim”配置来加载非 AMD 模块。

但是当我尝试加载 MixPanel 时,我得到了一个“未定义”的对象。

以下是相关文件,与我成功填充的 Stripe js 进行比较。

主.js:

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

libs/stripe/stripe.js并且libs/mixpanel/mixpanel.js(function () {})();按照文档的建议进行了通话。

我的 payment.js(包装了 Stripe):

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);
});
4

2 回答 2

2

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

我仍在试图弄清楚如何使它工作,如果我弄清楚了,我会编辑这个答案。

编辑:

我发现 mixpanel 期望能够重新分配window.mixpanel. 因此,在您的情况下,您可以执行以下操作:

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

然后应该使用 mixpanel 的处理程序,window.mixpanel因为那将是真实的实例。

于 2014-01-10T23:49:14.890 回答
0

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

'mp': {
    exports: 'mixpanel'
}

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

于 2013-02-28T22:38:48.417 回答