包装要求
特定
3 Node.js项目Main – Framework – 存储库
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处于不断变化的状态。 有关更多信息,请参阅安装文档 。