2015-02-08 48 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 
     }); 
    } 
}