成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

認(rèn)識(shí) Node .js

I_Am / 3008人閱讀

摘要:服務(wù)器每收到一條請(qǐng)求,都會(huì)用新的和對(duì)象觸發(fā)請(qǐng)求回調(diào)函數(shù)。在調(diào)用完請(qǐng)求回調(diào)函數(shù)之后,就要由你負(fù)責(zé)用方法結(jié)束響應(yīng)。

前言

本文將介紹Node.js的一些基本概念,包含它的歷史,特性和簡(jiǎn)單的使用等。如果你有過(guò)服務(wù)端的編程經(jīng)驗(yàn),那么你將能很快熟悉它。

Node.js是什么

這是Node.js官網(wǎng)上對(duì)其的定義,就是說(shuō),Node.js是一個(gè)javascript運(yùn)行平臺(tái),該平臺(tái)基于chrome v8 引擎。V8讓Node.js在性能上得到了巨大的提升,因?yàn)樗サ袅酥虚g環(huán)節(jié),執(zhí)行的不是字節(jié)碼,用的也不是解釋器,而是直接編譯成了本地機(jī)器碼。(注意:v8 5.9 發(fā)布后,Ignition 字節(jié)碼解釋器將默認(rèn)啟動(dòng),v8 又回到了字節(jié)碼的懷抱,具體請(qǐng)參閱:https://cnodejs.org/topic/590...)

Node.js帶來(lái)的好處

對(duì)一名前端而言,Node無(wú)疑有如下幾個(gè)好處:

開(kāi)發(fā)人員用一種語(yǔ)言就能編寫(xiě)整個(gè)Web應(yīng)用,這可以減少開(kāi)發(fā)客戶(hù)端和服務(wù)端時(shí)所需的語(yǔ)言切換。

有些NoSQL數(shù)據(jù)庫(kù)中用的就是JavaScript語(yǔ)言,(比如CouchDB和MongoDB),所以跟它們配合使用非常方便。

Node用的虛擬機(jī)(V8)會(huì)緊跟ECMAScript標(biāo)準(zhǔn)。換句話(huà)說(shuō),在Node中如果想用新的JavaScript語(yǔ)言特性,不用等到所有瀏覽器都支持。

特點(diǎn)

Node.js采用的是事件驅(qū)動(dòng)、非阻塞I/O的設(shè)計(jì)模型。大家想到了什么?這和javascript在瀏覽器上的運(yùn)行機(jī)制是一樣的。
另外,對(duì)于高并發(fā)的處理,傳統(tǒng)平臺(tái)采用的是多線(xiàn)程方案,而Node.js則采用的是單線(xiàn)程、事件驅(qū)動(dòng)、非阻塞I/O的設(shè)計(jì)模型。

我們來(lái)看一個(gè)瀏覽器中的例子

$.post("/resource.json", function (data) {
  console.log(data)
})
// 繼續(xù)執(zhí)行

上面代碼是瀏覽器中的一個(gè)ajax請(qǐng)求,假如該請(qǐng)求需要耗費(fèi)600ms,該ajax請(qǐng)求會(huì)在事件輪詢(xún)的外面執(zhí)行(腳本執(zhí)行的主順序之外),然后當(dāng)這個(gè)ajax請(qǐng)求完成時(shí)(600ms后),它會(huì)發(fā)出一個(gè)“事件”,會(huì)有一個(gè)函數(shù)(通常稱(chēng)作“回調(diào)”)來(lái)處理它。
這個(gè)操作是異步的,并不會(huì)“阻塞”腳本執(zhí)行,事件輪詢(xún)?nèi)匀豢梢皂憫?yīng)頁(yè)面上執(zhí)行的其他交互或請(qǐng)求。這樣,瀏覽器可以對(duì)客戶(hù)做出響應(yīng),并且可以處理頁(yè)面上的很多交互動(dòng)作。

我們?cè)賮?lái)看一個(gè)服務(wù)器中的例子:

// 數(shù)據(jù)庫(kù)查詢(xún)操作
db.query("SELECT * FORM work", function (data) {
    console.log(data)
  }
)

這段代碼做了些I/O操作,并且在所有數(shù)據(jù)回來(lái)之前,這個(gè)進(jìn)程并不會(huì)被阻塞。在Node中,I/O幾乎總是在主事件輪詢(xún)之外進(jìn)行,使得服務(wù)器可以一直處于高效并且隨時(shí)能夠做出響應(yīng)的狀態(tài),就像NGINX(帶有異步I/O的事件輪詢(xún)的一種http服務(wù)器)一樣。這樣進(jìn)程不會(huì)受I/O限制,因?yàn)镮/O延遲不會(huì)拖垮服務(wù)器。因此一些在服務(wù)器上曾經(jīng)是重量級(jí)的操作,在Node服務(wù)器上仍然可以是輕量級(jí)的。

dirt程序

Node所針對(duì)的應(yīng)用程序有一個(gè)專(zhuān)門(mén)的簡(jiǎn)稱(chēng):DIRT。它表示數(shù)據(jù)密集型實(shí)時(shí)(data-intensive real-time)程序。上面已經(jīng)提到,Node自身在I/O上非常輕量,能在處理大量請(qǐng)求時(shí)保持很多開(kāi)放的連接,并且只占用一小部分內(nèi)存,所以,它特別擅長(zhǎng)處理數(shù)據(jù)密集型實(shí)時(shí)應(yīng)用。比如在線(xiàn)文檔協(xié)作、對(duì)臨近公交車(chē)的實(shí)時(shí)精確定位,以及多人在線(xiàn)游戲等。

簡(jiǎn)單的例子

接下來(lái)我們先看一些簡(jiǎn)單的例子。

文件操作
var fs = require("fs")

fs.readFile("./package.json", "utf8", function (er, data) {
  console.log(data)
})

這段程序是要從硬盤(pán)里讀取package.json文件。當(dāng)所有數(shù)據(jù)都讀出來(lái)后,就會(huì)調(diào)用那個(gè)回調(diào)函數(shù)。require("fs")是指加載Node提供的文件模塊,讀取的文件內(nèi)容將用utf8進(jìn)行編碼。

HTTP服務(wù)器

如果你有 PHP 開(kāi)發(fā)經(jīng)驗(yàn),會(huì)知道在成功運(yùn)行 PHP 之前先要配置一個(gè)功能強(qiáng)大而復(fù)雜的 HTTP 服務(wù)器,譬如Apache、IIS 或 Nginx,還需要將 PHP 配置為 HTTP 服務(wù)器的模塊,或者使用 FastCGI 協(xié)議調(diào)用 PHP 解釋器。這種架構(gòu)是“瀏覽器 - HTTP 服務(wù)器 - PHP 解釋器”的組織方式,而Node.js 將“HTTP服務(wù)器”這一層抽離,直接面向?yàn)g覽器用戶(hù)。如下圖所示:

接下來(lái),讓我們創(chuàng)建一個(gè) HTTP 服務(wù)器吧。建立一個(gè)名為 app.js 的文件,代碼如下:

var http = require("http")

http.createServer(function(req, res) {
  res.writeHead(200, {"Content-Type": "text/html"})
  res.write("

Node.js

") res.end("

Hello World

") }).listen(3000) console.log("HTTP server is listening at port 3000.")

上面代碼中,創(chuàng)建HTTP服務(wù)器調(diào)用了http.createServer()函數(shù)。它只有一個(gè)參數(shù),是個(gè)回調(diào)函數(shù),服務(wù)器每次收到HTTP請(qǐng)求后都會(huì)調(diào)用這個(gè)回調(diào)函數(shù)。這個(gè)請(qǐng)求回調(diào)有兩個(gè)參數(shù),請(qǐng)求和響應(yīng)對(duì)象,通常簡(jiǎn)寫(xiě)為req和res。服務(wù)器每收到一條HTTP請(qǐng)求,都會(huì)用新的req和res對(duì)象觸發(fā)請(qǐng)求回調(diào)函數(shù)。
res.writeHead()方法設(shè)定了響應(yīng)狀態(tài)碼為200和響應(yīng)頭中的Content-Type為text/html類(lèi)型。
response.write()方法表示向請(qǐng)求的客戶(hù)端發(fā)送響應(yīng)內(nèi)容。 內(nèi)容可以是一個(gè)Buffer或字符串,表示要發(fā)送的內(nèi)容。
Node不會(huì)自動(dòng)往客戶(hù)端寫(xiě)任何響應(yīng)。在調(diào)用完請(qǐng)求回調(diào)函數(shù)之后,就要由你負(fù)責(zé)用res.end()方法結(jié)束響應(yīng)。所以,最終程序用res.end("

Hello World

")結(jié)束了一次響應(yīng)。

在終端中運(yùn)行node app.js 命令,打開(kāi)瀏覽器訪(fǎng)問(wèn) http://127.0.0.1:3000 試試吧。

Node在處理數(shù)據(jù)流上也很強(qiáng)大。你可以把數(shù)據(jù)流看成特殊的數(shù)組,只不過(guò)數(shù)組中的數(shù)據(jù)分散在空間上,而數(shù)據(jù)流中的數(shù)據(jù)是分散在時(shí)間上的。通過(guò)將數(shù)據(jù)一塊一塊地傳送,開(kāi)發(fā)人員可以每收到一塊數(shù)據(jù)就開(kāi)始處理,而不用等所有數(shù)據(jù)都到全了再做處理。
下面我們看一個(gè)例子:

var fs = require("fs")
var stream = fs.createReadStream("./package.json")

stream.on("data", function (chunk) {
  console.log(chunk)
})
stream.on("end", function () {
  console.log("finished")
})

只要有新的數(shù)據(jù)塊準(zhǔn)備好,就會(huì)激發(fā)data事件,當(dāng)所有數(shù)據(jù)塊都加載完之后,會(huì)激發(fā)一個(gè)end事件。
程序可以邊讀取邊處理,這要比等著所有數(shù)據(jù)都緩存到內(nèi)存中再處理效率高得多。
Node中也有可寫(xiě)數(shù)據(jù)流,可以往里寫(xiě)數(shù)據(jù)塊。當(dāng)HTTP服務(wù)器上有請(qǐng)求過(guò)來(lái)時(shí),對(duì)其進(jìn)行響應(yīng)的res對(duì)象就是可寫(xiě)數(shù)據(jù)流的一種。
可讀和可寫(xiě)數(shù)據(jù)流可以連接起來(lái)形成管道,這是一種高效的數(shù)據(jù)處理方式,只要有數(shù)據(jù)準(zhǔn)備好就可以處理,不用等著讀取完整個(gè)資源再把它寫(xiě)出去。
用我們上面的HTTP服務(wù)器,看看如何把一張圖片流到客戶(hù)端:

var http = require("http")
var fs = require("fs")

http.createServer(function (req, res) {
  res.writeHead(200, {"Content-Type": "image/png"})
  fs.createReadStream("./img.png").pipe(res)
}).listen(3000)

console.log("Server running at http://localhost:3000/")

在這行代碼中,數(shù)據(jù)從文件中讀進(jìn)來(lái)(fs.createReadStream),然后數(shù)據(jù)隨著進(jìn)來(lái)就被送到(.pipe)客戶(hù)端(res)。在數(shù)據(jù)流動(dòng)時(shí),事件輪詢(xún)還能處理其他事件。

小結(jié)

相信讀到這里,大家對(duì)Node的優(yōu)勢(shì)和特性已經(jīng)有了一些了解,并且通過(guò)本文的三個(gè)編程小例子,對(duì)Node的一些用法也有了一些體會(huì),Node跟所有技術(shù)一樣,并不是萬(wàn)能藥。它擅長(zhǎng)解決某些問(wèn)題,并為我們帶來(lái)方便。同樣的,在某些方面,卻是它的短板,比如:計(jì)算密集型應(yīng)用。希望你能在用Node開(kāi)發(fā)之前,多一些合理的考慮,多一份編程的快樂(lè)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95900.html

相關(guān)文章

  • 認(rèn)識(shí)node核心模塊--從Buffer、Stream到fs

    摘要:端輸入數(shù)據(jù)到端,對(duì)就是輸入流,得到的對(duì)象就是可讀流對(duì)就是輸出端得到的對(duì)象是可寫(xiě)流。在中,這四種流都是的實(shí)例,它們都有事件,可讀流具有監(jiān)聽(tīng)數(shù)據(jù)到來(lái)的事件等,可寫(xiě)流則具有監(jiān)聽(tīng)數(shù)據(jù)已傳給低層系統(tǒng)的事件等,和都同時(shí)實(shí)現(xiàn)了和的事件和接口。 原文地址在我的博客 node中的Buffer和Stream會(huì)給剛接觸Node的前端工程師們帶來(lái)困惑,原因是前端并沒(méi)有類(lèi)似概念(or 有我們也沒(méi)意識(shí)到)。然而,...

    TANKING 評(píng)論0 收藏0
  • 還不打算去認(rèn)識(shí)一下webpack?

    摘要:前言隨我來(lái)去看看為時(shí)未晚第一版較淺顯的知識(shí)懂得可忽略本文方向安裝起步搭建運(yùn)行粗略代過(guò)對(duì)于資源的管理對(duì)于輸出的管理舉例介紹本地開(kāi)發(fā)基礎(chǔ)服務(wù)熱更新模塊熱替換初步認(rèn)識(shí)初步構(gòu)建新建一個(gè)文件并進(jìn)入更目錄是命令初始一個(gè)文件表示跳過(guò)詢(xún)問(wèn)步驟安裝 前言 隨我來(lái),去看看webpack!(為時(shí)未晚)============》第一版(較淺顯的知識(shí),懂得可忽略本文) 方向 安裝,起步搭建運(yùn)行. (粗略代...

    Tony_Zby 評(píng)論0 收藏0
  • 認(rèn)識(shí)React

    摘要:認(rèn)識(shí)準(zhǔn)備寫(xiě)有兩種方式通過(guò)通過(guò)寫(xiě)起來(lái)感覺(jué)會(huì)更方便,但就需要用進(jìn)行編譯了。組件的兩個(gè)重要對(duì)象就是一個(gè)組件模板的數(shù)據(jù)對(duì)象。當(dāng)一個(gè)組件進(jìn)行了登錄之后,應(yīng)該通知其他需要更新登錄信息的組件。 認(rèn)識(shí)React 準(zhǔn)備 babel-cli 寫(xiě) React 有兩種方式: 通過(guò) jsx 通過(guò) js jsx 寫(xiě)起來(lái)感覺(jué)會(huì)更方便,但就需要用babel進(jìn)行編譯了。 用babel編譯 React 的 jsx 有...

    noONE 評(píng)論0 收藏0
  • 從安裝認(rèn)識(shí)Angular 2

    摘要:首先,要確認(rèn)安裝了,并且創(chuàng)建了目錄并執(zhí)行初始化。想必看見(jiàn)上面的那么多包會(huì)一臉懵逼,沒(méi)關(guān)系,我第一眼看見(jiàn)這些的那刻,和你現(xiàn)在的表情一樣,下面在適當(dāng)?shù)臅r(shí)候我會(huì)逐個(gè)解釋的,你只需要相信我上面的包都是跑所必須的,缺一不可。 關(guān)于介紹,只說(shuō)一句:Angular 2是一個(gè)強(qiáng)大、全面、龐大的MVVM框架。 安裝 安裝,也算是一個(gè)坎,因?yàn)槟阈枰惭b一大堆東西,卻不知道每個(gè)東西是做什么的,盡管有Angu...

    xietao3 評(píng)論0 收藏0
  • 染陌的 2017 年度總結(jié)

    摘要:寫(xiě)在前面看到了死月佳楠等朋友都寫(xiě)了關(guān)于的年度總結(jié),總覺(jué)得自己也應(yīng)該寫(xiě)點(diǎn)東西來(lái)回首過(guò)去的一年,順便展望一下未來(lái)的年。在這份榜單上排在的位置,年也希望更上一層樓。年底跟女朋友結(jié)束了四年的戀愛(ài)長(zhǎng)跑,成功領(lǐng)證。 寫(xiě)在前面 看到了死月、doodlewind、佳楠等朋友都寫(xiě)了關(guān)于 2017 的年度總結(jié),總覺(jué)得自己也應(yīng)該寫(xiě)點(diǎn)東西來(lái)回首過(guò)去的一年,順便展望一下未來(lái)的 2018 年。 由于之前忙于撰寫(xiě)《...

    AdolphLWQ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<