2013-05-02 75 views
4

我第一次使用require.js,並且所有工作都很漂亮。但是,我開始希望進行構建。這個想法是用我所有的js和模板創建一個文件。但是,每次使用r.js時,它都只包含我主模塊的依賴關係。Require.js和r.js甚至包含子模塊的所有依賴關係

這裏是我的app.build.js:

({ 
appDir: "public/javascripts", 
baseUrl: ".", 
dir: "build", 
paths: { 
    "hbs": "lib/hbs", 
    "jquery": "lib/jquery", 
    "Handlebars": "lib/Handlebars", 
    "Backbone": "lib/backbone", 
    "underscore": "lib/underscore", 
    "bootstrap": "lib/bootstrap.min.js" 
}, 
modules: [{name: "main"}], 
shim: { 
    "bootstrap": { 
     deps: ["jquery"], 
     exports: "$.fn.popover" 
    }, 
    underscore: { 
     exports: '_' 
    }, 
    'Handlebars': { 
     exports: 'Handlebars' 
    }, 
    Backbone: { 
     deps: ["underscore", "jquery"], 
     exports: "Backbone" 
    } 
}}) 

main.js的開頭:

require.config({ 
paths: { 
    "hbs": "lib/hbs", 
    "Handlebars": "lib/Handlebars", 
    "Backbone": "lib/backbone", 
    "underscore": "lib/underscore", 
    "jquery": "lib/jquery", 
    "bootstrap": "lib/bootstrap.min.js" 
    }, 
    hbs: { 
    disableI18n: true 
    }, 
    shim: { 
    "bootstrap": { 
     deps: ["jquery"], 
     exports: "$.fn.popover" 
    }, 
    underscore: { 
     exports: '_' 
    }, 
    'Handlebars': { 
     exports: 'Handlebars' 
    }, 
    Backbone: { 
     deps: ["underscore", "jquery"], 
     exports: "Backbone" 
    } 
    } 
}); 

require(['jquery', 'Backbone', 'videos'], function($, Backbone, Videos) { // Whatever }); 

在這種情況下,最終的文件在我的構建創造 'main.js' 只包含:jquery,下劃線,主幹和視頻。我怎樣才能確保它還包含模塊videos的依賴關係,即模板'hbs!template/videos/show'。我怎樣才能確保bootstrap.min.js也被添加,即使它不是必需的? 最後,我應該刪除require.config,因爲它會定義不應該再有的路徑,因爲所有模塊都在最終文件中?

回答

3

在你的app.build.js包括你的主配置文件的鏈接,你可以刪除指定的模塊,這應該包括主模塊使用的所有依賴關係。

({ 
    ... 
    mainConfigFile: 'main.js', 
    ... 
}) 

您也可以跳過路徑和填充,因爲它已經在main中指定。貝婁是我用在我的項目的一個樣本配置和工程就像一個魅力:

({ 
    name: 'main', 
    baseUrl: '../', 
    // optimize: 'none', 
    optimize: 'uglify2', 
    exclude: ['jquery'], 
    paths: { 
     requireLib: 'require' 
    }, 
    mainConfigFile: '../main.js', 
    out: '../main.min.js', 
    // A function that if defined will be called for every file read in the 
    // build that is done to trace JS dependencies. 
    // Remove references to console.log(...) 
    onBuildRead: function (moduleName, path, contents) { 
     return contents; 
     // return contents.replace(/console.log(.*);/g, ''); 
    } 
}) 
+0

很遺憾r.js無法猜測子模塊的依賴關係。我已經通過將每個依賴項放在我的主模塊中解決了這個問題。 – charly 2013-05-18 20:15:20

7

要具有優化包括所有的嵌套的相關性,包括在你的構建文件或命令行此選項:

{ 
    findNestedDependencies: true 
} 

這使得它可以像你期望的那樣工作,而且不必將所有的依賴包括在主文件中。這有點祕密......我從來沒有在文檔中看到過這個,但是我在隨機的博客上看過它。

+0

這工作就像一個魅力。現在無需在主文件中定義所有內容。謝謝。 – 2015-07-09 07:53:26

+0

這不應該被接受嗎? – Slay 2016-03-03 14:46:52