亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 14:06:23
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩福利电影| 久久久精品视频在线观看| 成人xvideos免费视频| 亚洲欧美日本精品| 日韩精品视频在线免费观看| 亚洲a成v人在线观看| 亚洲娇小xxxx欧美娇小| 亚洲欧美日韩另类| 中文字幕亚洲二区| 欧美日韩中文字幕在线视频| 91麻豆桃色免费看| 国产精品免费电影| 欧美自拍大量在线观看| 亚州国产精品久久久| 国产成人精品日本亚洲| 91在线视频一区| 欧美在线性爱视频| 国产成人综合精品| 亚洲高清福利视频| 日韩免费视频在线观看| 日韩电视剧免费观看网站| 国产欧美日韩精品丝袜高跟鞋| 欧洲亚洲妇女av| 久久久国产精品视频| 亚洲国内精品视频| 日韩国产一区三区| 久久精品99无色码中文字幕| 精品久久久久久久久久国产| 日韩美女视频免费看| 啊v视频在线一区二区三区| 91夜夜揉人人捏人人添红杏| 国产一区视频在线播放| 亚洲一区二区福利| 精品福利樱桃av导航| 92看片淫黄大片看国产片| 国内精品模特av私拍在线观看| 北条麻妃99精品青青久久| 国内免费久久久久久久久久久| 国产亚洲欧洲高清一区| 精品国产一区二区三区久久久狼| 欧美在线观看网站| 亚洲国产日韩欧美在线图片| 中文字幕亚洲色图| 欧美最猛黑人xxxx黑人猛叫黄| 一区二区欧美在线| 欧美日韩视频在线| 久久av资源网站| 亚洲国产精久久久久久| 国产不卡一区二区在线播放| 欧美成人免费在线视频| 亚洲国产精品成人精品| 国产精品一区二区三区在线播放| 在线精品视频视频中文字幕| 国产日韩欧美在线播放| 国产精品一区二区3区| 亚洲嫩模很污视频| 欧美亚洲另类制服自拍| 国产欧美日韩最新| 久久久久久中文字幕| 亚洲免费视频网站| 欧美性受xxx| 国产视频在线观看一区二区| 国产精品1区2区在线观看| 亚洲午夜av电影| 国产欧美最新羞羞视频在线观看| 91精品国产免费久久久久久| 亚洲欧洲国产一区| 国产日韩欧美日韩大片| 97不卡在线视频| 欧美激情一二区| 欲色天天网综合久久| 欧美丝袜美女中出在线| 91精品国产综合久久香蕉的用户体验| 久久久久久网址| 国产在线视频欧美| 国产日韩精品综合网站| 少妇高潮 亚洲精品| 最近中文字幕2019免费| 疯狂蹂躏欧美一区二区精品| 精品动漫一区二区三区| 久操成人在线视频| 亚洲欧美日韩精品久久| 日韩欧美精品网址| 色噜噜久久综合伊人一本| 日韩欧美成人网| 精品色蜜蜜精品视频在线观看| 亚洲大胆人体av| 国产91对白在线播放| 57pao国产成人免费| 日韩美女视频中文字幕| 欧美精品18videos性欧美| 日韩免费观看在线观看| 亚洲视频日韩精品| 国产精品视频一| 北条麻妃99精品青青久久| 欧美成人激情图片网| 26uuu另类亚洲欧美日本一| 97精品一区二区三区| 亚洲福利在线观看| 国产99久久久欧美黑人| 久久精品中文字幕| 国产97人人超碰caoprom| 国产色视频一区| 97国产精品人人爽人人做| 亚洲影视中文字幕| 国产丝袜一区视频在线观看| 欧美高清视频在线播放| 国产91露脸中文字幕在线| 亚洲欧美在线第一页| 亚洲欧美日韩在线高清直播| 日韩在线不卡视频| 亚洲全黄一级网站| 日韩欧美综合在线视频| 亚洲天堂av综合网| 精品久久久久久国产91| 日韩av网站电影| 97欧美精品一区二区三区| 亚洲最大中文字幕| 色777狠狠综合秋免鲁丝| 在线免费看av不卡| 国产欧美一区二区| 2019亚洲日韩新视频| 中文字幕亚洲一区在线观看| 精品丝袜一区二区三区| 国产一区二区三区免费视频| www国产精品视频| 久久精品成人动漫| 欧美午夜影院在线视频| 亚洲国产欧美久久| 亚洲色图五月天| 最近免费中文字幕视频2019| 粗暴蹂躏中文一区二区三区| 深夜福利国产精品| 久久av中文字幕| 久久国产精品亚洲| 欧美日韩在线一区| 91性高湖久久久久久久久_久久99| 欧美国产日韩二区| 国产精品久久久久久av| 日韩在线视频免费观看高清中文| 亚洲最大福利网站| 久久精品91久久香蕉加勒比| 久久久精品一区| 欧美黄网免费在线观看| 亚洲欧美一区二区激情| 疯狂欧美牲乱大交777| 亚洲色图欧美制服丝袜另类第一页| 国产mv久久久| 国产精品视频大全| 欧美综合国产精品久久丁香| 成人免费在线视频网站| 在线观看久久久久久| 欧美电影免费看| 国产成人鲁鲁免费视频a| 久久久久久久久久久亚洲| 亚洲综合色av| 亚洲色图15p| 色噜噜亚洲精品中文字幕| www国产亚洲精品久久网站| 亚洲色图av在线| 欧美精品日韩www.p站| 91国内精品久久| 日韩欧美精品网站| 日韩精品免费综合视频在线播放|