我有一个系统,其中有一个"插件"主模块所需的模块本身需要一个模块,但它需要相对于主模块的目录来要求它。具体来说,我有一个包pavios
,需要一个名为pavios-eslint
的模块。 pavios-eslint
需要babel-eslint
模块的node_modules
目录中的pavios
模块,但它需要node_modules
pavios-eslint
目录中的所有内容。 1}}模块。 process.chdir()
对它没有任何影响(即intended behavior),我不知道如何在不诉诸变通办法或黑客的情况下做到这一点。任何帮助表示赞赏。
编辑:我无法控制需要babel-eslint
的代码,因此我很遗憾无法更改代码所需的代码。
答案 0 :(得分:0)
我认为你只是做错了,这就是你遇到这些麻烦的原因。您的插件应该列出require()
所执行的任何模块作为依赖项。然后,在安装模块时,NPM将负责在当前配置中为您安装,共享和/或定位这些模块。这就是依赖关系如何工作,这就是你如何避免现在的问题。为每个模块正确设置依赖项,这一切都应该为您完成。您列出为依赖项的任何模块都可以使用require("./modulename")
从模块加载。 require()
和NPM
的组合将自动为您完成。
请记住,多个模块依赖于同一个模块是完全可以的。 NPM将为您处理更新和位置,并尽可能共享公共模块。
如果您的模块依赖项是循环的,并且在初始化时加载,其中A对B执行要求而B对A执行要求,那么您有一个不同的问题需要解决。我不知道这是否涉及到这一点。
如果这还不够,那么请花更多时间在代码中解释确切的require()
树,因为您上面写的内容并不能让我完全理解您要实现的目标,为什么你不只是找到require()
子系统自然可以找到的东西。在您控制的加载序列中确切使用哪些代码或者您可以控制多少文件系统位置也不清楚。
这里的另一种可能性是,不是让模块A加载模块B然后尝试从模块A的位置加载模块C,而是可以让模块模块A第一个加载模块C,然后当它加载模块B时,它可以通过C模块句柄到模块B构造函数。这是父模块可以与子项共享其中一个模块的一种方式。