[英]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 的生產中使用它,沒有任何問題。
這是我現在使用的解決方案。 將“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.