我有一个类似的模块:
/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;
我用它来动态导入模块属性,例如以下" 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
[ ... ]
我的问题在于,与堆栈溢出中的其他人不同,谁想要在他们的需求中使用绝对路径,我想要相反。我想提供与我要提供的导入功能相同的路径 - 相对于myExecutingModule.js的路径,在这种情况下:' ./ URL'。然而,它似乎是我的"进口商"函数已关闭"要求"相对于其路径的功能。是否有任何方式来写它"要求"将相对于模块调用importer()?当我打字时,感觉就像通过"要求"进入Import.js模块,我觉得有点......荒谬
编辑:在进一步思考之后,我猜测答案涉及通过调用模块的require函数提供Import闭包,如下所示:
var Import = require('../helpers/Import')(require);
然后Import.js中的导出将是
module.exports = function (require) { [...] return importer; };
导致"要求"在importer函数中,它是调用模块将使用的实际require函数。我还没有尝试过这个问题,而且我一直在寻求更好的答案,所以我现在暂时搁置这个问题
答案 0 :(得分:1)
您可以使用__dirname
设置为当前模块所在的目录。例如:__dirname + '/URLs'
答案 1 :(得分:1)
试用local-modules包。到目前为止,我已经在节点0.10和io.js 2.3的生产中使用它,没有任何问题。
答案 2 :(得分:0)
这是我现在使用的解决方案。将“require”从调用模块传递给Import模块,以便它相对于调用模块的位置进行导入。
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;
};
感觉有点奇怪,但是,你能做什么