包装要求

时间:2015-02-01 20:52:39

标签: javascript node.js npm commonjs

鉴于

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'

我认为问题是存储库项目未在框架项目中链接。但除了链接它们之外还有其他方法吗?

我宁愿减少依赖关系。有关于此的任何提示吗?

1 个答案:

答案 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