2013-02-18 1 views
0

Для того, чтобы jQuery подключался к require.js, jQuery должен быть загружен после require.js. Это работает отлично, но как только я включаю плагин jQuery под названием BlockUI, который делает некоторые странные вещи AMD (see bottom of BlockUI source), я получаю ошибку несоответствия. Я знаю, что BlockUI вызывает это, потому что ошибка несоответствия выплевывает весь источник, и все работает, если я удаляю BlockUI. Не имеет значения, используйте ли require.js или нет; достаточно просто включить библиотеку.Require.js + jQuery + BlockUI вызывает ошибку несоответствия, почему?

Смотрите эту jsfiddle: http://goo.gl/4tYE7

Переключитесь на вкладку Ресурсы на левой стороне, чтобы убедиться, что все скрипты загружаются в правильном порядке. Все хорошо? Хорошо, теперь откройте консоль. POW! Кровь везде!

Я не уверен, является ли это ошибкой Require.js или BlockUI (я делаю ставку BlockUI, поскольку он немного устарел), но есть ли обходной путь для этого? Что на самом деле происходит в нижней части BlockUI? jQuery предоставляет себя в качестве модуля AMD внизу источника, почему BlockUI делает подобные вещи?

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

ответ

3

Как вы используете BlockUI? Вы требуете этого или используете его как зависимость? Взято с сайта RequireJS:

If you manually code a script tag in HTML to load a script with an anonymous define() call, this error can occur.

Also seen if you manually code a script tag in HTML to load a script that has a few named modules, but then try to load an anonymous module that ends up having the same name as one of the named modules in the script loaded by the manually coded script tag. Finally, if you use the loader plugins or anonymous modules (modules that call define() with no string ID) but do not use the RequireJS optimizer to combine files together, this error can occur.

The optimizer knows how to name anonymous modules correctly so that they can be combined with other modules in an optimized file. To avoid the error: Be sure to load all scripts that call define() via the RequireJS API. Do not manually code script tags in HTML to load scripts that have define() calls in them. If you manually code an HTML script tag, be sure it only includes named modules, and that an anonymous module that will have the same name as one of the modules in that file is not loaded. If the problem is the use of loader plugins or anonymous modules but the RequireJS optimizer is not used for file bundling, use the RequireJS optimizer.

http://requirejs.org/docs/errors.html

Если вы используете JQuery и BlockUI как модули будет работать нормально:

require.config({ 
    'paths': { 
     'jquery': 'http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min', 
     'blockUI': 'http://malsup.github.com/jquery.blockUI'  
    }, 
    'shim': { 
     'blockUI': ['jquery']  
    } 
}) 

require(['blockUI'], function(){ 
    // Don't return a value to the callback as it just augments the $.fn 
    console.log($.fn.block); 
    console.log($.fn.unblock); 
}); 

Пример - http://jsfiddle.net/Blink/ae4nr/

What is actually happening in the bottom of BlockUI? jQuery exposes itself as an AMD module at the bottom of the source, why does BlockUI do similar things?

Это известный способ поддержки AMD с плагинами и т. д. Обертка кода в функции означает, что window.jQuery может быть передан, если AMD отсутствует, иначе функция может быть передана в define, после чего jQuery будет передан ей после ее загрузки. В любом случае, весь код плагина заботится о получении объекта jQuery для использования в качестве $.

Определение «JQuery» как путь является требование использовать его с AMD поэтому плагин автора можно смело предположить, что «JQuery» будет определяться:

define(['jquery'], setup); 
+0

У меня нет много контроля над тем, как JQuery и BlockUI. Я использую Wordpress (хотя и не большой поклонник), а плагин под названием Jigoshop автоматически добавляет тег сценария BlockUI в заголовок вместе с некоторыми другими скриптами. jQuery также автоматически загружается Wordpress. Связанный jsfiddle - это в значительной степени то, что у меня происходит в моем заголовке. Мне жаль, что у меня больше контроля, но, к сожалению, я этого не делаю. В конце концов, мне все равно, что происходит в заголовке, потому что мои скрипты помещаются в нижний колонтитул. Все, что мне нужно для работы моих скриптов, - это загрузка jQuery. Вот когда все становится беспорядочным ... – qwerty

+0

... Чтобы require.js использовал jQuery в качестве зависимости, мне нужно включить require перед jQuery, но если включить require.js перед jquery, все остальное в заголовке (BlockUI, для пример) попытается зацепить себя, вызывая ошибки. Если бы я мог загрузить require.js в нижний колонтитул и как-то зависеть от jQuery для загрузки других модулей, это было бы здорово. Вы видите мою проблему? – qwerty

+0

Можете ли вы изменить плагин? Извлеките инъекцию скрипта и загрузите его самостоятельно, если потребуется? Если нет, зачем вы вообще нуждаетесь?Похоже на то, как твоя тема/плагины построены, не поддаются этому патту. –