【问题标题】:Node.js dynamic relative require pathNode.js 动态相对需要路径
【发布时间】:2015-07-15 05:15:09
【问题描述】:

我需要能够在动态相对路径上使用 require() - 这意味着相对路径需要根据当前环境而改变。

这种情况的最佳做法是什么?

我想到了这样的事情:

var module = require(process.env.MY_MODULES_PATH + '/my-module');

但是环境变量不是很方便。

还有其他可能性吗?

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

编辑

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

【问题讨论】:

  • 无论如何你都应该使用path.join()
  • 模块是否总是相对于当前路径?例如,您可以使用 require('../../some/directory/my-module'); 向上两个目录并返回 some/directory/my-module
  • 环境变量到底有什么不方便的地方?只是正确设置它们是个问题吗?
  • 这很不方便,因为它是我的代码外部的东西,可以随时更改。例如,我更喜欢配置文件 - 它们更加明显和直观
  • @Randy - 不,我需要能够路由到每个 env 上的不同路径,无论当前路径如何。

标签: node.js require


【解决方案1】:

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');

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

【讨论】:

  • 这并不能解决我描述的问题。我需要能够控制/path/to/modules 在不同的环境中有所不同。你所做的只是提供一个模块,它完全符合我已经知道的......
  • 你说你不想使用环境变量。所以另一种选择是使用带有“设置”的文件。好吧,这本质上可能是您更改所需路径的设置文件。因此,在系统 X 上,您使用路径为 /path/to/modules 的文件,而在系统 Y 上,您可以使用路径为 /other/path 的类似文件。或者,如果它是基于操作系统的,那么您可以在需要的时候简单地检查操作系统 (stackoverflow.com/questions/8683895/…)。根据您的问题,您只想能够更改路径。这是一种方法。
【解决方案2】:

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

例子:

【讨论】:

    【解决方案3】:

    Webpack 需要在编译时知道要打包哪些文件,但表达式只在运行时被赋值,你需要require.context:

    /* 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');
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 2012-12-03
      • 2012-04-21
      • 2018-03-26
      • 2017-01-20
      • 2014-09-05
      • 1970-01-01
      相关资源
      最近更新 更多