2015-02-08 71 views
2

我使用WebJars來管理我的JavaScript依賴項,這意味着我使用的大多數庫都在Require.js基本路徑之外。配置是自動創建的,適用於大多數庫。我只有那些調用require()加載一些內部依賴關係(通常只是外部文件)的庫的問題 - 例如when.jsRequire.js在錯誤的路徑中尋找嵌套的依賴項

這是產生的require.js配置時庫:

requirejs.config({"paths":{"when":["/webjars/when-node/3.5.2/when","when"]}}); 

此文件加載正確。但問題是,它會嘗試加載更多文件:

... 
var timed = require('./lib/decorators/timed'); 
var array = require('./lib/decorators/array'); 
var flow = require('./lib/decorators/flow'); 
var fold = require('./lib/decorators/fold'); 
... 

我希望require.js使用位置when.js以確定所需的其他文件的正確位置,我。 Ë:

/webjars/when-node/3.5.2/lib/decorators/timed.js 

但不幸的是require.js使用,而不是main.js文件作爲這顯然導致了大量的404錯誤和應用程序崩潰的基本路徑的位置。

如何告訴require.js查看正確的子目錄?

回答

2

所以根據RequireJS文檔,這似乎是正確的行爲。與CommonJS不同,每個require()調用都是使用基本路徑解析的(它相對於基本路徑而不是調用文件的位置)。

解決此問題的唯一方法(據我所知)是將依賴項配置爲一個包。包位置然後用於路徑解析而不是一般基路徑。對於提到的when包,配置應該是這個樣子:

requirejs.config({ 
    packages: [ 
    { name: 'when', location: '/path/to/when', main: 'when' } 
    ] 
}); 

要爲我所有的當前或未來的依賴自動修復此問題,我用我自己的解決方案,它加載所有WebJars作爲單獨更換Scala Play Framework loading script包。

var require = { 
    callback : function() { 
     var packages = []; 
     var shim = {}; 

     [ 
      @for(webJarJson <- org.webjars.RequireJS.getSetupJson(routes.WebJarAssets.at("").url).values()) { 
       @Html(webJarJson.toString), 
      } 
     ].forEach(function (webjar) { 
      if (webjar.paths) { 
       for (var name in webjar.paths) { 
        if (webjar.paths.hasOwnProperty(name)) { 
         packages.push({ 
          name: name, 
          location: webjar.paths[name][0].replace(/\/[^\/]+$/, ""), 
          main: webjar.paths[name][1] 
         }); 
        } 
       } 
      } 
      if (webjar.shim) { 
       for (var name in webjar.shim) { 
        if (webjar.shim.hasOwnProperty(name)) { 
         shim[name] = webjar.shim[name]; 
        } 
       } 
      } 
     });    

     requirejs.config({ 
      packages: packages, 
      shim: shim 
     }); 
    } 
}