2015-06-24 2 views
2

У меня есть модуль, который работает следующим образом: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, в этом случае: ./URLs. Тем не менее, похоже, что моя функция «импортера» закрывает функцию «требовать», которая относится к ее пути. Есть ли способ написать его так, что «require» будет относиться к модулю, вызывающему импортер()? По мере того, как я печатаю это, кажется, что единственный способ - передать «требовать» в модуль Import.js, который, как я чувствую, является ... смешным

EDIT: Подумав об этом дальше, я предполагаю, что ответ предполагает отказ Импортого закрытия за вызывающий модуль требует функций, например, так:

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

, а затем экспорт в Import.js будет

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

причинения «требует» в функции импортера быть фактическая потребность в функции, которую должен был использовать вызывающий модуль. Я еще не пробовал этого, и я держусь за лучший ответ, поэтому я оставлю этот вопрос открытым на данный момент

ответ

0

Это решение я использую сейчас. Передача «требуется» модулю импорта из вызывающего модуля, так что он импортирует его по отношению к местоположению вызывающего модуля.

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

И после этого Импорт.JS использует модуль вызывающего требуют вместо своих собственных:

module.exports = function (require) { 
    function importer(requiredModulePath) { 

    [ ... ] 

    var requiredModule = require(requiredModulePath); 
    return requiredModule[toImport] || requiredModule.default || requiredModule; 
    } 

    return importer; 
}; 

ощущению немного странно, но то, что я могу сделать

1

Вы можете использовать __dirname, который установлен в каталог, в котором находится текущий модуль. Например : __dirname + '/URLs'

+0

Да, я считал что-то вроде этого, но это не позволяет мои пути передаются " Import.js "будет таким же, как те, которые были переданы в" require (str) ", т.е. Я специально хочу написать Import.js таким образом, что в этом примере работает «./URLs.js». Одна из причин, по которой я хочу этого, так это то, что моя среда IDE может определить, где находятся файлы в моей системе. Другое дело в том, что путь взаимозаменяем, использую ли я метод require() или моего модуля Import() –

Смежные вопросы