模組(Module) & 套件(Package)
1.1一個Node.js檔案就是一個模組,這檔案可能是js程式、json或編譯過的c/c++擴充
1.2建立module.js
var name;
exports.setName=function(_name){
name=_name;
};
exports.sayHi=function(){
console.log('Hi! '+name);
}
1.3建立getmodule.js
var my_module=require('./module');
my_module.setName('By');
my_module.sayHi();
1.4執行getmodule.js,出現
Hi! By
1.5關於require & exports
require是用來取得模組的介面
exports是模組公開的介面
1.6require不會重複載入模組
修改getmodule.js如下:
var my_module1=require('./module');
my_module1.setName('my_module1');
my_module1.sayHi();
var my_module2=require('./module');
my_module2.setName('my_module2');
my_module1.sayHi();
執行結果:
Hi! my_module1
Hi! my_module2
我們兩次都是呼叫my_module1,卻發現第二次呼叫的my_module1的值被,my_module2給蓋過,表示my_module1跟my_module2指向同一個實例
1.6簡化exports
有時只想把物件封裝到模組中,建立obj.js內容如下:
function Hi(){
var name;
this.set_name=function(_name){
name=_name;
};
this.say=function(){
console.log("Hi! "+name);
}
}
exports.Hi=Hi;
想取用時,建立getobj.js,內容如下:
var HiClass=require('./obj.js').Hi;
var obj=new HiClass();
obj.set_name('my');
obj.say();
因為用require('./obj.js').Hi;來取用物件有點多餘,所以可以改成下面稍微簡化:
obj.js內容如下:
function Hi(){
var name;
this.set_name=function(_name){
name=_name;
};
this.say=function(){
console.log("Hi! "+name);
}
}
//exports.Hi=Hi;
module.exports=Hi;
getobj.js,內容如下:
//var HiClass=require('./obj.js').Hi;
var HiClass=require('./obj.js');
var obj=new HiClass();
obj.set_name('my');
obj.say();