首頁 > web前端 > js教程 > 深入了解Node.js中的一些特性_node.js

深入了解Node.js中的一些特性_node.js

WBOY
發布: 2016-05-16 16:35:29
原創
1221 人瀏覽過

Node.js作為一門新興的後台語言,旨在幫助程式設計師快速建立可伸縮的應用程式。 Node.js有許多吸引人的地方,有關它的報道不計其數,本文將針對EventEmitter、Streams、Coding Style、Linting、Coding Style等特性進行分析探討,幫助用戶對Node.js有更深入的了解。

作為一個基於Chrome JavaScript 運行時建立的平台,我們對JavaScript 的相關認識,似乎都可應用於node應用程式之上;無需額外的語言擴充或修飾,我們便可以把前端程式設計的經驗應用於後端編程。

EventEmitter(事件發送器)

首先應該先了解EventEmitter模型。它可以發送一個事件以及讓消費者訂閱感興趣的事件。我們可以把它看成是向一個非同步函數進行回調傳遞模式的擴展。特別是,當需要進行多次回呼時,EventEmitter會更顯優勢。

例如,有一個呼叫者向遠端伺服器發送了一個「列出檔案」的請求。你可能想要將返回結果分組,對每一個分組進行一次回調處理。 EventEmitter模型可以讓你在每個分組上發送「檔案」回調,當全部操作完成時進行「結束」處理。

使用EventEmitter時,只要設定相關事件與參數。

複製程式碼 程式碼如下:

var EventEmitter = require('events').EventEmitter; 
var util = require('util'); 
 
function MyClass() { 
  if (!(this instanceof MyClass)) return new MyClass(); 
 
  EventEmitter.call(this); 
 
  var self = this; 
  setTimeout(function timeoutCb() { 
    self.emit('myEvent', 'hello world', 42); 
  }, 1000); 

util.inherits(MyClass, EventEmitter); 

MyClass建構子建立了一個時間觸發器,觸發延時為1s,觸發事件為myEvent。要使用相關事件,需要執行on()方法:

複製程式碼 程式碼如下:

var myObj = new MyClass(); 
var start = Date.now(); 
myObj.on('myEvent', function myEventCb(str, num) { 
  console.log('myEvent triggered', str, num, Date.now() - start); 
}); 

這裡要注意的是,訂閱的EventEmitter事件雖然是非同步事件,但當時間觸發時,監聽方的動作是會同步的。因此如果上述myEvent事件有10個監聽者,所有的監聽會被依次序呼叫而不用等候事件的迴圈。

如果EventEmitter的子類別產生了emit('error')事件,但無任何的監聽方對此進行訂閱,那麼EventEmitter基底類別會拋出一個異常,從而導致執行process物件時觸發uncaughtException事件。

verror

verror是基底類別Error的擴展,可以讓我們使用printf字元格式定義輸出訊息。

Streams(流)

如果有一個非常龐大的文件需要處理,理想的方法應該是讀一部分,寫一部分,不管文件有多大,只要時間允許,總是會處理完成,這裡就需要用到流的概念。 Streams是Node中另一個廣泛使用的模型,在Node中是EventEmitter的實作。提供了可讀、可寫入或全雙工介面。它是一個抽象接口,提供的常規操作事件包括:readable、writable、 drain、data、 end及close。如果我們能夠使用pipeline(管道)來對這些事件進行有效整合,將可實現更強大的互動操作。

透過使用.pipe(),可以讓Note透過pipeline與back-pressure進行通訊。 back-pressure的意思是:只讀取那些能夠寫入的,或只寫入那些能夠讀取的。

例如我們現在把來自stdin的資料傳送到一個本地檔案和遠端伺服器:

複製程式碼 程式碼如下:

var fs = require('fs');
var net = require('net');

var localFile = fs.createWriteStream('localFile.tmp');

net.connect('255.255.255.255', 12345, function(client) {
  process.stdin.pipe(client);
  process.stdin.pipe(localFile);
});

而如果我們想將資料傳送到一個本地文件,並且想使用gunzip對這個stream進行壓縮,可以這樣做:

複製程式碼 程式碼如下:

var fs = require('fs');
var zlib = require('zlib');

process.stdin.pipe(zlib.createGunzip()).pipe(fs.createWriteStream('localFile.tar'));

如果想對stream有更多了解,請點選這裡

Control Flow(流程控制)

由於JS中有第一類對象,閉包等功能概念,因而能夠輕易地對回呼權限進行定義。這在進行原型設計時是非常方便的,能夠對邏輯權限按需進行整合。但是同時容易造成使用笨拙的內建函數。

例如我們想按次序讀入一系列文件,然後執行某個任務:

複製程式碼 程式碼如下:

fs.readFile('firstFile', 'utf8', function firstCb(err, firstFile) {
  doSomething(firstFile);
  fs.readFile('secondFile', 'utf8', function secondCb(err, secondFile) {
    doSomething(secondFile);
    fs.readFile('thirdFile', 'utf8', function thirdCb(err, thirdFile) {
      doSomething(thirdFile);
    });
  });
});

這個模式存在的問題是:

1.這些程式碼的邏輯非常散亂無序,相關的操作流程難以理解。
2.沒有任何差錯或異常處理。
3.JS中閉包記憶體洩漏是非常常見的,並且難以診斷和偵測。

如果我們想在一個輸入集上進行一系列非同步操作,使用一個流程控制庫是更明智的選擇。這裡使用的是vasync。

vasync是一個流程控制庫,其思路來自於非同步操作。它的特別之處是能夠讓消費者對某個任務處理流程進行查看和觀察。這些資訊對研究某個錯誤的產生過程是非常有用的。

Coding Style(程式風格)

程式設計風格可謂最具爭議性的話題,因為很多時候都是隨性的。蘿蔔白菜,各有所愛。重要的是找到適合個人和團隊的風格。一些傳統的傳承或許能讓Node開發之旅變得更美好。

1.為函數命名
2.盡量對所有函數進行命名。
3.避免閉包
4.不要在某個函數中定義其它函數。這可減少許多想不到的閉包記憶體外洩意外。
5.更多和更小巧的函數

V8 JIT雖然是一個功能強大的引擎,但是更小巧和精簡的函數會與V8結合得更好。進一步說,如果我們的函數都是小巧玲瓏的(100行左右),我們自己進行閱讀和維護時也會感謝自己的。

用程式檢查風格:保持風格一致性,並使用一個檢查工具來加強。我們使用的是jsstyle。

Linting(程式碼檢查)

Lint工具可以在不運行情況下進行程式碼的靜態分析,檢查出潛在的錯誤和風險,例如在caseswitch中遺漏了break語句。 Lint不簡單地等同於風格檢查,它更針對於客觀的風險分析,而不是主觀的風格選擇。我們使用的javascriptlint,它裡面有豐富檢查項目。

Logging(日誌記錄)

當我們進行程式設計和編碼時,需要有長遠的目光。特別是要考慮好使用什麼工具來進行調試。極好的第一步是進行有效日誌記錄。我們需要對資訊進行識別,看看什麼是調試時特別留意的,什麼是運行時用來分析研究的。這裡推薦使用Bunyan,一個直接的Node.js日誌記錄庫,數據輸出格式是JSON ,要了解更多信息,請點擊這裡。

Client Server

如果一款應用具備分散式處理能力,在市場上會更有吸引力。類似的介面可以用HTTP RESTFul API或原始的TCP JSON來描述。這可以讓開發者把Node上的經驗與非同步網路環境結合,以及把streams的使用與分散式可擴展式系統結合。

常用工具:

1. restify

簡單來說,這是一個用來建立REST服務的工具。它提供了良好的查看和調試處理支援,同時支援Bunyan與DTrace。

2. fast

fast是一款以TCP來處理JSON訊息的輕量級工具。提供了DTrace支持,能夠讓我們迅速地對伺服器客戶端進行效能特徵識別。

3. workflow

workflow建構在restify之上,能夠對一系列遠端服務和API進行業務流程定義。例如:錯誤狀態,超時,重新連接,擁塞處理等。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板