2014-11-26 2 views
2

У меня есть библиотека - назовем это SomeLib - который определен для поддержки различных модулей погрузчиков:Использование AMD определяется модуль в третьей партии, не-AMD библиотеки

(function(global, factory) { 
    if (typeof define === 'function' && define.amd) { 
     define([], factory); 
    } else if (typeof module !== 'undefined' && module.exports) { 
     module.exports = factory(); 
    } else { 
     global.UriTemplate = factory(); 
    } 
})(this, function() { 
    ... 
    // returns constructor function 
}); 

я могу легко загрузить его с RequireJS как

require.config({ 
    paths: { 
    'theLibrary: '../path/to/the/lib' 
    } 
}); 

Тогда у меня есть другая библиотека третьей стороной - назовем это AnotherLib - который внутренне использует SomeLib как

var the Lib = new SomeLib(...); 

Это означает, что SomeLib должен быть доступен по всему миру.

AnotherLib это обычный JavaScript функционального модуля

(function(){ 
    // the code 
})(); 

Это не соответствует конкретному модулю погрузчики.

Когда я включаю AnotherLib с RequireJS, я что-то вроде

require.config({ 
    paths: { 
    'theLibrary: '../path/to/the/lib', 
    'anotherLib: '../path/to/anotherLib' 
    }, 
    shim: { 
    'anotherLib: [ 
     'theLibrary' 
    ] 
    } 
}); 

проблемы в том, что я получаю неопределенное исключение на линии в AnotherLib, где он создает экземпляр SomeLib (new SomeLib(...)). Это потому, что SomeLib не определен на глобальном объекте, а скорее опубликован как модуль AMD, который AnotherLib не требует.

Могу ли я решить это так или иначе, чтобы AnotherLib был совместим с AMD и требовал SomeLib.

ответ

2

Лучше всего было бы получить совместимую с AMD библиотеку или сделать библиотеку совместимой с AMD. Последний вариант повлечет за собой изменение источника вручную или создание шага сборки, который превращает код, не совместимый с AMD, в настоящий модуль AMD. Как это сделать, зависит от того, как разработана библиотека.

Метод, который будет работать с любой библиотекой намеренно просочиться символом, что библиотека требует в глобальное пространство:

  1. Сделать anotherLib зависят от нового модуля, который вы могли бы назвать SomeLib-leak.

  2. Создайте новый модуль. Это определение не обязательно должно быть в отдельном файле. Я обычно размещаю такие «клеящие» модули до моего звонка до require.config. Модуль будет выглядеть так:

    define('SomeLib-leak', ['SomeLib'], function (SomeLib) { 
        window.SomeLib = SomeLib; 
    }); 
    

    Я намеренно имеют define установить имя модуля здесь. Как правило, вы не хотите называть define установить имя модуля, но для модулей «клея», которые размещены, как указано выше, это необходимо.

К тому времени anotherLib загружен, SomeLibrary будет в глобальном пространстве.

+0

Вот что я подумал ... В настоящее время обсуждается (1) с автором библиотеки JS.(2) было бы возможным обходным путем, хотя и не очень приятным. Большое спасибо – Juri

Смежные вопросы