Подтвердить что ты не робот

Использование javascript-модуля, совместимого с AMD, с require.js?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

    var root = this;
    var Backbone = root.Backbone;
    if (!Backbone && (typeof require !== 'undefined')) Backbone = require('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, теперь вы можете идти прямо вперед и требовать базового тастипа в ваше приложение (либо требуя его в функции define(), либо в действительной функции require()). Вам также не нужно включать опорную или нижнюю линию, поскольку эти зависимости разрешаются с помощью requirejs.

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

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

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

Ответ 2

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

require.config({
  shim: {
    'underscore': {
      exports: '_'
    },
    'backbone': {
      deps: ['underscore','jquery'],
      exports: 'Backbone'
    },
    'backbone-tastypie': {
      deps: ['backbone']
    }
  }
);

Ответ 3

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

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

    });
});