require.js неправильно загружает зависимости - PullRequest
2 голосов
/ 01 февраля 2012

Итак, это настройка, мой базовый файл - main.js, который определяет скрипты, которые нужны на всех страницах сайта, который я создаю.Это выглядит так:

define([
        '/javascript/requirePlugins/require-order.js!http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js',
        '/javascript/requirePlugins/require-order.js!/javascript/jquery-global-plugins.js',
        '/javascript/requirePlugins/require-order.js!/javascript/globals.js'
    ], function () {
        loadFonts();
    }
);

Он загружает jQuery, некоторые плагины и файл сценария globals.На одной странице я пытаюсь загрузить плагин jQuery, но плагин пытается загрузить перед загрузкой jQuery.Выглядит это так:

    require(['/javascript/requirePlugins/require-order.js!/main','/javascript/requirePlugins/require-order.js!/javascript/3rdparty/lemon-slider-0.2.js'], function () {
        $j('#carousel<%= ClientID %>').lemmonSlider({loop:false});
    });

Функция не соответствует запрошенному порядку.Я не уверен, что могу даже вложить упорядоченные функции, подобные этой.Я также пытался просто применить jQuery в качестве зависимости, но это также не удается:

    require(['/javascript/requirePlugins/require-order.js!/jquery','/javascript/requirePlugins/require-order.js!/javascript/3rdparty/lemon-slider-0.2.js'], function () {
        $j('#carousel<%= ClientID %>').lemmonSlider({loop:false});
    });

Любые предложения о том, где я делаю это неправильно, приветствуется, спасибо

Ответы [ 3 ]

8 голосов
/ 09 января 2013

Плагин заказа удален, и вы можете попробовать shim config для загрузки плагинов в порядке

requirejs.config({
   paths: {
        'jquery': 'https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min',
        'bootstrap': '../bootstrap/js/bootstrap.min',
        'select2': 'vendor/select2',
        'jshashtable': 'vendor/jshashtable-2.1',
        'jquery.numberformatter': 'vendor/jquery.numberformatter-1.2.3.min',
        'jq-datepicker': 'vendor/bootstrap-datepicker',
        'jq-datepicker.da': 'vendor/bootstrap-datepicker.da'
    }, 

    // Use shim for plugins that does not support ADM
    shim: {
        'bootstrap': ['jquery'],
        'select2': ['jquery'],
        'jq-datepicker': ['jquery'],
        'jshashtable': ['jquery'],
        'jquery.numberformatter': ['jquery', 'jshashtable']
    },
    enforceDefine: true
});

РЕДАКТИРОВАТЬ:

require-jquery также больше не поддерживается.

4 голосов
/ 02 февраля 2012

Плагин order полезен, если у вас есть только несколько скриптов верхнего уровня, которые вы хотите загрузить по порядку, и эти скрипты не используют API модуля, поддерживаемый requirejs.Это не очень хорошо работает, если вы смешаете его / используете для загрузки модулей, которые используют API модуля define ().

В частности, order просто гарантирует, что скрипт будет загружен первым.Тем не менее, API define () определяет другие скрипты для загрузки, и плагин заказа не знает, чтобы ждать загрузки этих скриптов.

Для этой конкретной проблемы я предлагаю использовать require-jquery.js, как предложил sinsedrix,Или оберните сценарии, которые вы используете в вызовах define (). volo может помочь вам сделать это с помощью команды amdify:

volo.js amdify path/to/lemon-slider-0.2.js depends=jquery

Кроме того, я бы установил baseUrl и использовал бы «наименование модуля» для зависимостей вместо полных путей.Это позволит оптимизатору работать правильно.Вы также можете отобразить 'order' на путь requirePlugins, что поможет снизить уровень шума в линии.Я бы также создал запись путей 'jquery', чтобы, если вы включите другие плагины в вызовы define, он отобразился обратно на jquery, загруженный в ваш файл main.js.Итак, в скрипте верхнего уровня для вашей страницы:

requirejs.config({
    baseUrl: '/javascript/',
    paths: {
        order: 'requirePlugins/require-order',
        jquery: 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min'
    }
});

Тогда ваш main.js может быть записан так:

define([
        'order!jquery',
        'order!jquery-global-plugins',
        'order!globals'
    ], function () {
        loadFonts();
    }
);

Обратите внимание, что здесь использование порядка в порядке,до тех пор, пока эти зависимости сами не вызывают define ().

Но если вы упаковываете сценарии, используемые в вызовах define, вы можете избавиться от порядка!использование выше.Сохраните конфигурацию путей jquery, хотя.

0 голосов
/ 01 февраля 2012

Возможно, вам следует попробовать использовать require-jquery: http://requirejs.org/docs/jquery.html

Тогда вам не придется беспокоиться о загрузке jquery.

...