NodeJS - 如何从另一个require()文件中的一个require()文件中引用函数?

时间:2013-09-21 18:44:46

标签: javascript node.js

这是我第二个周末玩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文件非常简单(对于此示例)。它只需要代码中的()并启动自定义代码的Init()fn,如下所示:

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

customCode.Init(Math.PI);

嗯,这不起作用,我得到一个来自customCode的“ReferenceError:util not defined”。我知道每个必需文件中的所有内容都是“私有”的,这就是错误发生的原因,但我也知道保存实用程序代码对象的变量有GOT存储在某处,可能挂在global上? / p>

我在global进行了搜索,但在那里没有看到utils的任何引用。我在考虑在自定义代码中使用类似global.utils.Round的内容。

所以问题是,假设实用程序代码可以被称为任何实际代码(var u,util或utility),我可以如何组织它以便其他代码模块可以看到这些实用程序?

1 个答案:

答案 0 :(得分:4)

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

  1. 如果您需要文件中其他模块的内容,只需要它。这很简单。
  2. 提供实际为您构建模块的内容。我将在一秒钟内解释一下。
  3. 但是,您当前的方法将不起作用,因为node.js模块系统不提供全局变量,因为您可能会从其他语言中获得它们。除了使用module.exports导出的内容之外,您无需从所需模块中获取任何内容,并且所需模块不了解所需的任何环境。

    只需require

    为避免上述差距,您需要事先要求其他模块:

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

    require被缓存,因此此时不要过多考虑性能。

    保持灵活

    在这种情况下,您不直接导出模块的内容。相反,您提供了一个构造函数,它将创建实际内容。这使您可以提供一些其他参数,例如实用程序库的另一个版本:

    // -- 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()件事。