2013-12-14 87 views
0

我的項目中有非AMD骨幹,非AMD下劃線和非AMD jquery。我還有很多不兼容AMD的第三方庫。R.js彙編非AMD模塊

讓他們與使用r.js的AMD模塊一起編譯的最佳方式是什麼?我應該開始將所有這些包裝到AMD模塊中嗎?

我在使用非AMD庫和下劃線和骨幹的模塊上運行了r.js,它生成了一個輸出,但是在輸出的任何地方有require("backbone")調用,它會返回undefined,我懷疑它是因爲主幹沒有註冊爲AMD模塊。

同時,對我來說很奇怪的是,如果我不運行r.js並只是使用require.js加載來定期運行網站,那麼即使它們不是AMD模塊,以下行也會返回正確的值:

var _ = require("underscore") 
var Backbone = require("backbone") 

我把那些路徑配置成我的require.config中的別名。

+1

也許你可以顯示你的requirejs.config是什麼? –

回答

2

爲什麼你認爲,骨幹,下劃線或jQuery不兼容AMD?他們是這樣!只是有點不開箱。您只需要爲您的main.js添加更多配置。例如像這樣:

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

require(['jquery', 'backbone'], function($, Backbone) { 
    console.log('Type of $: ' + typeof $); 
    console.log('Type of Backbone: ' + typeof Backbone); 
}); 

沒有太多的庫,它們完全不兼容AMD(即不能通過RequireJs使用)。每個通過某些屬性暴露於全局範圍的庫都可以通過RequireJs使用。

但是,如果你想使用CommonJS的模塊(這是通過module.exports暴露),然後我看到的樣子,你有兩個選擇:

  1. 包裝你CommonJS的模塊,this
  2. 使用這種結構:

    define(function (require) { var $ = require('jquery'); })

兩個選項工作尼斯RequireJs優化,因爲我測試。

不過,我更喜歡在main.js文件中使用shim選項。