Используя не AMD-совместимый модуль JavaScript с require.js? - PullRequest
13 голосов
/ 30 декабря 2011

Я использую require.js для организации моего приложения на основе Backbone.js.

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

.

Библиотека в вопросах backbone-tastypie.js . По сути, библиотека выполняет monkeypatch некоторые из прототипов методов Backbone, чтобы обеспечить более простую поддержку инфраструктуры REST TastyPie Django. Это делается путем непосредственной манипуляции с объектом Backbone в глобальном пространстве имен.

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

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

Ответы [ 3 ]

12 голосов
/ 31 декабря 2011

ОБНОВЛЕНИЕ: Я разбудил совместимый с AMD системный пакет-вкусняшку под названием backbone-tastypie-amd.

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

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

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

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

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

    (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 версию магистральной сети прямо здесь. Предполагая, что вы используете эту версию AMD, вы можете пойти прямо сейчас и потребовать в своем приложении backbone-tastypie (либо запросив его в define (), либофактическая функция require ()).Вам не нужно указывать основную часть или подчеркивание, так как эти зависимости разрешаются с помощью requirejs.

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

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

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

9 голосов
/ 21 февраля 2013

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

require.config({
  shim: {
    'underscore': {
      exports: '_'
    },
    'backbone': {
      deps: ['underscore','jquery'],
      exports: 'Backbone'
    },
    'backbone-tastypie': {
      deps: ['backbone']
    }
  }
);
2 голосов
/ 30 декабря 2011

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

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...

    });
});
...