包装要求

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)

我假设问题是存储库项目没有在框架项目中链接.但除了链接它们之外还有其他方法吗?

我宁愿减少依赖.有什么提示吗?

Tra*_*man 1

您是绝对正确的,项目框架 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 中。这在过去对我来说非常有效,除非你的两个子存储库处于不断变化的状态。请参阅安装文档以获取更多信息。