【问题标题】:Why can I not use a variable as parameter in the require() function of node.js (browserify)?为什么我不能在 node.js (browserify) 的 require() 函数中使用变量作为参数?
【发布时间】:2015-05-17 02:20:05
【问题描述】:

我尝试了类似的方法:

var path = '../right/here';
var module = require(path);

但它无法再以这种方式找到模块,而:

var module = require('../right/here');

像魅力一样工作。想用生成的字符串列表加载模块,但我无法解决这个问题 atm。有什么想法吗?

【问题讨论】:

  • 我一直这样做,而且效果很好。 什么时候这对你来说有问题吗?因为如果您使用的是 webpack 或 browserify 之类的东西,那么是的:这会出错,因为它们只能进行静态字符串依赖解析。
  • 哦,browserify是问题所在,那么(?)有没有简单的方法来解决它?
  • 是的,但您不会喜欢它:硬编码您的要求。对于您捆绑用于生产部署的真实代码(与快速原型设计不同),几乎不需要从变量中获取,因为您将编写无法以任何方式预测并因此可能充满错误的代码。如果您需要基于不同运行的不同要求,则在启动时构建一个配置对象(使用process.env 或其他东西),当需要执行要求时,使用类似vars knox = config.offline ? require("./util/mocks3") : require("knox");
  • 猜猜这是最好的方法。想到大约 100 个模块,我仍然不寒而栗。感谢您指出这是一个browserify问题 - 很明显,考虑它是如何工作的。会听从你的建议。泰。
  • 也将其转化为答案,因为在 cmets 中获得答案并没有那么有用 =)

标签: javascript node.js reactjs browserify


【解决方案1】:

这是由于 Browserify 是如何进行捆绑的,它只能对需求重新绑定进行静态字符串分析。因此,如果您想进行 browserify 捆绑,您需要硬编码您的要求。

对于必须进入生产部署的代码(与快速原型相反,您很少会费心为其添加捆绑),始终建议坚持静态要求,部分原因是捆绑,也因为使用动态字符串满足您的要求意味着您正在编写不可预测的代码,因此可能充满了您很少遇到且极难调试的错误。

如果您需要基于不同运行的不同要求(例如,开发、阶段测试和生产),那么使用process.env 或配置对象通常是个好主意,以便在需要时决定要使用哪个库出于特定目的需要,您可以使用类似

var knox = config.offline ? require("./util/mocks3") : require("knox");

这样,您的代码也可以立即被其他需要追踪哪里出错的人访问,以防发现错误。

【讨论】:

    【解决方案2】:

    您可以使用.require() 添加要访问的文件,计算其路径,而不是在构建时保持静态,这样这些模块将被包含在内,并且在稍后调用require() 时会找到它们。

    【讨论】:

      【解决方案3】:

      您可以使用模板动态获取文件。

      var myModule = 'Module1';
      var Modules = require(`../path/${myModule}`)
      

      【讨论】:

        【解决方案4】:

        require('@/path/'.concat(fileName))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-02
          • 1970-01-01
          • 1970-01-01
          • 2018-07-24
          • 1970-01-01
          • 1970-01-01
          • 2017-01-10
          • 1970-01-01
          相关资源
          最近更新 更多