requireJS - несоответствие анонимного модуля define() в многостраничной оболочке

Я следую шаблону обмена многостраничными прокладками здесь: https://github.com/requirejs/example-multipage-shim

Я использую тот же common.js и у меня очень похожая и простая настройка:

<script src="js/library/requirejs/require.min.js"></script>
<script>
require(['./js/config/common'], function (common) {
  //go on...
});
</script>

Все загружается нормально, и я могу продолжать выполнять операции внутри запроса на закрытие, но я продолжаю получать сообщение об ошибке в Firefox, жалующееся на несоответствие анонимного модуля define() с приведенным выше кодом. Учитывая, насколько это просто и что я почти точно следую шаблону примера, я немного смущен тем, почему я его получаю. Я нигде не использовал define(). Изменилось ли что-то в requireJS за последние 24 дня (с момента обновления многостраничного репозитория git)?


person Dan    schedule 03.06.2013    source источник
comment
Есть ли автономный JSFiddle, который вы можете опубликовать, иллюстрирующий проблему? Вы говорите, что это очень похоже на пример, но как точно :-)   -  person explunit    schedule 04.06.2013
comment
К сожалению, я работаю над огромной платформой, и если я разберу то, что я сделал выше, в jsfiddle, все будет работать нормально. Это наводит меня на мысль, что на странице может быть проблема или конфликт с чем-то еще. Однако одно странное замечание: если просто поместить пустое определение (функция () {}) в common.js, ошибка не выдается, как только я ссылаюсь на requirejs.config() (даже без аргументов), я получаю ошибку. ..   -  person Dan    schedule 04.06.2013
comment
Хорошо, я считаю, что проблема такая же, как и здесь: .com/questions/15371918/, поскольку проблема возникает, когда я использую requirejs в определении анонимного модуля. В документах говорится, что это проблема, когда оптимизатор не используется, и говорится, что для ее устранения используйте оптимизатор. Вопрос в том, как именно мы должны обойти это при разработке, т.е. работая в неоптимизированной среде??   -  person Dan    schedule 04.06.2013
comment
Еще более странные вещи, если я поставлю alert() перед строкой //go on... выше, ошибка не произойдет.   -  person Dan    schedule 04.06.2013


Ответы (2)


Ответ был таким, надеюсь, это поможет кому-то:

Учитывая, что это была большая платформа, множество других вещей загружалось вне потока требований (мы медленно переходим).

Некоторые из этих ресурсов, например jquery 1.10, spin.js и т. д., были совместимы с AMD и вызывали функцию define(). В случае с spin.js он анонимно вызывал define(), что приводило к остановке загрузки, как объясняется во втором пункте ошибки Mismatched Anonymous в документации по разрешению.

Печаль во благо.

person Dan    schedule 04.06.2013
comment
Вы дали «оскорбительным» файлам идентификатор? - person Jesse Burcsik; 10.01.2014
comment
Нет, потому что мы не хотели менять сторонний исходный код, мы просто укусили пулю и внесли некоторые структурные изменения — либо мы удалили всю загрузку вызывающей нарушение библиотеки из потока RequireJS (затем ссылались на материал глобально), либо наоборот, ограничил библиотеку требованием использования только потока. - person Dan; 12.01.2014
comment
Я понимаю, как вы могли привести библиотеки-нарушители в require. Я не понимаю первый пример, который, я думаю, может быть нужным мне решением. – Вы сказали, что мы удалили всю загрузку вызывающей нарушение библиотеки из потока RequireJS. Исходя из вашего первоначального вопроса, я подумал, что оскорбительные файлы JS уже отделены от вашего потока requreJS. (как и моя ситуация). Я не могу их ввести. - person Jesse Burcsik; 15.01.2014
comment
Например, у нас было много несоответствий с Handlebars и jQuery, поскольку они оба часто использовались в потоке и вне потока и вызывали коллизии. Поэтому нам просто нужно было удалить все ссылки на jQuery и H-бары внутри Require и позволить всему потоку RJS ссылаться на них как на глобальные, загруженные до того, как сработает первый require(). Не идеально, так как Require — это то, к чему мы пытаемся двигаться, но мы должны были сделать это тем временем. Итак, любой именованный модуль, который вызывается внутри вашего потока Require, удалите его и просто загрузите до того, как запустится функция require(). - person Dan; 16.01.2014

Понятно, что происходит. Вы пытаетесь загрузить модуль, но в вашем common.js есть только require.config, а модуля нет. Поэтому обновленный RequireJS (не Firefox) выдает ошибку. Включите определение в свой общий JS, и ошибка должна исчезнуть.

// common.js stuff...
define({});
person Tomas Kirda    schedule 03.06.2013
comment
Боюсь, это не так, RequireJS строго не требует загрузки определения AMD. Кроме того, код не заключен в модули в образце шаблона, и его написал кто-то, близкий к проекту RequireJS. Наконец, я попробовал это, и все еще получаю ошибку. Спасибо за попытку! - person Dan; 04.06.2013