Boa*_*ler 5 javascript commonjs node.js npm
特定
3 Node.js项目主要 - 框架 - 存储库
Main还有另外两个通过npm链接连接的项目.
在测试中,我在一个方法中包装了require.我在解决链接项目方面遇到了一些问题(详见下文)
简化代码如下所示:
module.export.resolve = function(file){
[...]//Some more logik to handle relative pathes
return require(file)
}
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都能正常工作 我还努力解决亲戚的问题(查找调用者并根据此路径应用pathes)
现在,这是在Project Framework中链接(npm链接)到Project Main.项目主要还与项目存储库相关联.
现在在Project Main我有:
require('ProjectRepositories/foo') // Works as expected
myRequire.resolve('ProjectRepositories/foo') // Returns MODULE_NOT_FOUND "Cannot find module 'ProjectRepositories/foo'
Run Code Online (Sandbox Code Playgroud)
我假设问题是存储库项目没有在框架项目中链接.但除了链接它们之外还有其他方法吗?
我宁愿减少依赖.有什么提示吗?
您是绝对正确的,项目框架 resolve不起作用的原因是因为requireFn该项目中的使用只知道该框架中安装的模块。这是因为当您使用javascript 文件时,节点会在模块上下文require中计算脚本,而不是在当前项目的上下文中(这就是依赖模块在顶级脚本中的工作方式)。require
但是,您可以做的是为框架解析器提供一种方法,以便在转换路径后使用用户指定的require 函数来完成其工作。
module.exports.resolve = function(file, resolver) {
//Some more logik to handle relative pathes
resolver = typeof resolver == 'function' ? resolver : require;
return resolver(file)
}
Run Code Online (Sandbox Code Playgroud)
现在在你的代码中,你可以这样做
myRequire.resolve('ProjectRepositories/foo', require);
Run Code Online (Sandbox Code Playgroud)
所以现在您的项目主要需求将用于解析该文件。
如果您愿意,您还可以更进一步,让模块有状态并记住它应该使用的解析器。
var _requireFn = require;
module.exports = {
resolve: resolve,
setRequireFn: setRequireFn
};
function resolve(path) {
return _requireFn(path);
}
function setRequireFn(requireFn) {
_requireFn = requireFn;
}
Run Code Online (Sandbox Code Playgroud)
另一方面,我会谨慎使用该术语,resolve因为在节点中,它在语义上用于查找所需的正确文件路径,例如require.resolve。
最后,就最小化依赖关系而言,我建议使用 github 存储库将子项目包含在 npm 中。这在过去对我来说非常有效,除非你的两个子存储库处于不断变化的状态。请参阅安装文档以获取更多信息。