2012-03-01 2 views
4

Я пытаюсь включить jQuery Mobile в проект, который использует RequireJS для AMD, однако я не хочу загружать jQuery Mobile в качестве модуля AMD. Идея заключается в том, что мы будем использовать AMD для конкретной прикладной логики, но любые внешние зависимости библиотек, такие как jQuery, будут приведены в глобальную область, просто вручную определяя теги скриптов.Отделив jQuery Mobile (1.1.0) от AMD (RequireJS)

Проблема, с которой я столкнулась, заключается в определении тега сценария для jQuery mobile до того, как тег ScriptJS требует, чтобы RequireJS определял анонимный модуль и создавал конфликт, который я не понимаю. Я посмотрел на код jQuery и jQuery Mobile, и они настроены на условный вызов метода define(), если он существует. Поскольку я включаю те теги перед загрузкой RequireJS, они не должны звонить define(). Я дважды проверял это с помощью контрольных точек, и они действительно этого не делают.

Когда я включаю JQuery Mobile, я получаю следующее сообщение об ошибке:

Error: Mismatched anonymous define() module: [object Object]

Я не понимаю, как это происходит, если JQuery Mobile не называет define(). Что я здесь делаю неправильно? Это что-то с новой условной поддержкой AMD jQuery Mobile?

ответ

4

Чтобы подтвердить, что вы должны использовать встроенную версию jQuery mobile, и вы должны включить ее перед тегом require.js, как и так - обратите внимание, что jquery включен как тег сценария, поскольку на нем зависит jQuery mobile:

<script src="scripts/jquery.js"></script> 
<script src="scripts/jquery.mobile.js"></script> 
<script src="scripts/require.js" data-main="scripts/app"></script> 

Я ожидаю, что сработает. Ошибка, которую вы видите, может быть сгенерирована, если у вас есть сценарии, как это:

<script src="scripts/require.js" data-main="scripts/app"></script> 
<script src="scripts/jquery.js"></script> 
<script src="scripts/jquery.mobile.js"></script> 

Я считаю, что это больше проблем с RequireJS, не JQuery мобильного, то я хочу, чтобы установить для RequireJS 1,1. Но первый набор тегов скрипта должен работать.

Если это не так, было бы интересно узнать, как JS-модуль вашего приложения использует jQuery и jQuery mobile.

+0

Итак, у меня на самом деле были установлены мои сценарии, как ваш первый пример в моем проекте, и все еще получал ошибку. Я просто обнаружил, что проблема, похоже, приходит, когда также включены как jQuery Mobile 1.1.0, так и отдельная библиотека ([js-signals] (http://millermedeiros.github.com/js-signals/)), которая также условно поддерживает AMD. Я проверил, и ни одна из библиотек не вызывает определение, и все же я все еще получаю ошибку несоответствия. Я поставил быструю POC вместе [здесь] (https://github.com/jrolfs/RequireJS-External-Library-Test). Я буду продолжать изучать это, но я совершенно новый для AMD. Спасибо за вашу помощь. – tomswift

+1

Какой браузер вы тестируете? Я пробовал в Chrome и Safari и видел ошибку, но если бы я попытался в Firefox, все было в порядке. Когда я перемещал теги сценария в голову, а не внутри тела, ошибка удалялась в браузерах веб-китов. Поэтому я думаю, что это какая-то странная проблема с браузерами webkit и содержимым тела. Поэтому либо поместите скрипты в голову, либо просто загрузите все библиотеки с помощью requirejs (рекомендуется). – jrburke

+0

Это странно. Извините, я тестировал в Safari и должен был протестировать в некоторых других браузерах. Я понимаю, что рекомендуется загружать все библиотеки с требованием, но, похоже, имеет смысл иметь больше библиотек, основанных на полезности, таких как jQuery и Underscore в глобальной области, поэтому зависимости в модулях AMD - это просто модули приложений, а не libs, но я могу быть недоразумением. Еще одна второстепенная причина, по которой я настраивал этот способ, заключается в том, что многие библиотеки, похоже, догоняют AMD прямо сейчас, и это позволяет избежать жонглирования одной версией AMD. – tomswift

Смежные вопросы