Node.js開發者必須瞭解的4個JS要點

Node.js是一個面向服務器的框架,立足於Chrome強大的V8 JS引擎。儘管它由C++編寫而成,可是它及其應用是運行在JS上的。本文爲開發者總結了4個Node.js要點。css


1. 非阻塞(Non-blocking)或異步I/O

因爲Node.js一個服務器端框架,因此它主要工做之一是處理瀏覽器請求。在傳統的I/O系統中,每一個請求的發出都是在上一請求到達以後才發出的。因此這被稱爲阻塞(blocking)I/O。服務器會阻擋其它的請求以處理當前請求,從而致使瀏覽器等待。html

Node.js不以這種方式來進行I/O處理。若是一個請求須要長時間處理,Node.js會把該請求發送給一個事件循環(event loop),而後繼續處理在調用堆棧(call stack)中的下一請求。當延後請求處理完畢時,它會告知Node.js同時瀏覽器會作出響應反饋。前端

如下使用一個事例來講明。vue

Blocking I/O

`// take order for table 1 and wait... `
`var` `order1 = orderBlocking([``'Coke'``,` `'Iced Tea'``]); `
`// once order is ready, take order back to table. `
`serveOrder(order1); `
`// once order is delivered, move on to another table. `
`// take order for table 2 and wait... `
`var` `order2 = orderBlocking([``'Coke'``,` `'Water'``]); `
`// once order is ready, take order back to table. `
`serveOrder(order2); `
`// once order is delivered, move on to another table. `
`// take order for table 3 and wait... `
`var` `order3 = orderBlocking([``'Iced Tea'``,` `'Water'``]); `
`// once order is ready, take order back to table. `
`serveOrder(order3); `
`// once order is delivered, move on to another table.`
複製代碼

在這個餐館例子中,服務員接收了菜單指令,等待飯菜處理,而後在飯菜處理完成後把飯菜端到桌子上。在服務員等候飯菜處理期間,他會拒絕其它客人的菜單指令。node

Non-blocking I/O

`// take order for table 1 and move on... `
`orderNonBlocking([``'Coke'``,` `'Iced Tea'``],` `function``(drinks){ `
`return` `serveOrder(drinks); `
`}); `
`// take order for table 2 and move on... `
`orderNonBlocking([``'Beer'``,` `'Whiskey'``],` `function``(drinks){ `
`return` `serveOrder(drinks); `
`}); `
}//歡迎加入全棧開發交流划水交流圈:582735936
]//面向划水1-3年前端人員
}   //幫助突破划水瓶頸,提高思惟能力
`// take order for table 3 and move on... `
`orderNonBlocking([``'Hamburger'``,` `'Pizza'``],` `function``(food){ `
`return` `serveOrder(food); `
`});`
複製代碼

而在非阻塞模式下,服務員會告知廚師他接受到的菜單指令,而後去接收下一桌的指令。當第一桌飯菜處理完畢時,他會爲那桌客人上菜,而後繼續接收其它客人的指令。這樣一來服務員不會因爲阻塞指令而形成時間浪費。webpack

2. 原型(Prototype)

原型在JS中是一個複雜的概念。在典型繼承機制語言如Java或C++中,爲了實現代碼複用,你必須先建立一個類而後透過它來生成對象或透過類擴展來生成對象。可是在JS中沒有相似的類概念。在JS中建立一個對象後,你須要透過它來擴展對象或建立新對象。這就叫作原型繼承(prototypal inheritence)。程序員

每一個JS對象都鏈接着一個原型對象並對並繼承該對象的屬性。每一個對象與預約義JS的Object.prototype相聯繫。若是你透過obj.propName或obj['propName'>方式來查找對象屬性但查找失敗時,這時可嘗試經過obj.hasOwnProperty('propName')的方式進行查找,JS運行時會在在原型對象中查找屬性。若是屬性不存在於原型鏈中,那麼將返回undefined值。web

讓咱們用如下例子來進行說明:面試

`if` `(``typeof` `Object.create !==` `'function'``) { `
`Object.create =` `function` `(o) { `
`var` `F =` `function` `() {}; `
`F.prototype = o; `
`return` `new` `F(); `
`}; `
`var` `otherPerson = Object.create(person);`
複製代碼

當你建立了一個新對象,你必須選定一個以原型爲基礎的對象。在這裏,咱們爲對象函數添加了一個create方法。create方法建立了一個以其它對象爲原型的對象,並做爲參數傳入。瀏覽器

當咱們變動新的對象時,它的原型是保持不變的。可是,當咱們改動了原型對象,該變動會影響全部基於該原型的對象。

3. 模塊(Modules)

若是你曾在Java中使用過包,那麼Node.js的組件與之相似。若是沒有,也不用擔憂;組件實際上是簡單的JS文件,用於實現特定的功能。組件模式的意義是讓你工做得更加輕鬆。要使用組件,你必須像在JAVA中導入包同樣進行JS文件導入。Node.js中有兩種組件

核心組件(Core Modules)- 核心組件是結合Node.js庫被預編譯的。其目的是把程序員常用的功能開放出來,避免重複勞動。常見的核心組件有HTTP, URL, EVENTS, FILE SYSTEM等等。

用戶自定義組件(UserDefined Modules)- 用戶自定義組件是提供給用戶使用以實現具體功能的組件。當核心組件不足以知足程序員須要的時候,自定義組件就可派上用場了。

組件是經過require函數被抽取的。若是這是一個核心組件,那麼參數就是組件名。若是這是一個用戶自定義組件,那麼參數就是其在文件系統中的組件路徑。例如:

`// extract a core module like this `
`var` `http = require(``'http); ` `// extract a user defined module like this ` `var something = require('``./folder1/folder2/folder3/something.js'); ` 複製代碼

4. 回調(Callbacks)

在JS中,函數是第一類對象。也就是說你能夠像對常規對象那樣對函數進行全部操做。例如指派函數到一個變量,把這些做爲參數傳給方法,把它們聲明爲對象的屬性,甚至是把它們從函數裏返回。

回調在JS中是異步函數,能夠做爲參數傳遞給其它函數或從其它函數裏執行或返回然後再執行。這是回調的基本概念。

當咱們把一個回調函數做爲參數傳遞給另外的函數時,咱們傳遞的僅僅是函數的定義;換言之,咱們不會知道回調函數的執行時間。這徹底依賴於回調函數機制。它會在稍後某個時間點進行回調調用。這是Node.js的非阻塞或異步行爲的基本概念,可用下例進行說明:

`setTimeout(``function``() { `
`console.log(``"world"``); `
`}, 2000) `
`console.log(``"hello"``);   `
複製代碼

這是一個最簡單的調用。咱們把一個匿名函數做爲參數進行傳遞,做用是爲setTimeout函數進行控制檯的輸出記錄登記。由於這僅僅是個函數定義,咱們不知道函數什麼時候會被執行。這取決於setTimeout函數的second參數,即2S後。

首先,second記錄語句記錄了對控制檯的輸出,2S後,在回調函數中的記錄語句記錄了輸出的內容。

`// output `
`hello `
`world`
複製代碼

寫在最後

以上4點對Node.js開發者來講是要完全理解和掌握的,建議多動手來好好體會這4個要點的含義。本次給你們推薦一個免費的學習羣,裏面歸納移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。

相關文章
相關標籤/搜索