【问题标题】:Wrapping require包装要求
【发布时间】:2015-03-31 19:23:56
【问题描述】:

给定

3 个 Node.js 项目 Main - Framework - Repositories

Main 通过 npm link 连接了另外两个项目。

在测试中,我将 require 包装在一个方法中。我在解决链接项目时遇到了一些问题(详情见下文)

简化后的代码如下所示:

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

这在大多数情况下都可以正常工作。我还想办法处理亲属路径(查找调用者并根据此路径应用路径)

现在这是在链接(npm 链接)到 Project MainProject Framework 中。 Project main 还链接了Project Repositories

现在在 Project Main 我有:

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

我认为问题在于 Repositories Project 未链接到 Framework Project。但是除了链接它们还有其他方法吗?

我希望减少依赖。有什么提示吗?

【问题讨论】:

  • 我不太清楚你的结构是什么样的。你能澄清一下吗?同时,你知道你可以拥有一个NODE_PATH env var吗?
  • 你说“按预期工作”,但你没有说它返回什么。所以,它可能会返回相同的结果。从您发布的内容来看,它的作用完全相同,只是您编写了额外的逻辑,这实际上可能会弄乱需要导入的内容。如果您创建一个直接返回require(file) 的resolve2 函数,它应该与您直接调用require('ProjectRepos/foo') 一样好。然后你可能会得出结论,我想你的自定义逻辑实际上是错误所在。

标签: javascript node.js npm commonjs


【解决方案1】:

您是绝对正确的,项目框架 resolve 不起作用的原因是因为在该项目中使用的requireFn 只知道安装在那个框架。这是因为当您 require 一个 javascript 文件时,节点会评估模块的 context 内的脚本,而不是当前项目的上下文(这就是依赖模块的 requires 从您的顶部开始工作时的工作方式-级别脚本)。

然而,您可以做的是为框架解析器提供一种方法,以便在转换路径。

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 要求将用于解析文件。

如果您想要让模块有状态并记住它应该使用的解析器,您还可以更进一步。

var _requireFn = require;

module.exports = {
  resolve: resolve,
  setRequireFn: setRequireFn
};

function resolve(path) {
  return _requireFn(path);
}

function setRequireFn(requireFn) {
  _requireFn = requireFn;
}

另一方面,我会小心使用术语resolve,因为在节点中,语义上用于查找所需的正确文件路径,例如require.resolve

最后,在最小化依赖方面,我建议使用 github repos 将您的子项目包含在 npm 中。过去,这对我来说效果很好,除非您的两个子存储库处于不断变化的状态。请参阅install docs 了解更多信息。

【讨论】:

    猜你喜欢
    • 2015-01-19
    • 2021-08-01
    • 2018-02-20
    • 2013-11-21
    • 2014-07-26
    • 2018-02-04
    • 1970-01-01
    • 2020-08-28
    • 2023-04-02
    相关资源
    最近更新 更多