模塊引用

var fs=require('fs');
模塊定義
//cal.js
exports.add=function(){
var sum=0,
args=arguments,
l=args.length;
while(l<1){
sum +=args[i++];
}
return sum;
};
//在另一個地方進行調用
var cal=require('cal');
exports.increment=function(val){
return cal.add(val,1);
};
//模塊標識

模塊的實現:

優先從緩存加載;

路徑分析;

文件定位;

模塊標識符分析:

核心模塊,如http,fs,path等;

.或..開始的相對路徑文件模塊;

以/開始的絕對路徑文件模塊;

非路徑形式的文件模塊,如自定義的模塊;

核心模塊;

 

模塊路徑:

文件擴展名的分析:

.js,.json,.node的形式進行查詢;

目標分析和包:

node在當前目錄下先查找package.json;用JSON.parse()通過main屬性指定的文件名進行定位;如果擴展名有的話就進行分析,有錯誤找不到就找index,按照index.js,index.json,index.node查找;然後再找下一個路徑下的文件;

每一個編譯執行成功的模塊都會將其文件路徑作為索引緩存在Module._cache對象上,提高二次引入的性能;

編譯執行;

(function(exports,require,module,__filename,__dirname){
var math=require('math');
exports.area=function(radius){
return Math.PI*radius*radius;
};
});

 

// 在node中,每個文件模塊都是一個對象;定義如下
function Module(id,parent){
    this.id=id;
    this.exports={};
    this.parent=parent;
    if(parent && parent.children){
        parent.childern.push(this);    }
    this.filename=null;
    this.loaded=false;
    this.childern=[];
}
// JSON 的調用如下
Module._extensions['.json']=function(module,filename);
var content=NativeModule.require('fs').readFileSync;
try{
    module.exports=JSON.parse(stripBOM(content));}catch(err){
err.message=filename+': '+err.message;
throw err;
} 
//會改變形參的引用和作用域外的值
var change=function(a){
a=100;
console.log(a);//100
}
var a=10;
change(a);
console.log(a);//10

 

JSON文件直接require就可以了,不用再用fs加載;JSON.parse()外部調用;src

C/C++模塊用process.dlopen()方法進行加載和執行;lib

編譯為二進制文件

核心模塊的使用:

編譯成功的模塊緩存到NativeModule._cache上,文件模塊則緩存到Module._cache上;

內建模塊;核心模塊;

node在啓動時,會生成一個全局變量process,並提供Binding()方法來協助加載內建模塊;

包結構:

包實際上是一個存檔文件,結構如下:
package.json包描述文件;
bin存放JS代碼的目錄;
doc:存放文檔的目錄;
test:存放單元測試用例的代碼;