2014-02-20 55 views
1

我一直在使用RequireJS進行模塊化的Backbone應用程序。我覺得我已經掌握了這一點,但現在我們已經準備好部署了,我一整天都在與r.js作戰,而且真的陷入了困境。我設法讓應用程序構建時沒有任何錯誤,但是當我嘗試運行優化的構建時,它會忽略已經內置到我的輸出文件中的幾個文件。這裏是(編輯爲簡潔起見)build.js文件我使用:RequireJS優化生成仍然嘗試加載外部jQuery文件

({ 
    appDir: "main-app", 
    baseUrl: "js", 
    mainConfigFile: "main-app/js/main.js", 
    dir: "build", 
    optimize: "none", // for debugging this issue 
    findNestedDepencencies: false, // 'true' isn't needed, and didn't fix the issue anyway 
    removeCombined: true, 
    modules: [ 
     { name: "main", exclude: ["vendor"] }, 
     { name: "vendor" } 
    ], 
    wrap: true 
}) 

main.js的文件已在非優化模式下工作了幾個星期了。下面是該文件的一個簡化版本:

requirejs.config({ 
    shim: { 
     handlebars: { exports: 'Handlebars' }, 
     underscore: { exports: '_' }, 
     backbone: { deps: ['underscore', 'jquery'], exports: 'Backbone' }, 
     marionette: { deps: ['backbone'], exports: 'Marionette' } 
    }, 
    paths: { 
     jquery: "vendor/jquery/jquery", 
     handlebars: "vendor/handlebars/handlebars", 
     backbone: "vendor/backbone/backbone", 
     underscore: "vendor/underscore/underscore", 
     marionette: "vendor/marionette/backbone.marionette", 
     hbs: "vendor/require-handlebars-plugin/hbs" 
    }, 
    hbs: { 
     helperDirectory: "common/templates/helpers/" 
    } 
}); 

requirejs(['vendor', 'app', 'controllers'], function(Vendor, Application) { 
    Application.start(); 
}); 

vendor是一個空的模塊,只需要使用的所有第三方庫,以確保他們加載並做出優化清潔(我結束了主。 js文件與我的應用程序代碼以及一個包含所有第三方代碼的vendor.js文件)。controllers文件是相同的東西,只是與大多數應用程序模塊相反。

我遇到的問題是,在編譯和運行優化的應用後,需要仍試圖加載hbsjqueryunderscorerequirjs.config塊中列出的路徑,即使我可以看到,他們正在編入vendor.js

if (typeof define === "function" && define.amd) { 
    define("jquery", [], function() { 
     return jQuery; 
    }); 
} 

我花了很多時間一個很好的協議試圖讓hbs編譯,所以我仍然在試圖確定是否是造成問題,但我不知道怎麼會。

+0

你可以將「供應商」模塊的內容添加到問題中嗎?儘可能簡單,但仍然有可能在這個模塊中犯錯誤。 – Louis

回答

0

我終於得到了這個工作。核心問題與包含的順序有關。在main.js我切換初始化調用此:

requirejs(['vendor'], function() { 
    requirejs(['app'], function(Application) { 
     Application.start(); 
    }); 
}); 

然後,在app.js(這是一個木偶應用):

Application.on("initialize:after", function() { 
    require(['controllers'], function() { 
     ... history, setup, etc... 
    }); 
}); 

基本上,我需要確保沒有循環依賴,這沒在生產過程中不會出現。

最重要的是,我也切換到車把的AMD包裹的版本,因爲該墊片不工作,並切換exports的木偶墊片是Backbone.Marionette,因爲Marionette沒有顯示爲一個全局變量。

我發現this article對於獲取大部分路線非常有幫助。

2

您是否在尋找empy: directive

在你的構建配置,

({ 
... 
paths : { 
    'jquery' : 'empty:' 
}, 
}) 

分配到空的路徑告訴它是外部加載r.js。

+0

不幸的是,沒有。如果我只是試圖加載jQuery,那將會起作用,但問題在於所有第三方庫。 Require正試圖使用​​main的'paths'配置。js加載所有內容,而不是依賴'vendor.js'中內聯的已註冊模塊。順便說一下,如果它是優化構建中的已壓縮模塊的依賴項,則不能使用庫的CDN版本,這是我剛剛瞭解到的新內容:[重要的優化器針對「shim」config]註釋(http:// requirejs.org/docs/api.html#config-shim) –

+0

@ ken.dunnington啊,我明白了,我誤解了你的問題。 – Andrew