2013-02-25 65 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