欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2014年09月25日 10:58:35   投稿:junjie  
這篇文章主要介紹了深入了解Node.js中的一些特性,本文對(duì)EventEmitter、Streams、Coding Style、Linting、Coding Style等特性進(jìn)行分析探討,需要的朋友可以參考下

Node.js作為一門新興的后臺(tái)語言,旨在幫助程序員快速構(gòu)建可伸縮的應(yīng)用程序。Node.js有很多吸引人的地方,有關(guān)它的報(bào)道不計(jì)其數(shù),本文將針對(duì)EventEmitter、Streams、Coding Style、Linting、Coding Style等特性進(jìn)行分析探討,幫助用戶對(duì)Node.js有更深入的了解。

作為一個(gè)基于Chrome JavaScript 運(yùn)行時(shí)建立的平臺(tái),我們對(duì)JavaScript 的相關(guān)認(rèn)識(shí),似乎都可應(yīng)用于node應(yīng)用程序之上;無需額外的語言擴(kuò)展或修飾,我們便可以把前端編程的經(jīng)驗(yàn)應(yīng)用于后端編程。

EventEmitter(事件發(fā)送器)

首先應(yīng)該先了解EventEmitter模型。它可以發(fā)送一個(gè)事件以及讓消費(fèi)者訂閱感興趣的事件。我們可以把它看成是向一個(gè)異步函數(shù)進(jìn)行回調(diào)傳遞模式的擴(kuò)展。特別是,當(dāng)需要進(jìn)行多次回調(diào)時(shí),EventEmitter會(huì)更顯優(yōu)勢(shì)。

例如,有一個(gè)調(diào)用者向遠(yuǎn)程服務(wù)器發(fā)送了一個(gè)“列出文件”的請(qǐng)求。你可能想對(duì)返回結(jié)果進(jìn)行分組,對(duì)每一個(gè)分組進(jìn)行一次回調(diào)處理。EventEmitter模型可以讓你在每一個(gè)分組上發(fā)送“文件”回調(diào),當(dāng)全部操作完成時(shí)進(jìn)行“結(jié)束”處理。

使用EventEmitter時(shí),只需設(shè)置好相關(guān)事件和參數(shù)。

復(fù)制代碼 代碼如下:

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構(gòu)造函數(shù)創(chuàng)建了一個(gè)時(shí)間觸發(fā)器,觸發(fā)延時(shí)為1s,觸發(fā)事件為myEvent。要使用相關(guān)事件,需要執(zhí)行on()方法:

復(fù)制代碼 代碼如下:

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事件雖然是異步事件,但當(dāng)時(shí)間觸發(fā)時(shí),監(jiān)聽方的動(dòng)作是會(huì)同步的。因此如果上述myEvent事件有10個(gè)監(jiān)聽者,所有的監(jiān)聽會(huì)被按次序調(diào)用而不用等候事件的循環(huán)。

如果EventEmitter的一個(gè)子類生成了一個(gè)emit(‘error')事件,但是無任何的監(jiān)聽方對(duì)此進(jìn)行訂閱,那么EventEmitter基類會(huì)拋出一個(gè)異常,從而導(dǎo)致當(dāng)執(zhí)行process對(duì)象時(shí)觸發(fā)uncaughtException事件。

verror

verror是基類Error的擴(kuò)展,可以讓我們使用printf字符格式定義輸出消息。

Streams(流)

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

透過使用.pipe(),可以讓Note通過pipeline與back-pressure進(jìn)行通信。back-pressure的意思是:只讀取那些能夠?qū)懭氲?,或只寫入那些能夠讀取的。

例如我們現(xiàn)在把來自stdin的數(shù)據(jù)發(fā)送到一個(gè)本地文件和遠(yuǎn)程服務(wù)器:

復(fù)制代碼 代碼如下:

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);
});

而如果我們想發(fā)送數(shù)據(jù)到一個(gè)本地文件,并想使用gunzip對(duì)這個(gè)stream進(jìn)行壓縮,可以這樣做:

復(fù)制代碼 代碼如下:

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

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

如果想對(duì)stream有更多了解,請(qǐng)點(diǎn)擊這里

Control Flow(流程控制)

由于JS中有第一類對(duì)象,閉包等功能概念,因而能夠容易地對(duì)回調(diào)權(quán)限進(jìn)行定義。這在進(jìn)行原型設(shè)計(jì)時(shí)是非常方便的,能夠?qū)壿嫏?quán)限按需進(jìn)行整合。但是同時(shí)容易造成使用笨拙的內(nèi)置函數(shù)。

例如我們想按次序讀入一系列文件,然后執(zhí)行某個(gè)任務(wù):

復(fù)制代碼 代碼如下:

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);
    });
  });
});

這個(gè)模式存在的問題是:

1.這些代碼的邏輯非常散亂無序,相關(guān)的操作流程難以理解。
2.沒有任何差錯(cuò)或異常處理。
3.JS中閉包內(nèi)存泄漏是非常常見的,并難以診斷和探測(cè)。

如果我們想在一個(gè)輸入集上進(jìn)行一系列異步操作,使用一個(gè)流程控制庫是更明智的選擇。這里使用的是vasync。

vasync是一個(gè)流程控制庫,其思路來源于異步操作。它的特別之處是能夠讓消費(fèi)者對(duì)某個(gè)任務(wù)處理過程進(jìn)行查看和觀察。這些信息對(duì)研究某個(gè)錯(cuò)誤的產(chǎn)生過程是非常有用的。

Coding Style(編程風(fēng)格)

編程風(fēng)格可謂最具爭(zhēng)議性的話題,因?yàn)楹芏鄷r(shí)候都是隨性的。蘿卜白菜,各有所愛。重要的是找到適合個(gè)人和團(tuán)隊(duì)的風(fēng)格。一些傳統(tǒng)的傳承或許能夠讓Node開發(fā)之旅變得更美好。

1.為函數(shù)命名
2.盡量對(duì)所有函數(shù)進(jìn)行命名。
3.避免閉包
4.不要在某個(gè)函數(shù)中定義其它函數(shù)。這可減少很多想不到的閉包內(nèi)存泄露意外。
5.更多和更小巧的函數(shù)

V8 JIT雖然是一個(gè)功能強(qiáng)大的引擎,但是更小巧和精簡(jiǎn)的函數(shù)會(huì)與V8結(jié)合得更好。進(jìn)一步說,如果我們的函數(shù)都是小巧玲瓏的(100行左右),我們自己進(jìn)行閱讀和維護(hù)時(shí)也會(huì)感謝自己的。

用編程方式檢查風(fēng)格:保持風(fēng)格一致性,并使用一個(gè)檢查工具來加強(qiáng)。我們使用的是jsstyle。

Linting(代碼檢查)

Lint工具可以在不運(yùn)行情況下進(jìn)行代碼的靜態(tài)分析,檢查出潛在的錯(cuò)誤和風(fēng)險(xiǎn),例如在caseswitch中遺漏了break語句。Lint不簡(jiǎn)單地等同于風(fēng)格檢查,它更針對(duì)于客觀的風(fēng)險(xiǎn)分析,而不是主觀的風(fēng)格選擇。我們使用的javascriptlint,它里面有豐富檢查項(xiàng)目。

Logging(日志記錄)

當(dāng)我們進(jìn)行程序設(shè)計(jì)和編碼時(shí),需要有長(zhǎng)遠(yuǎn)的目光。特別是要考慮好使用什么工具來進(jìn)行調(diào)試。極好的第一步是進(jìn)行有效日志記錄。我們需要對(duì)信息進(jìn)行識(shí)別,看看什么是調(diào)試時(shí)特別留意的,什么是運(yùn)行時(shí)用來分析研究的。這里推薦使用Bunyan,一個(gè)直接的Node.js日志記錄庫,數(shù)據(jù)輸出格式是JSON ,要了解更多信息,請(qǐng)點(diǎn)擊這里。

Client Server

如果一款應(yīng)用具備分布式處理能力,在市場(chǎng)上會(huì)更有吸引力。類似的接口可以用HTTP RESTFul API或原始的TCP JSON來描述。這可以讓開發(fā)者把Node上的經(jīng)驗(yàn)與異步網(wǎng)絡(luò)環(huán)境相結(jié)合,以及把streams的使用與分布式可擴(kuò)展式系統(tǒng)相結(jié)合。

常用工具:

1. restify

簡(jiǎn)單來說,這是一個(gè)用于構(gòu)建REST服務(wù)的工具。它提供了良好的查看和調(diào)試處理支援,同時(shí)支持Bunyan與DTrace。

2. fast

fast是一款以TCP來處理JSON消息的輕量級(jí)工具。提供了DTrace支持,能夠讓我們迅速地對(duì)服務(wù)器客戶端進(jìn)行性能特征識(shí)別。

3. workflow

workflow構(gòu)建于restify之上,能夠?qū)σ幌盗羞h(yuǎn)程服務(wù)和API進(jìn)行業(yè)務(wù)流程定義。例如:錯(cuò)誤狀態(tài),超時(shí),重新連接,擁塞處理等。

相關(guān)文章

  • npm安裝yarn后找不到y(tǒng)arn報(bào)錯(cuò)的解決過程

    npm安裝yarn后找不到y(tǒng)arn報(bào)錯(cuò)的解決過程

    這篇文章主要給大家介紹了關(guān)于npm安裝yarn后找不到y(tǒng)arn報(bào)錯(cuò)的解決過程,文中通過圖文介紹的非常詳細(xì),對(duì)遇到同樣問題的同學(xué)具有一定的參考性,需要的朋友可以參考下
    2023-04-04
  • Node.js系列之安裝配置與基本使用(1)

    Node.js系列之安裝配置與基本使用(1)

    這篇文章主要為大家詳細(xì)介紹了Node.js系列之安裝配置與基本使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 基于socket.io+express實(shí)現(xiàn)多房間聊天

    基于socket.io+express實(shí)現(xiàn)多房間聊天

    本文給大家分享的是使用node.js,基于socket.io+express實(shí)現(xiàn)多房間聊天的代碼,非常的實(shí)用,有需要的小伙伴可以來參考下
    2016-03-03
  • 使用命令行升級(jí)Node.js的版本的操作指南

    使用命令行升級(jí)Node.js的版本的操作指南

    這篇文章主要給大家介紹了關(guān)于如何使用命令行升級(jí)Node.js的版本的操作指南,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2023-11-11
  • nodejs搭建本地服務(wù)器并訪問文件操作示例

    nodejs搭建本地服務(wù)器并訪問文件操作示例

    這篇文章主要介紹了nodejs搭建本地服務(wù)器并訪問文件操作,結(jié)合實(shí)例形式分析了nodejs搭建本地服務(wù)器操作步驟及文件訪問相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-05-05
  • 修改node.js默認(rèn)的npm安裝目錄實(shí)例

    修改node.js默認(rèn)的npm安裝目錄實(shí)例

    今天小編就為大家分享一篇修改node.js默認(rèn)的npm安裝目錄實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • node-red教程之dashboard簡(jiǎn)介與輸入型儀表板控件的使用

    node-red教程之dashboard簡(jiǎn)介與輸入型儀表板控件的使用

    Node-red支持自定義節(jié)點(diǎn),當(dāng)然也就支持自定義圖形化的節(jié)點(diǎn)。也有優(yōu)秀的開發(fā)者把自己建立的圖形化節(jié)點(diǎn)無償分享。這里給出一個(gè)股票界面的例子,讓大家看一看優(yōu)秀的node-red界面能做到什么樣子
    2022-01-01
  • 基于NodeJS的前后端分離的思考與實(shí)踐(一)全棧式開發(fā)

    基于NodeJS的前后端分離的思考與實(shí)踐(一)全棧式開發(fā)

    這個(gè)話題最近被討論得比較多,阿里有些BU也在進(jìn)行一些嘗試。討論了很久之后,我們團(tuán)隊(duì)決定探索一套基于NodeJS的前后端分離方案,過程中有一些不斷變化的認(rèn)識(shí)以及思考,記錄在這里,也希望看到的同學(xué)參與討論,幫我們完善。
    2014-09-09
  • node.js實(shí)現(xiàn)學(xué)生檔案管理

    node.js實(shí)現(xiàn)學(xué)生檔案管理

    這篇文章主要為大家詳細(xì)介紹了node.js實(shí)現(xiàn)學(xué)生檔案管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Node.js API詳解之 util模塊用法實(shí)例分析

    Node.js API詳解之 util模塊用法實(shí)例分析

    這篇文章主要介紹了Node.js API詳解之 util模塊用法,結(jié)合實(shí)例形式分析了node.js API中util模塊基本功能與相關(guān)函數(shù)使用技巧,需要的朋友可以參考下
    2020-05-05

最新評(píng)論