0

这是我第二个周末玩 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但没有看到任何参考utilsglobal.utils.Round我正在考虑在自定义代码中使用类似的东西。

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

4

1 回答 1

5

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

  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 是缓存的,所以此时不​​要过多考虑性能。

保持灵活

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

// -- 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()一些事情。

于 2013-09-21T18:56:45.960 回答