Node.js是運行在服務區(qū)端的JavaScript環(huán)境,服務器程序和瀏覽器程序相比尤筐,最大的特點是沒有瀏覽器的安全限制了汇荐,而且,服務器程序必須能接收網絡請求盆繁,讀寫文件掀淘,處理二進制內容,所以改基,Node.js內置的常用模塊就是為了實現基本的服務器功能繁疤。這些模塊在瀏覽器環(huán)境中是無法被執(zhí)行的,因為它們的底層代碼是用C/C++在Node.js運行環(huán)境中實現的秕狰。
global
在前面的JavaScript課程中稠腊,我們已經知道,JavaScript有且僅有一個全局對象鸣哀,在瀏覽器中架忌,叫window對象。而在Node.js環(huán)境中我衬,也有唯一的全局對象叹放,但不叫window,而叫global挠羔,這個對象的屬性和方法也和瀏覽器環(huán)境的window不同井仰。進入Node.js交互環(huán)境,可以直接輸入:
> global.console
Console {
log: [Function: bound ],
info: [Function: bound ],
warn: [Function: bound ],
error: [Function: bound ],
dir: [Function: bound ],
time: [Function: bound ],
timeEnd: [Function: bound ],
trace: [Function: bound trace],
assert: [Function: bound ],
Console: [Function: Console] }
process
process也是Node.js提供的一個對象破加,它代表當前Node.js進程俱恶。通過process對象可以拿到許多有用信息:
> process === global.process;
true
> process.version;
'v5.2.0'
> process.platform;
'darwin'
> process.arch;
'x64'
> process.cwd(); //返回當前工作目錄
'/Users/michael'
> process.chdir('/private/tmp'); // 切換當前工作目錄
undefined
> process.cwd();
'/private/tmp'
JavaScript程序是由事件驅動執(zhí)行的單線程模型,Node.js也不例外。Node.js不斷執(zhí)行響應事件的JavaScript函數合是,直到沒有任何響應事件的函數可以執(zhí)行時了罪,Node.js就退出了。
如果我們想要在下一次事件響應中執(zhí)行代碼聪全,可以調用process.nextTick():
// test.js
// process.nextTick()將在下一輪事件循環(huán)中調用:
process.nextTick(function () {
console.log('nextTick callback!');
});
console.log('nextTick was set!');
//用Node執(zhí)行上面的代碼node test.js泊藕,你會看到,打印輸出是:
nextTick was set!
nextTick callback!
這說明傳入process.nextTick()的函數不是立刻執(zhí)行难礼,而是要等到下一次事件循環(huán)娃圆。
Node.js進程本身的事件就由process對象來處理。如果我們響應exit事件鹤竭,就可以在程序即將退出時執(zhí)行某個回調函數:
// 程序即將退出時的回調函數:
process.on('exit', function (code) {
console.log('about to exit with code: ' + code);
});
判斷JavaScript執(zhí)行環(huán)境
有很多JavaScript代碼既能在瀏覽器中執(zhí)行踊餐,也能在Node環(huán)境執(zhí)行,但有些時候臀稚,程序本身需要判斷自己到底是在什么環(huán)境下執(zhí)行的吝岭,常用的方式就是根據瀏覽器和Node環(huán)境提供的全局變量名稱來判斷:
if (typeof(window) === 'undefined') {
console.log('node.js');
} else {
console.log('browser');
}
文章詳見:基本模塊