2013-05-29 206 views
5

我的開發配置(在 「的index.html」 文件)RequireJS是:RequireJS路徑配置

<script src="require-2.1.5.min.js"></script> 
<script> 
    require.config({ 
     baseUrl: 'js', 
     paths: { 
      angular: 'libraries/angular-1.1.5.min', 
      jquery: 'libraries/jquery-2.0.0.min', 
      underscore: 'libraries/underscore-1.4.4.min', 
      ... 
      zeroclipboard: 'plugins/zeroclipboard-1.0.7.min', 
      tablesorter: 'plugins/jquery.tablesorter-2.9.1.min', 
      ... 
     }, 
     shim: { 
      'angular': { 
       exports: 'angular' 
      }, 
      'underscore': { 
       exports: '_' 
      } 
     }, 
     packages: [ 
      { 
       name: 'index', 
       location: 'app/index', 
       main: 'main' 
      } 
     ] 
    }); 

    require(['index']); 
</script> 

但在生產我只有2個圖書館連接起來的文件和插件:

js/libraries.js // all jQuery, AngularJS, RequireJS, Underscore and other libraries concatenated 
js/plugins.js // all plugins (already an AMD modules, no need for "shim" config) concatenated 

那麼,我現在如何編寫我的配置「路徑」呢?我沒有任何'libraries/angular-1.1.5.min.js'和其他路徑。

我的解決辦法是寫:

paths: { 
     angular: 'libraries', 
     underscore: 'libraries' 
    } 

我AngularJS和下劃線到'libraries.js'文件關聯,一切都運行完美。 (不需要jQuery和所有插件 - 它們已經是AMD模塊)。

但是,這是一個正確的方式來寫路徑?我的解決方案似乎有點骯髒的解決方法,而不是最佳實踐解決方案。

我r.js建立過程:

({ 
baseUrl: 'scripts', 
paths: { 
    jquery: 'jquery-2.0.0.min', 
    ... 
    tablesorter: 'jquery.tablesorter-2.0.5.min', 
    zeroclipboard: 'zeroclipboard-1.0.7.min' 
}, 
name: 'foo/main', 
exclude: [ 
    'angular', 
    'jquery', 
    ... 
    'tablesorter', 
    'zeroclipboard' 
], 
optimize: 'uglify', 
out: 'production/js/foo.js' 
}) 

UPD 1:

我想要什麼:

www.mysite.com/about.html: 

<script src="js/libraries.js"></script><-- jQuery (already AMD), AngularJS (not AMD), RequireJS, Underscore (not AMD) and other libraries already here, only 1 http request needed //--> 
<script src="js/plugins.js"></script><-- all AMD //--> 
<script> 
    require.config({ 
     baseUrl: 'js', 
     paths: { 
      angular: WHAT I NEED TO WRITE HERE?, 
      underscore: WHAT I NEED TO WRITE HERE? 
     }, 
     shim: { 
      'angular': { 
       exports: 'angular' 
      }, 
      'underscore': { 
       exports: '_' 
      } 
     }, 
     packages: [ 
      { 
       name: 'about', 
       location: 'js', 
       main: 'about' 
      } 
     ] 
    }); 

    require(['about']); // will load "js/about.js" 
</script> 

UPD 2:

好吧,這清楚「prio rity「,所以,我不需要第一個和第二個«script»標籤(但是我需要將」require.js「與」libraries.js「分開) - RequireJS會自動加載它們。但是在「libraries.js」文件中,非AMD庫應該做什麼?

AngularJS和UnderscoreJS是非AMD模塊,這就是爲什麼我必須使用「墊片」,對吧?但爲了使「墊片」工作,我還需要使用「路徑」,因此「墊片」可以定位墊片模塊,對吧?但我仍然只有1個文件 - 「libraries.js」,我不能將它寫入「路徑」選項中...只是真的卡住了...

+0

你不應該添加那些額外的腳本標籤,require.js可以,應該爲你加載。我的回答低於優先選項的含義不清楚嗎? –

+0

這是所有與您的答案,我只是在閱讀您的更新之前進行了更新:) – artuska

回答

5

爲了預先加載通用庫代碼,您應該使用優先級配置選項。 你可以把這樣的事情在你的foo/main.js文件

require.config({ 
    priority: ["libraries", "plugins"] 
}); 

然後你的build文件看起來是這樣的。 庫和插件文件應該包含一個定義所有依賴性的定義語句,這些依賴性被認爲是通用/下載一次。

({ 
    baseUrl: 'scripts', 
    paths: { 
     jquery: 'jquery-2.0.0.min', 
     ... 
     tablesorter: 'jquery.tablesorter-2.0.5.min', 
     zeroclipboard: 'zeroclipboard-1.0.7.min' 
    }, 
    modules: [ 
     { 
      name: 'foo/main' 
      excludes: ... 
     }, 
     { 
      name: 'libraries' 
     }, 
     { 
      name: 'plugins' 
     } 
    ], 
    optimize: 'uglify', 
    out: 'production/js/foo.js' 
}) 
+0

«這個想法是,所有需要的引導代碼加載槽1文件»。例如,我在我的網站上有3個頁面:關於,投資組合,聯繫人。我用我的模塊製作了3個不同的文件(很多「定義」模塊連接成1個文件):「about.js」,「portfolio.js」,「contacts.js」。第四個文件是「libraries + plugins.js」 - 因爲我想讓瀏覽器緩存這個文件並且永遠不會再下載它。我不能將「libraries + plugins.js」代碼放到「about.js」,「portfolio.js」,「contacts.js」文件中。 – artuska

+0

啊,是的,這很有道理。我認爲你需要看看'優先'配置選項,以允許多層輸出http://requirejs.org/docs/1.0/docs/faq-optimization.html#priority –

+0

@artuska我已編輯我的問題在爲了更好地反映優先選項中的要求js –

2

您應該在兩種環境中使用相同的配置。你擁有的這個配置應該在外部文件中。當你使用r.j對其進行優化時,所有模塊已經在單個文件中,所以RequireJS只會在不加載的情況下使用它們。看起來像你需要調整你的構建過程。

結賬我最近blog post關於它。

+0

添加了我的r.js構建腳本。即使在你的blogpost之後,我不明白,如何保持我的配置對於開發和生產是一樣的(在「index.html」文件中)。 如您所見,我從最終版本中排除了一些文件,將它們放在單獨的文件(libraries.js)中,以便瀏覽器緩存它,並且不會再爲我的網站上的其他頁面下載它。 「libraries.js」包含AMD模塊庫(如jQuery,它已經是其核心中的AMD模塊)和非AMD庫(如AngularJS)。因此,在「libraries.js」文件中沒有「定義」AngularJS。 – artuska

+0

也許我應該手動讓所有庫成爲AMD模塊?我的意思是,只需編輯Angular.js文件並將其代碼包裝在「define('angular',[],function(){...})」函數中? – artuska

+0

我想這應該是有道理的那些大模塊排除構建。您可能想要檢查https://github.com/tnajdek/angular-requirejs-seed項目,其中AngularJS與RequireJS一起使用。 –