深入學(xué)習(xí)Node之前,需要先知道Node這個(gè)框架的基本知識瞄桨。
控制臺
console對象:Node中使用該對象表示控制臺,通過console對象各種方法來向控制臺進(jìn)行標(biāo)準(zhǔn)輸出流,標(biāo)準(zhǔn)錯(cuò)誤輸出流补鼻。
API
?console.log(): 進(jìn)行標(biāo)準(zhǔn)輸出流的輸出(stdout)
console.log('hello node');//hello node
console.log('%s',"js","node"); // 'js' 'node'
console.log('%s','people',{name:'kb',age:20}); //people { name: 'kb', age: 20 }
console.log('%d',1,2,3); //1 2 3
console.log('%%',10);//% 10
?console.error(): 進(jìn)行標(biāo)準(zhǔn)錯(cuò)誤流的輸出用法與console.log()一樣仪吧。
?console.dir(): 查看一個(gè)對象的內(nèi)容,并把對象信息輸出到控制臺翘贮。
//main.js
var person = {
age: 38,
name: 'kobe',
job: function(){
return 'player'
}
};
console.log(person);
運(yùn)行結(jié)果如下:
?console.time()與console.timeEnd() : 可以用來統(tǒng)計(jì)一段代碼的執(zhí)行時(shí)間答捕。
//main.js
console.time('loop');
for(var i =0;i < 10000;i++){
;
}
console.timeEnd('loop');
運(yùn)行結(jié)果如下:
?console.trace(): 把當(dāng)前位置的棧信息當(dāng)做標(biāo)準(zhǔn)錯(cuò)誤信息輸出
console.trace('loop');
Trace: loop
at Object.<anonymous> (D:\study\a.js:6:9)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:509:3
?console.assert(): 對一個(gè)表達(dá)式結(jié)果進(jìn)行評估,結(jié)果為false,輸出一個(gè)消息字符串并且拋出AssertionError異常
Node的全局作用域
Node中存在一個(gè)全局作用域,定義了不需要加載任何模塊就可以使用的變量,函數(shù),類时甚。
// 查看global對象的內(nèi)容
console.log(global);
?定時(shí)器函數(shù)Node里面定義的定時(shí)器全局函數(shù)與瀏覽器端的定時(shí)器函數(shù)類型
1. setTimeout(cb,ms,[arg],[..]) : //過了多少ms執(zhí)行某個(gè)回調(diào)
2. clearTimeout(timer) // 取消setTimeout回調(diào)
3. setInterval(cb,ms,[arg],[..]): //每隔多少ms執(zhí)行某個(gè)回調(diào)
4. clearInterval(timer) // 取消setInterval回調(diào)
5. timer(定時(shí)器對象).unref(): //取消setTimeout/setInterval回調(diào)
6. timer.ref(): //恢復(fù)回調(diào)函數(shù)的使用
?require
1. require(): // 加載模塊
2. require.resolve('./a.js') // 'D:\\study\\a.js' 查看(不加載)某個(gè)模塊文件的帶完整絕對路徑的文件名
3. require.cache對象 //該對象表示緩存了所有已經(jīng)被加載的模塊的緩存區(qū)
4. delete 可以刪除緩存區(qū)某個(gè)模塊變量對象
?_ _filename與 __dirname
console.log(__filename); //D:\study\b.js 該變量表示當(dāng)前模塊文件的完整絕對路徑的文件名
console.log(__dirname); //D:\study 該變量表示當(dāng)前模塊文件所在目錄的完整絕對路徑
?事件處理機(jī)制/事件環(huán)機(jī)制event模塊定義了一個(gè)EventEmitter類,所有可能觸發(fā)事件的對象都是繼承了EventEmitter類的子類的實(shí)例對象.EventEmitter類定義了很多方法處理事件
addListener(event,listener) // 對指定的事件綁定事件處理函數(shù)
on(event,listener) // 對指定的事件綁定事件處理函數(shù)(addListener的別名),可以對同一事件綁定不同事件處理函數(shù)
once(event,listener) // 對指定事件只執(zhí)行一次綁定的事件處理函數(shù)
removeListener(event,listener) // 對指定事件解除事件處理函數(shù)
removeAllListener([event]) // 對指定事件解除所有事件處理函數(shù)
listeners(event) // 獲取指定事件的所有事件處理函數(shù)
emit(event,[args],[..]) // 手工觸發(fā)指定事件
setMaxListeners(n) // 指定事件處理函數(shù)的最大數(shù)量,默認(rèn)對同一事件最大綁定10個(gè)事件處理函數(shù).
EventEmitter.listenCount(emitter,event) // 獲取某個(gè)對象的指定事件的事件處理函數(shù)數(shù)量
Node的調(diào)試器
1. 在命令行輸入 node debug <被執(zhí)行的腳本文件名>// 啟動(dòng)調(diào)試器
2. 啟動(dòng)后,輸入cont/c // 繼續(xù)執(zhí)行余下的代碼
3. 輸入next/n // 執(zhí)行下一句代碼
4. 輸入step/s // 進(jìn)入函數(shù)內(nèi)部
5. 輸入out/o //立即執(zhí)行完函數(shù)內(nèi)部剩余代碼
6. setBreakpoint/sb([filename默認(rèn)為當(dāng)前運(yùn)行腳步] , line) //設(shè)置斷點(diǎn)
7. clearBreakpoint/cb([filename],line) // 取消斷點(diǎn)
8. 在調(diào)試過程輸入repl // 進(jìn)入REPL環(huán)境
9. restart // 重新開始腳步調(diào)試
10. kill // 終止腳本調(diào)試
11. list(n) // 查看當(dāng)前所執(zhí)行代碼之前/之后的n行代碼
12. backtrace/bt // 查看函數(shù)/外層各函數(shù)的返回位置,包括返回代碼的行號,起始字符的所在位置
13. run // 重新開始腳步調(diào)試
14. scripts // 查看當(dāng)前運(yùn)行的文件,及所有被加載的模塊文件名.
15. version // 顯示V8引擎版本號