(一)初識NodeJs

weixin_34148340發表於2017-10-22

說明:該學習筆記參考《深入淺出Node.js》在學習過程中,新增了自己的理解和適當的補充!僅供參考!

NodeJs的出現,讓JavaScript工程師實現了獨自完成全棧的夢想。NodeJs作為後端JavaScript的執行平臺,保留了前端瀏覽器中那些熟悉的介面,沒有改寫語言本身的任何特性,依然基於作用鏈原型鏈

NodeJs有以下幾個特點:

非同步I/O

非同步I/O的最常見實現場景就是發起Ajax呼叫。這裡演示的是一個Ajax請求:

$.post("/url", {"title": "這是引數"}, function(data){
    console.log("收到響應");
});
console.log("傳送Ajax結束");

這裡,我們會注意到,輸出“傳送Ajax結束”並不一定是在輸出“收到響應”之後,因為“收到響應”的執行時間是不被預期的。這裡是比較重要的非同步的原則:‘Don`t call me, I will call you’,注重結果,不關心過程

在NodeJs中,絕大多數的操作都是以非同步的方式進行呼叫。在NodeJs中,我們可以從語言層面很自然的進行並行I/O操作,每個呼叫之間無需等待其他呼叫結束,在程式設計模型上可以極大的提升效率

這裡是兩個檔案讀取任務的耗時取決於最慢的那個檔案讀取的耗時:

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

事件與回撥函式

NodeJs是將前端瀏覽器中廣泛且成熟的事件引入後端,配合非同步I/O,將事件點暴露給業務邏輯。

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

// 偵聽服務其的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伺服器繫結request事件,對於請求物件,為其繫結data事件和end事件。相應的在前端Ajax請求中繫結success事件,在發出請求後,只需關心請求成功時執行相應的業務邏輯即可。

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

以上程式碼只是演示,此處的ajax並不能執行。在此只是說明“事件”。

事件的程式設計方式具有輕量級鬆耦合只關注事務點等優勢。但是也會造成在多個非同步任務的場景下,事件和事件之間各自獨立,如何協作是一個重要的問題。

回撥函式無處不在。在JavaScript中,是將函式作為第一等公民來對待的,可以將函式作為物件傳遞給方法作為引數進行呼叫(這裡說的是不是閉包?可以去深揪一下!)

回撥函式是最好的接受非同步呼叫、返回資料的方式,但是這種程式設計方式對於同步思路程式設計的人來說,是一大挑戰。程式碼的編寫順序與執行順序並無關係,在流程控制方面,由於穿插了非同步和回撥使得變得不是那麼一目瞭然。但是對於業務的劃分和對事件的提煉上覆雜度與同步方式是一致的。

單執行緒

NodeJs保持了JavaScript在瀏覽器中的單執行緒的特點。而且在NodeJs中,JavaScript與其他執行緒是無法共享任何狀態的

單執行緒的最大好處就是:不用向多執行緒那樣處處在意狀態的同步問題,沒有死鎖的的存在,也沒有執行緒上下文交換(這點需要深入解釋下)所帶來的效能上的開銷

當然單執行緒也是有很大的弱點,但是必須要積極面對才能享受到node帶來的好處。主要有以下三大方面:

  • 無法利用多核CPU。
  • 錯誤會引起整個應用的退出,應用的健壯性值得考驗
  • 大量計算佔用CPU導致無法繼續呼叫非同步I/O

在瀏覽器中JavaScript與UI共用一個執行緒,JavaSript長時間執行會導致UI的渲染和相應被終端(這裡思考瀏覽器載入資源的方式是並行還是序列,如何提高這方面的效能!)

第三個弱點,有相應的解決方案,這裡暫時先不提!

跨平臺

相容於Windows和Linux平臺。

應用場景

I/O密集型

NodeJs擅長I/O密集型的應用場景,面向網路且擅長並行I/O,能夠有效的組織更多的硬體資源,

I/O密集的優勢主要在於NodeJs利用事件迴圈的處理能力,而不是啟動每一個執行緒為每一個請求服務,資源佔用極少。

分散式應用

與遺留系統和平相處

是否不擅長CPU密集型業務

這裡簡單的認識NodeJs,瞭解了其特性和應用場景,接下來,需要深入了,加油哦!

相關文章