鉴于
3 Node.js项目主要 - 框架 - 存储库
主要通过 npm链接连接另外两个项目。
在测试中,我在一个方法中包装了require。我在解决链接项目方面遇到了一些问题(详见下文)
简化代码如下所示:
module.export.resolve = function(file){
[...]//Some more logik to handle relative pathes
return require(file)
}
这在大多数情况下都能正常工作。我还努力解决亲戚的问题(查找调用者并根据此路径应用pathes)
现在,这是在项目框架中,它链接(npm链接)到项目主要。项目主要还与项目存储库相关联。
现在在 Project Main 我有:
require('ProjectRepositories/foo') // Works as expected
myRequire.resolve('ProjectRepositories/foo') // Returns MODULE_NOT_FOUND "Cannot find module 'ProjectRepositories/foo'
我认为问题是存储库项目未在框架项目中链接。但除了链接它们之外还有其他方法吗?
我宁愿减少依赖关系。有关于此的任何提示吗?
答案 0 :(得分:1)
您完全正确,因为项目框架 resolve
不起作用的原因是因为该项目中使用的requireFn
只知道安装在该框架中的模块。这是因为当您require
javascript文件时,节点会评估模块的JAXB内的脚本,而不是当前项目的上下文(这是依赖模块'require
的方式从顶级脚本开始工作)。
所做的事情为框架解析器提供了一种方法,使其能够使用用户指定的 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 Main require将用于解析文件。
如果您愿意并且让模块具有状态并记住它应该使用的解析器,您也可以更进一步。
var _requireFn = require;
module.exports = {
resolve: resolve,
setRequireFn: setRequireFn
};
function resolve(path) {
return _requireFn(path);
}
function setRequireFn(requireFn) {
_requireFn = requireFn;
}
另一方面,我会谨慎使用术语resolve
,因为在语义上用于查找正确的文件路径的节点中,la {{3} }。
最后,在最小化依赖关系方面,我建议使用github repos在npm中包含子项目。这在过去对我来说非常好,除非你的两个subrepos处于不断变化的状态。有关详细信息,请参阅context。