Node.js:以编程方式设置NODE_PATH

15
我希望在Node.js中动态加载文件,但这会导致问题:Node会查找调用模块的node_modules,而不是查找要加载的文件的node_modules
我不想使用require(),因为它们是插件,并且可以通过简单地连接来包含在主应用程序中。因此,使用require()会破坏插件。它们必须直接加载到主应用程序上下文中,但同时也必须能够访问其本地的node_modules
我使用vm.runInNewContext()来评估代码。但是如何将NODE_PATH传递给runInNewContext()呢?
2个回答

34

要以编程方式设置NODE_PATH,您可以在根节点文件的顶部运行此神奇操作(来源):

process.env.NODE_PATH = "your/path";
require("module").Module._initPaths();

但是在升级节点时要保持警惕,以防他们更改其工作方式。


5
如果有人试图使用NODE_PATH却发现不起作用,请确保添加了第二行并调用了“_initPaths()”函数。 - Sean
谢谢@dwelle,它对我有用!需要注意的是,您只需要在要求需要特殊NODE_PATH的模块之前放置代码即可。 - supNate
谢谢,使用dotenv的第二行解决了我的问题。 - ospider

1

由于vm.runInNewContext()没有关于当前上下文的信息,也没有给出自己新的“全局”上下文,我认为以下方法可以解决这个问题:

var sb = { process: { env: { NODE_PATH: '/my/path/' }}};
vm.runInNewContext('process.env', sb);
// return: { NODE_PATH: '/my/path/' }

除非我漏掉了什么,如果我有遗漏,请您详细解释一下?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接