2013-03-11 132 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"的方式可能是一個問題。