日期:2014-05-16  浏览次数:20412 次

一起读nodejs(三)----模块(Modules)

    本文是对nodejs0.8.8版本的api开发手册解读.nodejs网址

    模块(Modules) 

    stability:5 -locked

    node有一个简单的模块加载机制.在node里面文件和模块是 一对一 对应的.例如,foo.js加载在同一文件夹下的circle.js模块.

    foo.js的内容:

var circle = require('./circle.js');
console.log( 'The area of a circle of radius 4 is '
           + circle.area(4));
    circle.js的内容:
var PI = Math.PI;

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

exports.circumference = function (r) {
  return 2 * PI * r;
};
    circle.js模块以导出了area()方法和circumference()方法.为了导出一个对象,需要加上指定的exports对象.

    属于模块的变量是私有的.在这个例子中变量PI就是私有于circle.js.

    模块机制是在require('module')模块中实现的.


      环形加载(Cycles)


    当存在环形的require()调用时,当一个模块被返回被执行的时候,可能还没有加载完成,考虑下面这种情景:
    a.js:
console.log('a starting');
exports.done = false;
var b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');
    b.js:
console.log('b starting');
exports.done = false;
var a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
console.log('b done');
    main.js:
console.log('main starting');
var a = require('./a.js');
var b = require('./b.js');
console.log('in main, a.done=%j, b.done=%j', a.done, b.done);
    当main.js加载a.js的时候,a.js依次需要加载b.js.在这时,b.js试着去加载a.js.为了防止一个无穷的循环(loop),一个未完成的a.js的副本的exports导出对象被返回到b.js模块.然后b.js完成加载,然后他的exports导出对象被提供给a.js模块.

    当main.js加载完这两个模块的时候,他们都已经加载完.这个程序的输出应该这样子: