【问题标题】:Node.js: programmatically setting NODE_PATHNode.js:以编程方式设置 NODE_PATH
【发布时间】:2019-07-25 22:26:45
【问题描述】:

我想在 Node.js 中动态加载文件,这带来了一个问题,即 Node 在调用模块的 node_modules 中查找,而不是在正在加载的文件的 node_modules 中查找。

我不想使用require() 的原因是因为这些是插件,它们可以通过简单的连接被包含在主应用程序中。所以使用require() 会破坏插件。它们必须直接加载到主应用程序上下文中,但它们也必须能够访问它们的本地 node_modules

我使用vm.runInNewContext() 来评估代码。但是我如何将NODE_PATH 传递给runInNewContext()

【问题讨论】:

    标签: node.js


    【解决方案1】:

    由于vm.runInNewContext() 不了解您当前的上下文,也没有给它自己的新“全局”上下文,我假设以下方法可行:

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

    除非我错过了什么。如果我是,您能详细解释一下吗?

    【讨论】:

      【解决方案2】:

      要以编程方式设置 NODE_PATH,您可以在根节点文件 (source) 上运行此魔法:

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

      但是在升级节点时要小心,以免它们改变它的工作方式。

      【讨论】:

      • 如果有人尝试使用 NODE_PATH 但它不起作用,请确保您在第二行使用 _initPaths() 调用。
      • 谢谢@dwelle,它对我有用!需要注意的是,您只需在需要需要特殊 NODE_PATH 的模块之前放置代码。
      • 谢谢,使用带有 dotenv 的第二行解决了我的问题
      猜你喜欢
      • 2021-11-21
      • 2018-11-26
      • 2011-04-18
      • 2012-07-18
      • 2016-02-15
      • 2014-07-26
      • 1970-01-01
      • 2011-06-06
      相关资源
      最近更新 更多