【问题标题】:NodeJS - How to reference function in one require() file from another require() file?NodeJS - 如何从另一个 require() 文件中引用一个 require() 文件中的函数?
【发布时间】:2013-09-21 18:44:45
【问题描述】:

这是我第二个周末玩 Node,所以有点新手。

我有一个 js 文件,其中包含一些常用实用程序,这些实用程序提供了 JavaScript 不提供的东西。严重剪裁,看起来是这样的:

module.exports = {
    Round: function(num, dec) {
        return Math.round(num * Math.pow(10,dec)) / Math.pow(10,dec);
    }
};

许多其他自定义代码模块——也包括在 require() 语句中——需要调用实用程序函数。他们会这样打电话:

module.exports = {
    Init: function(pie) {
        // does lots of other stuff, but now needs to round a number
        // using the custom rounding fn provided in the common util code
        console.log(util.Round(pie, 2)); // ReferenceError: util is not defined
    }
};

实际运行的node.js 文件非常简单(嗯,对于这个例子)。它只是 require()'s 在代码中并启动自定义代码的 Init() fn,如下所示:

var util = require("./utilities.js");
var customCode = require("./programCode.js");

customCode.Init(Math.PI);

好吧,这不起作用,我收到来自 customCode 的“ReferenceError: util is not defined”。我知道每个所需文件中的所有内容都是“私有的”,这就是发生错误的原因,但我也知道保存实用程序代码对象的变量必须存储在某个地方,可能挂在 global 之外?

我搜索了global,但没有看到对utils 的任何引用。我正在考虑在自定义代码中使用 global.utils.Round 之类的东西。

所以问题是,鉴于实用程序代码可以被称为任何东西(var u、util 或实用程序),我到底该如何组织它以便其他代码模块可以看到这些实用程序?

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    至少有两种方法可以解决这个问题:

    1. 如果您需要文件中其他模块的某些内容,只需 require 即可。这很简单。
    2. 提供实际为您构建模块的东西。我稍后会解释。

    但是,您当前的方法将不起作用,因为 node.js 模块系统不提供全局变量,因为您可能期望它们来自其他语言。除了使用module.exports 导出的东西之外,您从所需模块中什么也得不到,并且所需模块对被要求者的环境一无所知。

    require

    为了避免上面提到的差距,你需要预先要求另一个模块:

    // -- file: ./programCode.js
    var util = require(...);
    
    module.exports = {
        Init: function(pie) {
            console.log(util.Round(pie, 2));
        }
    };
    

    requires 已缓存,所以此时不​​要过多考虑性能。

    保持灵活

    在这种情况下,您不会直接导出模块的内容。相反,您提供一个 constructor 来创建实际内容。这使您可以提供一些额外的参数,例如您的实用程序库的另一个版本:

    // -- file: ./programCode.js
    module.exports = {
        create: function(util){
          return {
            Init: function(pie) {
              console.log(util.Round(pie, 2));
            }
          }
        }        
    };
    
    // --- other file
    
    var util     = require(...);
    var myModule = require('./module').create(util);
    

    如您所见,当您调用create 时,这将创建一个 对象。因此,作为第一种方法,它将消耗更多的内存。因此,我建议您只使用require() 的东西。

    【讨论】:

    • 多次要求同一个库并不是我看到的,这是肯定的。由于您提到的原因(关于重复和性能),它并不直观。我已经对此进行了测试,并且可以正常工作,因此感谢您的回答和解释!
    • @GeekStocks:通常我会查看您的tags,但在您的情况下,我只是假设您期望某种全球管理。 require 系统更像 Python 或 Haskell 的 import 或 C/C++ #include (但在这两种情况下都隐藏,只要你不再导出这些东西,这会导致你的问题 - 这就是其他系统)。
    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2023-03-24
    • 2014-07-07
    • 2011-03-04
    相关资源
    最近更新 更多