Могу ли я написать файл javascript, который дополнительно использует require.js для указания зависимостей, когда он доступен?

Мне нужно написать плагин javascript, который можно использовать как в качестве модуля AMD, так и в качестве файла javascript, отличного от AMD (синхронно загружаемого).

Он зависит от библиотек Jockey.js и jquery.

Другими словами, я хотел бы структурировать файл так, чтобы он не терпел неудачу при использовании в традиционной неасинхронной структуре html (загружается через тег скрипта, после того как его зависимости загружаются через теги скрипта), но так, чтобы он также сможет работать как модуль AMD без прокладки и указать свои зависимости. Можно ли это сделать, или это единственный способ сделать это?


person B Robster    schedule 25.01.2014    source источник


Ответы (1)


Это может быть сделано. У меня есть один такой плагин прямо здесь. Вот общая структура:

(function (factory) {
    // If in an AMD environment, define() our module, else use the
    // jQuery global.
    'use strict';
    if (typeof define === 'function' && define.amd)
        define(['jquery'], factory);
    else
        factory(jQuery);
}(function ($) {
    'use strict';

    // This is the plugin proper.
    $.fn.myMethod = function(/* ... */) {
        // Code for the method...
    };
}));

Плагин, которому нужны другие вещи, кроме jQuery, будет использовать приведенную выше структуру со следующими изменениями:

  1. Вызов define, в котором перечислены необходимые дополнительные модули.

  2. Вызов factory(jQuery) (в ветке, отличной от AMD, используется, когда RequireJS не загружает плагин), который передает дополнительные значения из глобального пространства после jQuery.

  3. Фабричная функция function ($), которая имеет дополнительные аргументы для получения переданных ей дополнительных значений.

Итак, если плагину нужен модуль foo, который экспортирует себя в глобальное пространство как foo и с конфигурацией RequireJS, которая называет его "foo", тогда:

(function (factory) {
    // If in an AMD environment, define() our module, else use the
    // jQuery global.
    'use strict';
    if (typeof define === 'function' && define.amd)
        define(['jquery', 'foo'], factory);
    else
        factory(jQuery, foo);
}(function ($, foo) {
    'use strict';

    // This is the plugin proper.
    $.fn.myMethod = function(/* ... */) {
        // Code for the method...
        foo.blah();
    };
}));
person Louis    schedule 25.01.2014
comment
Можете ли вы объяснить мне, что такое «заводская» переменная в этом случае? - person fraxture; 17.02.2014
comment
factory — это единственный параметр первой анонимной функции. В первом фрагменте кода на самом верхнем уровне у вас есть анонимная функция (function (factory) {...}), вызываемая с другой анонимной функцией (function ($) {...}) в качестве единственного параметра. Итак, когда выполняется первая анонимная функция, значение параметра factory равно function ($) {...}. - person Louis; 17.02.2014