2011-12-30 5 views
13

Я использую require.js, чтобы помочь организовать приложение на основе Backbone.js.Использование не совместимого с AMD javascript модуля с require.js?

Я пытаюсь выяснить правильный способ использовать 3 участника Java-библиотека, которая не совместима с AMD require.js

В библиотеке вопросов backbone-tastypie.js. В основном, что делает библиотека, это monkeypatch некоторые из прототипов методов Backbone, чтобы упростить поддержку инфраструктуры TESTPY Django REST. Он делает это, напрямую манипулируя объектом Backbone в глобальном пространстве имен.

Однако, поскольку я использую Backbone.js как модуль require.js, он недоступен, когда эта библиотека пытается получить к нему доступ.

Как я могу импортировать эту основу-тастипию в сферу магистрали?

ответ

12

UPDATE: я раздвоенный в AMD совместимый магистральный-tastypie под названием backbone-tastypie-amd.

Хотя решение Сандера будет работать, его немного раздражает, чтобы сделать всю вложенные требовать вещи каждый раз, когда вы хотите позвоночник.

backbone-tastypie - это так называемый «традиционный сценарий». Вы можете решить проблему четырьмя способами.

  1. Сделайте спин-тастипию AMD совместимой. Вы можете сделать это одним из двух способов. Вариант 1 заключался бы в том, чтобы никогда не включать магистральную прямую - только базовую-тастипию. Затем измените базовую тастипию, чтобы гарантировать, что позвоночник необходим.

    var root = this; 
    var Backbone = root.Backbone; 
    if (!Backbone && (typeof require !== 'undefined')) Backbone = require('backbone').Backbone; 
    

    Однако это не очень хорошо, потому что в основном он начнет загрузку позвоночника после магистральная-tastypie загрузится (синхронно). Он также не дает полного понимания того, как эти модули связаны, и это верно? Так позволяет обернуть магистральную-tastypie в определения():

    (function (factory) { 
         if (typeof define === 'function' && define.amd) { 
           // AMD. Register as an anonymous module. 
           define(['backbone'], factory); 
         } else { 
           // RequireJS isn't being used. Assume backbone is loaded in <script> tags 
           factory(Backbone); 
         } 
    }(function (Backbone) { 
         //Backbone-tastypie contents 
    })); 
    

    Это, безусловно, самый лучший вариант из всего в этом ответе. RequireJS знает о зависимостях и может их разрешать, загружать и правильно оценивать. Стоит отметить, что Backbone сама загружает подчеркивание с использованием опции 1 и не определяет себя как модуль, что довольно плохо. Вы можете получить оптимизированную версию AMD магистрали right here. Предполагая, что вы используете эту версию AMD, теперь вы можете идти прямо вперед и требовать базового тастипа в своем приложении (либо требуя его в функции define(), либо в функции require()). Вам также не нужно включать опорную или нижнюю линию, поскольку эти зависимости разрешаются с помощью requirejs.

  2. Используйте require.js ordering plugin. Это заставляет вещи, чтобы загрузить в порядке (по-прежнему асинхронных в некоторых отношениях, как он загружает их каждый раз, когда, но оценивает в правильном порядке)

    require(["order!backbone.js", "order!backbone-tastypie.js"], function() { 
        //Your code 
    }); 
    
  3. Помещенного Backbone.js в priority config. Это заставляет позвоночник и его зависимости всегда загружать, несмотря ни на что.

  4. Приложите основу-tastypie к тому же файлу, что и backbone.js. Каждый раз, когда базовая платформа загружается, так же, как и базовая тастипия. Hacky? Да. Но это очень похоже на рекомендуемый способ использования jquery with requireJS (jQuery-плагинам нужен jquery для загрузки - так же, как backbone-tastypie нужна основа для загрузки).

2

Вы можете обернуть свой запрос другим, требующим , сначала загрузится плагин, а затем вы сможете сделать свое приложение.

require(["myCustomTastyPiePlugin.js"], function() { 
    //This callback is called after the one script finish loading. 

    require(["one.js", "two.js", "three.js"], function() { 
     //This callback is called after the three scripts finish loading. 

     // all your code goes here... 

    }); 
}); 
+0

Я все еще изучаю AMD, но можно ли поместить эту вложенную инструкцию require в отдельный скрипт и вернуть соответствующие объекты, объединенные как элементы составного объекта? Если это сработает, вам потребуется только один файл, когда вам нужно обоим. – user4815162342

+0

вы можете это сделать, да, вы можете добавить их в 1 требуемый блок, используя плагин заказа, чтобы убедиться, что они загружаются в правильном порядке. Впоследствии вы можете вернуть их как 2 свойства 1 нового модуля, который вы создали. Как и в моем exmaple, вы можете вернуть результат one.js, two.js и three.js в качестве свойств нового модуля. return {one: one, two: two}; – Sander

+0

Спасибо, вот что я подумал. – user4815162342

9

Следующее должно работать с RequireJS 2.1.0+ при условии, что вы правильно настроили пути.

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

  • Нет связанных вопросов^_^