模塊引用
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:存放單元測試用例的代碼;