2012-08-13 133 views
3

我有一個Backbone應用程序,它可以從使用Backbone的代碼中的不同位置非確定性地獲取Backbone is not defined的錯誤。有時它首先加載並且網站加載,而其他時間則不加載。我用以下爲我main.js:骨幹未定義

require.config({ 
    paths: { 
    jqueryui: 'libs/jquery/jquery-ui', 
    underscore: 'libs/underscore/underscore-min', 
    backbone: 'libs/backbone/backbone-min', 
    text: 'libs/require/text', 
    order: 'libs/require/order', 
    searchcollector: 'libs/jquery/searchcollector.plugin', 
    guiders: 'libs/jquery/guiders' 
    }, 
    shim: { 
    'underscore': { 
     exports: '_' 
    }, 
    'backbone': { 
     deps: ['underscore'], 
     exports: 'Backbone' 
    } 
    } 
}); 

require([ 
    'views/app', 
    'helpers' 
], function(app) { 
    var app = window.app = new app(); 
}); 

我在我的HTML中使用

<script data-main="/assets/js/main" src="/assets/js/libs/require/require-jquery.js"></script> 

所以jQuery是加載了要求。我從這個建議(http://stackoverflow.com/questions/8131265/loading-backbone-and-underscore-using-requirejs)SO線程,但似乎沒有工作。 Shim不應該首先加載骨幹網,然後將其全球化?任何幫助讚賞。

+1

也許不與你的問題相關,但如果您使用的依賴關係(一RequireJS 2.0功能)的「中間層」的配置,你不」需要使用訂單插件,看到這個:https://github.com/jrburke/requirejs/wiki/Plugins它說,訂單插件僅適用於RequireJS 1.0 – Diego 2012-08-14 04:11:52

+0

良好的訂單插件。事實上,當我從1.0切換到2.0並且不知道更改時,我遇到了同樣的問題(使用require2.0中的順序)。我忘記了我的問題是否與@eipark類似,但我記得它吹了我的代碼。 – jmk2142 2012-08-14 08:24:22

回答

3

不知道這是否是正確的答案,但我注意到你沒有列出jQuery作爲Backbone依賴。儘管Backbone將Underscore列爲唯一的硬性依賴項,但Backbone.View需要jquery或zepto才能正常工作。

但是,爲什麼呢,它似乎工作的一些時間?

這可能是因爲jQuery是一個AMD模塊,當你加載時,它有時會首先加載,而其他時間則不會。當它在Backbone之前加載時,它可用並且Backbone很高興。否則,也許,你會得到不好的結果。

嘗試這樣:

在你的路徑補充一點:

jquery: 'libs/require/require-jquery' 

而在你的墊片,補充一點:

'backbone': { 
    deps: ['underscore', 'jquery'], 
    exports: 'Backbone' 
} 

讓我知道你會得到什麼結果。我從來沒有使用requirejs2.0的shim特性,所以我很好奇我是否正確理解更深層次的東西。

+0

我想這不可能是問題,因爲你需要require.config加載,並且require需要與jQuery加載在同一個文件中,所以你需要jQuery並且在require.config運行之前需要。它是否正確? – eipark 2012-08-16 09:19:20

+1

我不能說明確,我仍然在學習。但我的理解是,使用require-jquery組合文件不能保證你的jquery會在你的其他腳本之前被加載。這是異步加載的本質。這就是爲什麼(我認爲)他們需要列出代幣。 [Require Shim](https://github.com/jrburke/require-jquery#use-shim-config)在文檔中,shim'd插件明確指出jquery作爲依賴關係。另請參閱[Shim](http://requirejs.org/docs/api.html#config-shim)這很有趣,所以請保持更新我的實驗。 – jmk2142 2012-08-16 11:25:22

0

在我看來,在同一個文件中加載require和jquery有點難以理解。

而設置的jQuery爲DEPS爲骨幹是假的,因爲下劃線需要jQuery的,所以正確的方法是這樣的

require.config({ 
    paths: { 
    'jquery': 'path to jquery' 
    ,'underscore': 'path to underscore' 
    ,'backbone': 'path to backbone' 
    **other paths...** 
    } 
    ,shim: { 
    jquery: { 
     exports: '$' 
    } 
    ,'underscore': { 
     deps: [ 'jquery' ] 
     ,exports: '_' 
    } 
    ,'backbone': { 
     deps: [ 'underscore' ] 
     ,exports: 'Backbone' 
    } 
    } 
}); 

它的脊樑之前加載最後你的標籤腳本會

<script data-main="/assets/js/main" src="/assets/js/libs/require.js"> 
</script> 

然後你只需要調用lib你需要這樣的

define([ 'jquery', 'underscore', 'backbone' ], 
    function($, _, Backbone) 
    { 
    // stuff 
    }); 

而對於一個模型你也許並不需要jQuery和強調所以纔打電話骨幹將工作

define([ 'backbone' ], 
    function(Backbone) 
    { 
    // Backbone.extend ? 
    });