2011-12-30 42 views
13

我正在使用require.js來幫助組織我的基於Backbone.js的應用程序。在require.js中使用非AMD兼容的javascript模塊?

我試圖找出使用第三方JavaScript庫,是不是AMD與require.js

在問題的圖書館是backbone-tastypie.js兼容的正確途徑。基本上,該庫所做的是修復Backbone的一些原型方法,以便爲TastyPie Django REST框架提供更簡單的支持。它通過直接操作全局名稱空間中的Backbone對象來完成此操作。

但是,由於我使用Backbone.js作爲require.js模塊,因此當該庫嘗試訪問它時它不可用。

我怎麼能在Backbone的範圍內導入這個backbone-tastypie?

回答

12

更新:我已付出的AMD兼容的骨幹,tastypie稱爲backbone-tastypie-amd.

雖然Sander的解決方案會工作,其有點討厭做嵌套整個需要你想骨幹每次的事情。

backbone-tastypie是所謂的「傳統劇本」。您可以通過4種方式解決問題。

  1. 使您的骨幹-tastypie AMD自己兼容。您可以通過以下兩種方式之一來完成此操作。選項1將永遠不會直接包含骨幹網 - 只有骨幹網。然後修改骨幹品牌以確保骨幹網是必需的。

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

    但是這不是很好,因爲它基本上會在主幹-stasteypie加載(同步)後開始下載主幹。它也沒有要求對這些模塊如何相互關聯的充分理解,並且這是正確的?所以讓我們在定義()包裹骨幹-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知道依賴關係,它可以解決它們,下載並正確評估它們。值得注意的是,骨幹本身使用選項1加載下劃線,並沒有將自己定義爲模塊,這是非常糟糕的。您可以獲得AMD優化版本的主幹網right here.假設您使用的是AMD版本,您現在可以直接在您的應用中使用backbone-tastypie(通過在define()或實際的require()函數中要求)。您不必包含主幹或下劃線,因爲這些依賴關係可以通過requirejs來解決。

  2. 使用require.js ordering plugin。這迫使東西以加載(仍然在某些方面異步因爲它下載他們時,但在正確的順序計算)在priority config

    require(["order!backbone.js", "order!backbone-tastypie.js"], function() { 
        //Your code 
    }); 
    
  3. 認沽Backbone.js的。這迫使骨幹及其依賴關係始終首先加載,而不管它是什麼。

  4. 將backbone-tastypie添加到與backbone.js相同的文件中。每次骨幹裝載時,主幹都是如此。哈克?是。但這與推薦使用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 2012-07-17 14:10:24

+0

您可以這樣做是的, 您可以使用訂單插件將它們添加到1個需求塊中,以確保它們按正確的順序加載。之後,您可以將它們返回爲您創建的1個新模塊的2個屬性。就像在我的例子中一樣,你可以將one.js,two.js和three.js的結果作爲新模塊的屬性返回。返回{one:one,two:two}; – Sander 2012-07-17 14:33:27

+0

謝謝,這就是我的想法。 – user4815162342 2012-07-31 21:35:29

9

假設您已經正確設置路徑,以下應該可以與RequireJS 2.1.0+一起使用。

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