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

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

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

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。