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

Трябва да напиша javascript плъгин, който може да се използва както като AMD модул, така и като не-AMD (синхронно зареден) javascript файл.

Има зависимост от библиотеките "Jockey.js" и jquery.

С други думи, бих искал да структурирам файла, така че да не се провали, когато се използва в традиционна неасинхронна html структура (заредена чрез маркер на скрипт, след като неговите зависимости се заредят чрез тагове на скрипт), но така че той също така ще може да работи като AMD модул без подложка и ще указва своите зависимости. Може ли това да се направи, или shim е единственият начин да направите това?


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