了解Node.js中的模块

时间:2015-10-13 20:16:41

标签: node.js

我刚刚开始阅读有关Node.js的文章,有一件事我觉得很难理解,所以以为你们可能会帮忙! :)

特别是

var PI = Math.PI;

exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};

它的解释是:

  

此代码创建一个只能通过代码访问的PI变量   包含在模块中;它不能在外面访问   模块。接下来,在exports对象上创建两个函数。这些   函数可以在模块外部访问,因为它们是   在exports对象上定义。因此,PI受到完全保护   来自外界的干扰。所以,你可以放心区域()   而圆周()总是表现得像它们应该的那样(只要一个   为r参数提供了值。

现在,我觉得很困惑的是他们在模块中的含义""和"在模块之外"。到目前为止我所理解的是模块本质上就是我们所说的封装,对吧?

考虑到这一点,当他们提到:

  

此代码创建一个只能通过代码访问的PI变量   包含在模块中;它不能在外面访问   模块。

..他们是否意味着PI扮演着所谓的全局变量的角色? 另外,如果PI是全局变量,那么为什么呢:

  

PI受到完全保护

     
    

来自外界的干扰。

  

谢谢!

2 个答案:

答案 0 :(得分:0)

当您说module.exports时,您可以将这些变量/函数用于在您的代码文件中执行require的任何文件。 PI无法受到外部干扰的原因是因为您未将PI分配给module.exports对象:

module.exports.PI = PI;

因此,如果您的代码位于名为geometry.js的文件中并且您在同一目录中有另一个名为circle.js的文件,那么更进一步。 circle.js可以同时访问circumferencearea要求geometry.js中的circle.js

// circle.js
var geometry = require('geometry.js');

console.log(geometry.area(2));
console.log(geometry.circumference(2));

基本上,如果一个变量没有被添加到module.exports对象,那么它就是文件的本地变量,如果它被添加到module.exports对象,那么任何其他实现的代码都可以使用它。您的代码在require语句中。

以下是模块的一个很好的解释以及Mixu's Node Book

中的示例
  

摘自Mixu的节点手册第8章

     

模块对于在Node中构建应用程序至关重要,因为它们允许您包含外部库,例如数据库访问库 - 并且它们有助于将代码组织成具有有限责任的单独部分。您应该尝试在自己的代码中识别可重用的部分,并将它们转换为单独的模块,以减少每个文件的代码量,并使您更容易阅读和维护代码。

答案 1 :(得分:0)

我认为答案是在包含您发布的代码的开头段落中揭示的

  

var myModule = require('./myModule.js');

     

模块是封装的代码片段。模块中的代码大多是私有的 - 这意味着它们中定义的函数和变量只能从模块内部访问。但是,您可以公开要在模块外部使用的函数和/或变量。

您发布的代码为myModulePI将位于该模块内部,并且只能从模块内部访问。

在您第一次执行myModule.area()之后,您可以从模块外部执行require。但你不能myModule.PI,因为它是该模块的本地,因此除非你向export写一些内容,否则无法访问它。