2015-02-01 4 views
5

УчитываяОбертывания требует

3 Node.js проекты Главной - Framework - Хранилища

Главной имеет два других проектов, связанные с помощью НОЙ ссылки.

В тесте я обернул требование в методе. У меня есть некоторые проблемы, связанные разрешающих проекты (подробности ниже)

упрощенный код выглядит следующим образом:

module.export.resolve = function(file){ 
[...]//Some more logik to handle relative pathes 
return require(file) 
} 

Это прекрасно работает в большинстве случаев. Я также работал, чтобы получить обращаться с родственниками трактов (смотрют на абонент и применить тракты на основе этого пути)

Теперь это в Framework проекта, который связан (ссылка НОЙ) в Project Main. Проект main также имеет Репозитории проекта связаны.

Сейчас в проекте Главная у меня есть:

require('ProjectRepositories/foo') // Works as expected 
myRequire.resolve('ProjectRepositories/foo') // Returns MODULE_NOT_FOUND "Cannot find module 'ProjectRepositories/foo' 

Я предполагаю, что проблема заключается в том, что Хранилища Project IST не связаны в Framework Project. Но есть ли другой способ, чем связать их?

Я бы предпочел иметь меньше зависимостей. Любые намеки на это?

+0

Мне не совсем ясно, как выглядит ваша структура. Не могли бы вы уточнить? Между тем, знаете ли вы, что у вас может быть ['NODE_PATH'] (https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders) env var? – gustavohenke

+0

Вы говорите «работает как ожидалось», но вы не говорите, что он возвращает. Таким образом, он может вернуть то же самое. Из того, что вы разместили, он делает то же самое, за исключением того, что вы написали дополнительную логику, которая может фактически испортить то, что требует импорта. Если вы создаете функцию resol2, которая напрямую возвращает 'require (file)', она должна работать так же хорошо, как ваш '' прямой вызов '' ('ProjectRepos/foo') 'invocation. Тогда вы, вероятно, пришли бы к выводу, что ваша собственная логика на самом деле лежит там, где я ошибаюсь. – EricG

ответ

1

Вы абсолютно правы в том, что причина, по которой Framework Projectresolve не работает потому, что requireFn используется в рамках этого проекта знает только о модулях, установленных в этих рамках. Это связано с тем, что при require файле javascript узел оценивает скрипт в модуле context, а не в контексте текущего проекта (так как модули зависимостей require работают со сценарием верхнего уровня).

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

module.exports.resolve = function(file, resolver) { 
    //Some more logik to handle relative pathes 
    resolver = typeof resolver == 'function' ? resolver : require; 
    return resolver(file) 
} 

Сейчас в вашем коде, вы можете сделать

myRequire.resolve('ProjectRepositories/foo', require); 

Так что теперь ваш Project Основное требуют будет использоваться для разрешения файла.

Вы также можете сделать это еще дальше, если хотите, и иметь модуль с сохранением состояния и помнить, какой резольвер он должен использовать.

var _requireFn = require; 

module.exports = { 
    resolve: resolve, 
    setRequireFn: setRequireFn 
}; 

function resolve(path) { 
    return _requireFn(path); 
} 

function setRequireFn(requireFn) { 
    _requireFn = requireFn; 
} 

На другой ноте, я хотел бы быть осторожным об использовании термина resolve, потому что в узле, который семантический используется для отрываясь правильного пути к файлу будет необходимо, а-ля require.resolve.

И, наконец, с точки зрения минимизации зависимостей, я бы рекомендовал включить ваши подпроекты в npm с использованием github repos. В прошлом это работало очень хорошо, если только ваши два подпопоста не находятся в постоянном состоянии. См. install docs для получения дополнительной информации.

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