Node.js – 如何获得相对需求path?

我有一个模块,像这样工作:

/helpers/importer/Import.js

function importer(requiredModulePath, toImport) { requiredModulePath = requiredModulePath.replace('{env}', browser.params.env); var requiredModule = require(requiredModulePath); return requiredModule[toImport] || requiredModule.default || requiredModule; } module.exports = importer; 

我使用它来dynamic导入模块属性,例如下面的“URL”模块:

/example/URLs.js

 module.exports = { default: 'http://google.com', a: 'http://a.com', b: 'http://c.com' }; 

我这样做是这样的:

/example/myExecutingModule.js

 var Import = require('../helpers/importer/Import'); //var URL = Import('./URLs'); //This path does not work var URL = Import('../../example/URLs'); //This path does work, as the URL is relative to Import.js [ ... ] 

我的问题在于,不像其他所有人都在堆栈溢出,他们需要绝对path,我想要的是相反的。 我想提供相同的path给我的导入函数,我会提供要求 – 这是相对于myExecutingModule.js,在这种情况下:'./URLs'。 然而,似乎我的“import商”function已经closures了相对于其path的“需求”function。 有没有什么办法来写它,以便“require”将相对于调用importer()的模块? 当我input这个,感觉像唯一的方法是将“require”传递到Import.js模块,我觉得这是有点荒谬的

编辑:在进一步思考后,我猜测,答案涉及到调用模块的require函数的导入closures,如下所示:

 var Import = require('../helpers/Import')(require); 

然后在Import.js中输出

 module.exports = function (require) { [...] return importer; }; 

导入器函数中的“require”是调用模块将要使用的实际的require函数。 我还没有尝试过这个方法,而且我还希望能有更好的答案,所以我现在就把这个问题留下来

您可以使用设置为当前模块所在目录的__dirname + '/URLs' 。例如: __dirname + '/URLs'

尝试本地模块包。 我已经在节点0.10和io.js 2.3的生产环境中使用它,至今没有任何问题。

https://www.npmjs.com/package/local-modules

https://github.com/intesso/local-modules

这是我现在使用的解决scheme。 从调用模块向导入模块传递“要求”,以便相对于调用模块的位置导入。

 var import = require('../helpers/Import')(require); var URL = import('./URLs'); 

然后Import.js使用调用模块的require而不是自己的:

 module.exports = function (require) { function importer(requiredModulePath) { [ ... ] var requiredModule = require(requiredModulePath); return requiredModule[toImport] || requiredModule.default || requiredModule; } return importer; }; 

感觉有点奇怪,但是,你可以做什么