2013-02-25 19 views
0

Я использую RequireJS для загрузки всех моих javascript в виде модулей AMD. В частности, я использую конфигурацию «прокладки» для загрузки модулей без AMD.Как интегрировать mixpanel и requirejs?

Но я получаю объект «undefined», когда я пытался загрузить MixPanel.

Вот соответствующие файлы, с моей удачно подобранной Stripe js для сравнения.

main.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); 
}); 
+0

Стоит отметить: первый аргумент, который вы передаете в define, должен быть * массивом * не _объектом –

+0

, что было ошибкой в ​​моем вопросе. обновлено. –

ответ

0

Я не знаком с подкладкой, но мне кажется, что вы должны иметь

'mp': { 
    exports: 'mixpanel' 
} 

, так как библиотека Mixpanel обнажает, что не window.MP.

+0

Я тоже это пробовал, но это не сработало. MixPanel делает что-то очень странное в пространстве имен. –

+0

Не могли бы вы рассказать о том, что произошло, когда вы это пробовали? – raylu

+0

Когда я попробовал предложенную конфигурацию shim, мой скрипт 'track.js' имел' MP === mixpanel', хотя 'mixpanel' должен был быть удален из глобального пространства имен. Кроме того, не все команды 'MP.track()' или 'mixpanel.track()' действительно работали. –

2

Я обнаружил, что фрагмент панели микширования, который, я думаю, вы используете в libs/mixpanel/mixpanel.js, добавляет асинхронный тег <script>, который загружает полную библиотеку mixpanel. Поскольку RequireJS предотвращает привязку переменной mixpanel к окну, она никогда не обновляется.

Я все еще пытаюсь выяснить, как заставить его работать, и отредактируйте этот ответ, если я это выясню.

Edit:

Я обнаружил, что mixpanel ожидает, чтобы иметь возможность переназначить window.mixpanel. Так что в вашем случае вы могли бы сделать что-то вроде:

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

И обработчиков для mixpanel должны затем использовать window.mixpanel так как это будет реальный случай.

+0

Спасибо за ответ. Таким образом, нет реального решения AMD. Вы всегда должны использовать window.mixpanel, да? –

+0

Похоже, http://stackoverflow.com/questions/17729068/mixpanel-2-2-within-am-amd-structured-web-app-e-g-require-js имеет лучший вопрос и ответ. Согласитесь? Думая об удалении моего Q. –

+1

@EvanHammer, который действительно выглядит как лучший ответ. Если бы я по-прежнему полагался на Mixpanel напрямую, это было бы направление, в котором я бы пошел (мы перешли на Segment.io для обработки наших отслеживаний и аналитики). –