Modules 模块

Node 使用CommonJS 的模块系统。
Node 同时也拥有一个简单的模块加载系统。在Node 的世界里,文件和模块是一一对应的,比如,以下的程序
foo.js 会向大家演示加载同一目录下的circle.js 模块。

The contents of foo.js:
foo.js 的代码:

  1. var circle = require('./circle');
  2. console.log( 'The area of a circle of radius 4 is '
  3. + circle.area(4));

The contents of circle.js:
cirle.js 的代码:

  1. var PI = 3.14;
  2. exports.area = function (r) {
  3. return PI * r * r;
  4. };
  5. exports.circumference = function (r) {
  6. return 2 * PI * r;
  7. };

模块circle.js 有两个方法area()和circumference()。为了使其对外可见,将其导出到一个特殊的对象exprots(还
可以用this 来替代exports)。此模块中的本地变量是私有的。在这个例子中,PI 便是circle 模块的似有变量,puts()
方法则是引用自系统自带模块’sys’。没有’./‘前缀的模块都是写内建的。我们将会详细讲解这个特性。

使用’./‘前缀加载的模块必须和加载模块的文件位于同一文件夹下,所以将circle.js 和foo.js 放在同一目录下。
如果不用’./‘前缀,比如require(‘assert’),那么则会在require.paths 数组指定的路径下寻找,require.paths 在我的机
器上输出如下:

[ ‘/home/ryan/.node_libraries’ ] [ ‘/home/ryan/.node_libraries’ ]
所以当呼叫require(‘assert’)是,系统会沿着如下路径寻找该模块:

  • 1: /home/ryan/.node_libraries/assert.js
  • 2: /home/ryan/.node_libraries/assert.node
  • 3: /home/ryan/.node_libraries/assert/index.js
  • 4: /home/ryan/.node_libraries/assert/index.node

有’.node’后缀的模块是Node 系统的二进制模块:可以参考’Addons’来得到更多信息。’index.js’允许我们把一个模块
作为一个目录打包。

require.paths 可以在运行时修改或者在类UNIX 系统下通过修改NODE_PATH 环境变量来达到同样的目的。