包装要求

特定

3 Node.js项目MainFramework存储库

Main有两个通过npm链接连接的项目。

在一个testing中,我将这个require包装在一个方法中。 解决链接项目时遇到了一些问题(细节见下文)

简化的代码如下所示:

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

这在大多数情况下工作正常。 我也努力去处理亲戚的问题(寻找调用者并根据这个path应用程序)

现在,这是在项目框架链接(NPM链接) 项目主 。 项目主要也有项目存储库链接。

现在在项目主要我有:

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

我假设这个问题是, 仓库项目没有链接在框架项目 。 但有没有其他的方式,而不是链接它们?

我宁愿有更less的依赖关系。 有什么提示?

你是绝对正确的,因为项目框架 resolve不起作用的原因是因为从该项目中使用的requireFn 只知道安装在该框架中的模块 。 这是因为当你require一个JavaScript文件时,节点会在模块的上下文中评估脚本,而不是当前项目的上下文(这是从顶层脚本中依赖模块的工作方式)。

但是,您可以做的是为框架parsing器提供一种方法,一旦它转换了path,就可以使用用户指定的 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); 

所以现在你的项目主要需求将被用来解决文件。

如果需要,还可以更进一步,并使模块成为有状态,并记住它应该使用的parsing器。

 var _requireFn = require; module.exports = { resolve: resolve, setRequireFn: setRequireFn }; function resolve(path) { return _requireFn(path); } function setRequireFn(requireFn) { _requireFn = requireFn; } 

在另一个说明中,我会小心使用术语resolve因为在语义上用于查找所需的正确文件path的节点,la require.resolve 。

最后,就最小化依赖关系而言,我build议使用github repos在npm中包含你的子项目。 这在过去对我来说工作的很好,除非你的两个subrepos处于不断变化的状态。 有关更多信息,请参阅安装文档 。