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

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

May 16, 2016 pm 04:35 PM
node.js 特性

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進行業務流程定義。例如:錯誤狀態,超時,重新連接,擁塞處理等。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1672
14
CakePHP 教程
1428
52
Laravel 教程
1333
25
PHP教程
1277
29
C# 教程
1257
24
一文聊聊Node中的記憶體控制 一文聊聊Node中的記憶體控制 Apr 26, 2023 pm 05:37 PM

基於無阻塞、事件驅動建立的Node服務,具有記憶體消耗低的優點,非常適合處理海量的網路請求。在海量請求的前提下,就需要考慮「記憶體控制」的相關問題了。 1. V8的垃圾回收機制與記憶體限制 Js由垃圾回收機

win7家庭版與win7旗艦版的差異介紹 win7家庭版與win7旗艦版的差異介紹 Jul 12, 2023 pm 08:41 PM

大家都知道win7系統有很多種版本,像是win7旗艦版、win7專業版、win7家用版等,有不少用戶在家庭版和旗艦版之間糾結,不知道選擇哪個版本比較好,所以今天小編來跟大家說說win7家庭餐與win7旗艦版的差別介紹,大家一起來看看。 1.體驗不同家庭普通版使您的日常操作變得更快、更簡單,可以更快、更方便地存取使用最頻繁的程式和文件。家庭高級版讓您享有最佳的娛樂體驗,可以輕鬆欣賞和分享您喜愛的電視節目、照片、影片和音樂。旗艦版集各版本功能大全,具備Windows7家庭高級版的所有娛樂功能與專

深入聊聊Node中的File模組 深入聊聊Node中的File模組 Apr 24, 2023 pm 05:49 PM

文件模組是對底層文件操作的封裝,例如文件讀寫/打開關閉/刪除添加等等文件模組最大的特點就是所有的方法都提供的**同步**和**異步**兩個版本,具有sync 字尾的方法都是同步方法,沒有的都是異

深入了解Node中的Buffer 深入了解Node中的Buffer Apr 25, 2023 pm 07:49 PM

一開始的時候 JS 只在瀏覽器端運行,對於 Unicode 編碼的字串容易處理,但對於二進位和非 Unicode 編碼的字串處理困難。並且二進制是電腦最底層的資料格式,視訊/音訊/程式/網路包

掌握Spring MVC的關鍵概念:了解這些重要特性 掌握Spring MVC的關鍵概念:了解這些重要特性 Dec 29, 2023 am 09:14 AM

了解SpringMVC的關鍵特性:掌握這些重要的概念,需要具體程式碼範例SpringMVC是一種基於Java的Web應用開發框架,它透過模型-視圖-控制器(MVC)的架構模式來幫助開發人員建立靈活可擴展的Web應用程式。了解和掌握SpringMVC的關鍵特性將使我們能夠更有效地開發和管理我們的網路應用程式。本文將介紹一些SpringMVC的重要概念

Golang中有類似類別的物件導向特性嗎? Golang中有類似類別的物件導向特性嗎? Mar 19, 2024 pm 02:51 PM

在Golang(Go語言)中並沒有傳統意義上的類別的概念,但它提供了一種稱為結構體的資料類型,透過結構體可以實現類似類別的物件導向特性。在本文中,我們將介紹如何使用結構體實現物件導向的特性,並提供具體的程式碼範例。結構體的定義和使用首先,讓我們來看看結構體的定義和使用方式。在Golang中,結構體可以透過type關鍵字定義,然後在需要的地方使用。結構體中可以包含屬

一文聊聊如何高效率開發表現層Node.js應用 一文聊聊如何高效率開發表現層Node.js應用 Apr 17, 2023 pm 07:02 PM

如何使用 Node.js 進行前端應用的開發?以下這篇文章為大家介紹一下Node開發前端應用的方法,涉及到表現層應用的開發。我今天分享的方案是針對簡單場景的,旨在讓前端開發人員不必掌握太多關於 Node.js 的背景知識和專業知識,即使沒有程式碼編寫經驗,也能完成一些簡單的服務端開發任務。

選擇適用的Go版本,依需求和特性 選擇適用的Go版本,依需求和特性 Jan 20, 2024 am 09:28 AM

隨著網路的快速發展,程式語言也不斷演化和更新。其中,Go語言作為一種開源的程式語言,在近年來備受關注。 Go語言的設計目標是簡單、有效率、安全且易於開發和部署。它具有高並發、快速編譯和記憶體安全等特性,讓它在Web開發、雲端運算和大數據等領域中有著廣泛的運用。然而,目前Go語言也有不同的版本可供選擇。在選擇合適的Go語言版本時,我們需要考慮需求和特性兩個面向。首

See all articles