2013-03-11 130 views
0

在我的项目中,我有一个包含多个文件的js文件夹。 js文件夹下的一个文件app.js依赖于该文件夹下的其他文件。requirejs - 无法使用相对路径加载模块

我在这里阅读(Relative module names inside define()),如果您使用“本地要求”,您可以使用相对路径加载模块。因此,举例来说,如果我有:

js 
|- app.js 
|- util.js 
|- logger.js 

然后,我可以这样做:

//in app.js 
define(function(require){ 
var util = require("./util"); 
var logger = require("./logger");  
... 
}); 

但出于某种原因,这是不是为我工作。我所看到的情况是模块util &记录器被请求相对于我在我的需求配置中定义的baseUrl。

这不是我想要发生的事情,我无法真正理解它为什么会这样做,特别是因为我的项目中有其他模块可以正确处理相对路径。

任何帮助表示赞赏。


更新

是否有可能出现这种情况是因为我现在用的是全球需要加载app.js从另一个模块?

在init.js我:

//in init.js 
require(["config"], function (config) { 
    require(["app"], function (app) { 
    }); 
}); 

难道这是造成问题的原因?

回答

0

1st。尽量避免CommonJS风格调用require去AMD风格。

CommonJS的风格:

var result = require(resource) 

AMD风格:

require([resource], function(result){}) 

RequireJS不做的CJS风格资源同步加载。它通过检查函数的主体并将需求注入到define来模拟它。你看不到它,但你写的居然还有为然:

// app.js 
define(['require', 'exports', 'module', './util', './logger'], function(require){ 
    var util = require("./util"); // <- "sync" call is ok because it's pre-loaded 
    var logger = require("./logger"); // <- "sync" call is ok because it's pre- 
}); 

你在那里进入巫术领土。尝试更明确一些事情你需要,而不是:

// app.js 
define(['./util', './logger'], function(util, logger){ 
    ... 
}); 

但是,如果你真的想用“本地”玩需要,做它在AMD的方式,因为它在所有的模块ID解析规则肯定踢:

// app.js 
define(['require'], function(require){ 
    require(
     ['./util', './logger'] 
     , function(util, logger){ 
      ... 
     } 
    ) 
}); 

而且,这部分没有任何意义对我说:

require(["config"], function (config) { 
    require(["app"], function (app) { 
    }); 
}); 

我希望"app""js/app"什么的baseUrl值 - 'js'

app.js中的路径定义了外观正确,但RequireJS解析"app"的方式可能是一个问题。