使用非AMD兼容的javascript模块与require.js?

时间:2011-12-30 03:26:50

标签: javascript backbone.js requirejs tastypie

我正在使用require.js来帮助组织我的基于Backbone.js的应用程序。

我正试图找出使用与AMD不兼容的第三方javascript库的正确方法require.js

问题中的图书馆是backbone-tastypie.js。基本上,库所做的是monkeypatch Backbone的一些原型方法,以便为TastyPie Django REST框架提供更简单的支持。它通过直接操作全局命名空间中的Backbone对象来实现这一点。

但是,由于我使用Backbone.js作为require.js模块,因此当该库试图访问它时它不可用。

如何在Backbone范围内导入此主干 - tastypie?

3 个答案:

答案 0 :(得分:12)

更新:我已经分享了一个名为backbone-tastypie-amd.

的兼容AMD的骨干网。

虽然sander的解决方案可行,但每次你想要骨干时,做整套嵌套需要的东西都有点烦人。

backbone-tastypie是所谓的“传统脚本”。您可以通过4种方式解决问题。

  1. 让骨干 - tastypie AMD兼容自己。您可以通过以下两种方式之一完成此操作。选项1将永远不包括骨干 - 只有骨干 - tastypie。然后修改骨干tastypie以确保需要骨干网。

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

    然而,这不是很好,因为在骨干 - tastypie加载(同步)之后,它本质上将开始下载骨干。它也没有让requirejs完全理解这些模块是如何相关的,这就是正确的观点。所以让我们将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优化版骨干right here.假设您正在使用此AMD版本,您现在可以直接进入并在您的应用中需要骨干 - tastypie(通过在define()或实际需求中要求它( )功能)。您也不必包含主干或下划线,因为这些依赖项由requirejs解析。

  2. 使用require.js ordering plugin。这会强制按顺序加载(在某些方面仍然是异步的,因为它随时下载它们,但按正确的顺序进行评估)

    require(["order!backbone.js", "order!backbone-tastypie.js"], function () {
         //Your code
    });
    
  3. 将backbone.js放入priority config。无论如何,这都会强制主干及其依赖关系始终首先加载。

  4. 将backbone-tastypie追加到与backbone.js相同的文件中。每次加载主干时,骨干都会加载。哈克?是。但这与使用jquery with requireJS的推荐方式非常相似(jquery插件需要加载jquery - 就像backbone-tastypie需要加载主干一样)。

答案 1 :(得分:9)

假设您已正确设置路径,以下内容适用于RequireJS 2.1.0+。

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

答案 2 :(得分: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...

    });
});