Node.js动态相对路径

Node.js动态相对路径,node.js,require,Node.js,Require,我需要能够在动态相对路径上使用require(),这意味着相对路径需要根据当前环境进行更改 对于这种情况,最佳做法是什么 我想到了这样的事情: var module = require(process.env.MY_MODULES_PATH + '/my-module'); 然而,环境变量不是很方便 还有其他的可能性吗 也许可以使用package.json安装后脚本为我设置环境变量 也许在我不知道的节点中有一个内置的解决方案 编辑 我刚刚意识到这是require()“mocking”的一个

我需要能够在动态相对路径上使用require(),这意味着相对路径需要根据当前环境进行更改

对于这种情况,最佳做法是什么

我想到了这样的事情:

var module = require(process.env.MY_MODULES_PATH + '/my-module');
然而,环境变量不是很方便

还有其他的可能性吗

  • 也许可以使用package.json安装后脚本为我设置环境变量
  • 也许在我不知道的节点中有一个内置的解决方案
编辑

我刚刚意识到这是
require()
“mocking”的一个特例。例如,对于单元测试如何模拟
require()
,是否有最佳实践?

MockedRequire.js

var path = require('path');

function MockedRequire(module) {
    return require(path.join('/path/to/modules', module));
}

module.exports = MockedRequire;
使用:

var mymodule = require('./MockedRequire.js')('mymodule');

老实说,我还没有实际测试过它,但它应该可以正常工作。

我建议使用配置加载程序。它将根据NODE_ENV变量选择路径,但比您建议的要干净得多,因为您将所有特定于环境的配置保存在一个外部文件中

示例:

  • 滚你自己的

    • Webpack需要知道在编译时捆绑哪些文件,但表达式只能在运行时给定值,您需要:


      在任何情况下都应该使用。模块是否总是相对于当前路径?例如,您可以执行
      require('../some/directory/my module')
      上下两个目录
      some/directory/my module
      。环境变量到底有什么不便之处?这是一个问题吗?这很不方便,因为这是我的代码之外的东西,可以随时更改。例如,我更喜欢配置文件——它们更明显、更容易理解intuitive@Randy-不,我需要能够路由到每个环境上的不同路径,而不管当前路径如何。这并不能解决我描述的问题。我需要能够控制
      /path/to/modules
      在不同的环境中是不同的。你所做的只是提供了一个模块,它完全符合我所知道的……你说你不想使用环境变量。因此,另一种选择是使用带有“设置”的文件。实际上,这可能是用于更改所需路径的设置文件。因此,在System X上,您可以使用路径为
      /path/to/modules
      的文件,在System Y上,您可以使用路径为
      /other/path
      的类似文件。或者,如果它是基于操作系统的,那么您只需在需要时检查操作系统()。基于你的问题,你只想改变道路。这里有一个方法。
      /* If structure like:
      
          src -
               |
                -- index.js (where these code deploy)
               |
                -- assets - 
                           |
                            --img
      */  
      
      
      let assetsPath = require.context('./assets/img', false, /\.(png|jpe?g|svg)$/); 
      
      // See where is the image after bundling.
      // console.log(assetsPath('./MyImage.png'));
      // In fact you could put all the images you want in './assets/img', and access it by index: './otherImg.jpg' 
      var newelement = {
          "id": doc.id,
          "background": assetsPath('./MyImage.png');
      };