基本模塊
因?yàn)镹ode.js是運(yùn)行在服務(wù)器端的JavaScript環(huán)境,服務(wù)器環(huán)境和瀏覽器程序相比,最大的特點(diǎn)就是沒有瀏覽器的安全限制了,而且,服務(wù)器程序必須能接收網(wǎng)絡(luò)請求,讀寫文件,處理二進(jìn)制內(nèi)容,所以
Node.js內(nèi)置的常用模塊就是為了實(shí)現(xiàn)基本的服務(wù)器功能,這些模塊在瀏覽器環(huán)境中是無法被執(zhí)行的,因?yàn)樗齻兊牡讓哟a是用C/C++在Node.js運(yùn)行環(huán)境中實(shí)現(xiàn)的.
Global
在前面的JavaScript課程中,我們已經(jīng)知道,JavaScript有且僅有一個(gè)全局對象,在瀏覽器中,叫window對象,而在Node.js環(huán)境中,也有唯一的全局對象,但不叫window,而叫g(shù)lobal
這個(gè)對象的屬性和方法也和瀏覽器環(huán)境的window不同,進(jìn)入Node.js交互環(huán)境,可以直接輸入:
process
process 也是Node.js提供的一個(gè)對象,它代表當(dāng)前的Node.js進(jìn)程,通過Process對象可以拿到許多有用信息:
> process === global.process;
true
> process.version;
'v5.2.0'
> process.platform;
'darwin'
> process.arch;
'x64'
> process.cwd(); //返回當(dāng)前工作目錄
'/Users/michael'
> process.chdir('/private/tmp'); // 切換當(dāng)前工作目錄
undefined
> process.cwd();
'/private/tmp'
JavaScript程序是由事件驅(qū)動(dòng)執(zhí)行的單線程模型,Node.js也不例外,Node.js不斷執(zhí)行響應(yīng)事件的JavaScript函數(shù),直到?jīng)]有任何響應(yīng)事件的函數(shù)可以執(zhí)行時(shí),Node.js就退出了
如果我們想要在下一次事件響應(yīng)中執(zhí)行代碼,可以調(diào)用process.nextTick():
process.nextTick(function(){
console.log('nextTick callback!');
});
console.log('nextTick was set!');
用Node執(zhí)行上面的代碼node test.js脱衙,你會(huì)看到,打印輸出是:
nextTick was set!
nextTick callback!
這說明傳入process.nextTick()的函數(shù)不是立刻執(zhí)行,而是要等到下一次事件循環(huán)
Node.js進(jìn)程本身的事件就是由process對象來處理,如果我們響應(yīng)exit事件,就可以在程序即將退出時(shí)執(zhí)行某個(gè)回調(diào)函數(shù):
// 程序即將退出的回調(diào)函數(shù)
process.on('exit',function(code){
console.log('about to exit with code:' + code);
});
判斷JavaScript執(zhí)行環(huán)境
有很多JavaScript代碼既能在瀏覽器中執(zhí)行也能在Node環(huán)境中執(zhí)行,但有些時(shí)候,程序本身需要判斷自己到底是在什么環(huán)境下執(zhí)行的,常用的方式就是根據(jù)瀏覽器和Node提供的全局變量名稱來判斷
//判斷JavaScript執(zhí)行環(huán)境
if (typeof(window) === 'undefined') {
console.log('node.js');
} else {
console.log('browser');
}