Node.js - 如何获取相对需求路径?

时间:2015-06-24 23:10:15

标签: javascript node.js

我有一个类似的模块:

/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函数。我还没有尝试过这个问题,而且我一直在寻求更好的答案,所以我现在暂时搁置这个问题

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

试用local-modules包。到目前为止,我已经在节点0.10和io.js 2.3的生产中使用它,没有任何问题。

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

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

答案 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;
};

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