Как вы используете файл JavaScript, дружественный к requirejs, без использования requirejs? I.O.W. как демодулировать?

Предположим, у меня есть JS-библиотека, аккуратно завернутая в define('myModule', function(myModule) { return myModule.someObject; });

Как я могу привязать myModule.someObject к глобальной области (пожалуйста, не спрашивайте почему, я знаю, что модульное программирование имеет много преимуществ по сравнению с размещением вещей в глобальной области), не используя requirejs или любую другую структуру обработки модулей?

Дело в том, что при разработке я хотел бы использовать requirejs. Библиотека, которую мы создаем, должна быть в состоянии быть включена кем-то, кто использует requirejs (AMD, CommonJS, что угодно), но также должна быть доступна как window.SomeObject для людей, которые не хотят использовать require просто ради возможности использовать наш SomeObject. После этапа разработки весь код будет минимизирован и запутан в один JS-файл.

Я думаю, что я просто гуглю с неправильными условиями поиска, потому что все, что я могу найти, это ответ на вопрос, как включить код, который не заключен в дружественную к requirejs функцию define.

Любые идеи по этому поводу будут очень признательны. Спасибо!

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

Мой файл (до того, как все началось) выглядел так:

(function(define, global) {
  define([a,b,c],function(theA, theB, theC) {
    return theA + theB + theC; // or something, it doesn't matter
  });
})(define, this);

Я думаю о чем-то вроде этого:

(function(define, global) {
  // same as above
})(typeof define === 'function' 
      ? define 
      : function(factory /* need more args? */) { /* solution here */ }, this);

Но я не уверен, как это правильно реализовать...


person Simon    schedule 13.08.2013    source источник
comment
Для примеров см. UMDjs, а также этот вопрос: stackoverflow.com/questions/17936854/   -  person explunit    schedule 13.08.2013


Ответы (3)


Как я могу предоставить другим пользователям библиотеку, не зависящую от RequireJS?

Это позволяет вам поставлять код, который не поставляется со всем RequireJS, и позволяет вам экспортировать любой вид API, который работает на простой веб-странице без загрузчика AMD.

Вам нужно создать файл конфигурации сборки, который использует wrap и almond.

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

person c24w    schedule 13.08.2013
comment
Круто :) без проблем. - person c24w; 15.08.2013

Я думаю, вам нужно обернуть ваши модули, чтобы к ним можно было получить доступ без requirejs:

if ( typeof define === "function" && define.amd ) {
    define( "mymodule", [], function () { 
      // do your logic
      return mystuff; 
    } );
} else {
   // do your logic
   window.mystuff = mystuff;
}

Посмотрите на jQuery в качестве примера.

person asgoth    schedule 13.08.2013
comment
Копирование jQuery здесь не является стандартом. Использование анонимного модуля всегда предпочтительнее. Добавил ответ на детали. - person Simon Smith; 13.08.2013

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

Из источника jQuery

// Register as a named AMD module, since jQuery can be concatenated with other
// files that may use define, but not via a proper concatenation script that
// understands anonymous AMD modules. A named AMD is safest and most robust
// way to register. Lowercase jquery is used because AMD module names are
// derived from file names, and jQuery is normally delivered in a lowercase
// file name. Do this after creating the global so that if an AMD module wants
// to call noConflict to hide this version of jQuery, it will work.

Джеймс Берк также подробно описывает немного подробнее.

Вместо этого я бы использовал более распространенный пример из репозитория umdjs:

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['b'], factory);
    } else {
        // Browser globals
        root.amdWeb = factory(root.b);
    }
}(this, function (b) {
    //use b in some fashion.

    // Just return a value to define the module export.
    // This example returns an object, but the module
    // can return a function as the exported value.
    return {};
}));

Другой пример, который также поддерживает CommonJS, можно найти в библиотеке reqwest:

!function (name, context, definition) {
  if (typeof module != 'undefined' && module.exports) module.exports = definition()
  else if (typeof define == 'function' && define.amd) define(definition)
  else context[name] = definition()
}('reqwest', this, function () {

    return {};

});
person Simon Smith    schedule 13.08.2013
comment
Спасибо Саймон! Полагаю, нужно много читать и тестировать. :-) - person Simon; 14.08.2013
comment
Я бы придерживался примера из umdjs, поскольку он принадлежит автору RequireJS (и такой же, как обертка, используемая с almond). - person c24w; 14.08.2013