簡體   English   中英

Node.js - 如何獲得相對需要的路徑?

[英]Node.js - How to get relative require paths?

我有一個像這樣工作的模塊:

/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”模塊:

/示例/URLs.js

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

我這樣做:

/示例/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 相關的路徑,在這種情況下:'./URLs'。 但是,似乎我的“importer”函數對與其路徑相關的“require”函數有閉包。 有什么方法可以編寫它,使“require”與調用 importer() 的模塊相關? 當我輸入這個時,感覺唯一的方法是將“require”傳遞到 Import.js 模塊中,我覺得這有點......荒謬

編輯:在進一步考慮之后,我猜測答案涉及在調用模塊的 require 函數上提供導入閉包,如下所示:

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

然后 Import.js 中的導出將是

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

導致導入器函數中的“require”成為調用模塊將使用的實際 require 函數。 我還沒有嘗試過這個,我正在等待一個更好的答案,所以我現在將這個問題保持開放

您可以使用__dirname設置為當前模塊所在的目錄。例如: __dirname + '/URLs'

試試local-modules包。 到目前為止,我已經在 node 0.10 和 io.js 2.3 的生產中使用它,沒有任何問題。

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

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

這是我現在使用的解決方案。 將“require”從調用模塊傳遞給導入模塊,以便它相對於調用模塊的位置進行導入。

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

感覺有點奇怪但是你能做什么

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM