(一)初識NodeJs

說明:該學(xué)習(xí)筆記參考《深入淺出Node.js》在學(xué)習(xí)過程中钥屈,添加了自己的理解和適當(dāng)?shù)难a充悟民!僅供參考!

NodeJs的出現(xiàn)篷就,讓JavaScript工程師實現(xiàn)了獨自完成全棧的夢想射亏。NodeJs作為后端JavaScript的運行平臺,保留了前端瀏覽器中那些熟悉的接口竭业,沒有改寫語言本身的任何特性智润,依然基于作用鏈原型鏈

NodeJs有以下幾個特點:

異步I/O

異步I/O的最常見實現(xiàn)場景就是發(fā)起Ajax調(diào)用未辆。這里演示的是一個Ajax請求:

$.post("/url", {"title": "這是參數(shù)"}窟绷, function(data){
    console.log("收到響應(yīng)");
});
console.log("發(fā)送Ajax結(jié)束");

這里,我們會注意到咐柜,輸出“發(fā)送Ajax結(jié)束”并不一定是在輸出“收到響應(yīng)”之后兼蜈,因為“收到響應(yīng)”的執(zhí)行時間是不被預(yù)期的。這里是比較重要的異步的原則:‘Don`t call me, I will call you’炕桨,注重結(jié)果饭尝,不關(guān)心過程肯腕。

在NodeJs中献宫,絕大多數(shù)的操作都是以異步的方式進行調(diào)用。在NodeJs中实撒,我們可以從語言層面很自然的進行并行I/O操作姊途,每個調(diào)用之間無需等待其他調(diào)用結(jié)束,在編程模型上可以極大的提升效率

這里是兩個文件讀取任務(wù)的耗時取決于最慢的那個文件讀取的耗時:

var fs = require("fs");
fs.readFile("/path1", function(err, file){
    console.log("讀取文件1完成");
});
fs.readFile("/path2", function(err, file){
    console.log("讀取文件2完成");
});

事件與回調(diào)函數(shù)

NodeJs是將前端瀏覽器中廣泛且成熟的事件引入后端倒得,配合異步I/O固阁,將事件點暴露給業(yè)務(wù)邏輯。

var http = require("http");
var querystring = require("querystring");

// 偵聽服務(wù)其的request事件

http.createServer(function(req, res){
  var postData = '';
  req.setEncoding('utf8');

  // 偵聽請求的data事件

  req.on('data', function(chunk){
    postData += chunk;
  });

  // 偵聽請求的end事件
  req.on('end', function(){
    res.end(postData);
  });

}).listen(8080);
console.log('server start at port:8080')

在web服務(wù)器綁定request事件贡茅,對于請求對象秘蛇,為其綁定data事件和end事件。相應(yīng)的在前端Ajax請求中綁定success事件顶考,在發(fā)出請求后赁还,只需關(guān)心請求成功時執(zhí)行相應(yīng)的業(yè)務(wù)邏輯即可。

$.ajax({
  'url': '127.0.0.1:8080',
  'method': 'POST',
  'data': {},
  'success': function(data){
    console.log(data);
  }
})

以上代碼只是演示驹沿,此處的ajax并不能運行艘策。在此只是說明“事件”。

事件的編程方式具有輕量級渊季、松耦合朋蔫、只關(guān)注事務(wù)點等優(yōu)勢。但是也會造成在多個異步任務(wù)的場景下却汉,事件和事件之間各自獨立驯妄,如何協(xié)作是一個重要的問題。

回調(diào)函數(shù)無處不在病涨。在JavaScript中富玷,是將函數(shù)作為第一等公民來對待的,可以將函數(shù)作為對象傳遞給方法作為參數(shù)進行調(diào)用(這里說的是不是閉包既穆?可以去深揪一下赎懦!)

回調(diào)函數(shù)是最好的接受異步調(diào)用、返回數(shù)據(jù)的方式幻工,但是這種編程方式對于同步思路編程的人來說励两,是一大挑戰(zhàn)。代碼的編寫順序與執(zhí)行順序并無關(guān)系囊颅,在流程控制方面当悔,由于穿插了異步和回調(diào)使得變得不是那么一目了然。但是對于業(yè)務(wù)的劃分和對事件的提煉上復(fù)雜度與同步方式是一致的踢代。

單線程

NodeJs保持了JavaScript在瀏覽器中的單線程的特點盲憎。而且在NodeJs中,JavaScript與其他線程是無法共享任何狀態(tài)的胳挎。

單線程的最大好處就是:不用向多線程那樣處處在意狀態(tài)的同步問題饼疙,沒有死鎖的的存在,也沒有線程上下文交換(這點需要深入解釋下)所帶來的性能上的開銷慕爬。

當(dāng)然單線程也是有很大的弱點窑眯,但是必須要積極面對才能享受到node帶來的好處屏积。主要有以下三大方面:

  • 無法利用多核CPU。
  • 錯誤會引起整個應(yīng)用的退出磅甩,應(yīng)用的健壯性值得考驗炊林。
  • 大量計算占用CPU導(dǎo)致無法繼續(xù)調(diào)用異步I/O

在瀏覽器中JavaScript與UI共用一個線程卷要,JavaSript長時間執(zhí)行會導(dǎo)致UI的渲染和相應(yīng)被終端(這里思考瀏覽器加載資源的方式是并行還是串行渣聚,如何提高這方面的性能!)

第三個弱點僧叉,有相應(yīng)的解決方案饵逐,這里暫時先不提!

跨平臺

兼容于Windows和Linux平臺彪标。

應(yīng)用場景

I/O密集型

NodeJs擅長I/O密集型的應(yīng)用場景倍权,面向網(wǎng)絡(luò)且擅長并行I/O,能夠有效的組織更多的硬件資源捞烟,

I/O密集的優(yōu)勢主要在于NodeJs利用事件循環(huán)的處理能力薄声,而不是啟動每一個線程為每一個請求服務(wù),資源占用極少题画。

分布式應(yīng)用

與遺留系統(tǒng)和平相處

是否不擅長CPU密集型業(yè)務(wù)

這里簡單的認識NodeJs默辨,了解了其特性和應(yīng)用場景,接下來苍息,需要深入了缩幸,加油哦!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竞思,一起剝皮案震驚了整個濱河市表谊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盖喷,老刑警劉巖爆办,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異课梳,居然都是意外死亡距辆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門暮刃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跨算,“玉大人,你說我怎么就攤上這事椭懊≈畈希” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挫望。 經(jīng)常有香客問我,道長狂窑,這世上最難降的妖魔是什么媳板? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮泉哈,結(jié)果婚禮上蛉幸,老公的妹妹穿的比我還像新娘。我一直安慰自己丛晦,他們只是感情好奕纫,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烫沙,像睡著了一般匹层。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锌蓄,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天升筏,我揣著相機與錄音,去河邊找鬼瘸爽。 笑死您访,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剪决。 我是一名探鬼主播灵汪,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柑潦!你這毒婦竟也來了享言?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤渗鬼,失蹤者是張志新(化名)和其女友劉穎担锤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乍钻,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡肛循,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了银择。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片多糠。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浩考,靈堂內(nèi)的尸體忽然破棺而出夹孔,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布搭伤,位于F島的核電站只怎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怜俐。R本人自食惡果不足惜身堡,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拍鲤。 院中可真熱鬧贴谎,春花似錦、人聲如沸季稳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽景鼠。三九已至仲翎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铛漓,已是汗流浹背谭确。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留票渠,地道東北人逐哈。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像问顷,于是被迫代替她去往敵國和親昂秃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 nodejs 中的異步存在嗎杜窄? 現(xiàn)在有點 javascript 基礎(chǔ)的人都在聽說過 nodejs 肠骆,而只要與 ...
    htoo閱讀 6,484評論 4 51
  • 五十三:請解釋 JavaScript 中 this 是如何工作的。1.方法調(diào)用模式當(dāng)一個函數(shù)被保存為一個對象的屬性...
    Arno_z閱讀 577評論 0 2
  • Node.js? is a JavaScript runtime built on Chrome's V8 Jav...
    水雨田閱讀 938評論 0 3
  • 母親的一生是艱辛的一生塞耕,但她的性格強勢容易灼傷人蚀腿,自己的骨子里是有點遺傳她。 從我懂事起...
    夢梵_福州閱讀 285評論 2 2
  • 我有一個夢想, 當(dāng)這個世界所有人都開始長胖筛谚, 是否磁玉, 我就不用為減肥而起床。 我有一個夢想驾讲, 當(dāng)這個世界所有人都長...
    郝先森瑞康閱讀 427評論 2 1