搜尋
首頁web前端js教程深入了解Node.js中的一些特性_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
C和JavaScript:連接解釋C和JavaScript:連接解釋Apr 23, 2025 am 12:07 AM

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

從網站到應用程序:JavaScript的不同應用從網站到應用程序:JavaScript的不同應用Apr 22, 2025 am 12:02 AM

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python vs. JavaScript:比較用例和應用程序Python vs. JavaScript:比較用例和應用程序Apr 21, 2025 am 12:01 AM

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C/C在JavaScript口譯員和編譯器中的作用C/C在JavaScript口譯員和編譯器中的作用Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在行動中:現實世界中的示例和項目JavaScript在行動中:現實世界中的示例和項目Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

了解JavaScript引擎:實施詳細信息了解JavaScript引擎:實施詳細信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:學習曲線和易用性Python vs. JavaScript:學習曲線和易用性Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

See all articles

熱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

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

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

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