Node.js開發者必須瞭解的4個JS要點
Node.js是一個面向伺服器的框架,立足於Chrome強大的V8 JS引擎。儘管它由C++編寫而成,但是它及其應用是執行在JS上的。本文為開發者總結了4個Node.js要點。
1. 非阻塞(Non-blocking)或非同步I/O
由於Node.js一個伺服器端框架,所以它主要工作之一是處理瀏覽器請求。在傳統的I/O系統中,每個請求的發出都是在上一請求到達之後才發出的。所以這被稱為阻塞(blocking)I/O。伺服器會阻擋其它的請求以處理當前請求,從而導致瀏覽器等待。
Node.js不以這種方式來進行I/O處理。如果一個請求需要長時間處理,Node.js會把該請求傳送給一個事件迴圈(event loop),然後繼續處理在呼叫堆疊(call stack)中的下一請求。當延後請求處理完畢時,它會告知Node.js同時瀏覽器會做出響應反饋。
以下使用一個事例來說明。
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.
在這個餐館例子中,服務員接收了選單指令,等待飯菜處理,然後在飯菜處理完成後把飯菜端到桌子上。在服務員等候飯菜處理期間,他會拒絕其它客人的選單指令。
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); }); // take order for table 3 and move on... orderNonBlocking(['Hamburger', 'Pizza'], function(food){ return serveOrder(food); });
而在非阻塞模式下,服務員會告知廚師他接受到的選單指令,然後去接收下一桌的指令。當第一桌飯菜處理完畢時,他會為那桌客人上菜,然後繼續接收其它客人的指令。這樣一來服務員不會由於阻塞指令而造成時間浪費。
2. 原型(Prototype)
原型在JS中是一個複雜的概念。在典型繼承機制語言如Java或C++中,為了實現程式碼複用,你必須先建立一個類然後透過它來生成物件或透過類擴充套件來生成物件。但是在JS中沒有類似的類概念。在JS中建立一個物件後,你需要透過它來擴充套件物件或建立新物件。這就叫做原型繼承(prototypal inheritence)。
每個JS物件都連線著一個原型物件並對並繼承該物件的屬性。每個物件與預定義JS的Object.prototype相聯絡。如果你透過obj.propName或obj['propName'>方式來查詢物件屬性但查詢失敗時,這時可嘗試通過obj.hasOwnProperty('propName')的方式進行查詢,JS執行時會在在原型物件中查詢屬性。如果屬性不存在於原型鏈中,那麼將返回undefined值。
讓我們用以下例子來進行說明:
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個要點的含義。
原文出自: Dzone
相關文章
- Perl開發者必須瞭解的14個資源
- Node.js新手必須知道的4個JavaScript概念Node.jsJavaScript
- 你必須瞭解的微服務架構設計的10個要點!微服務架構
- 高效Android開發者必須知道的4個工具Android
- 使用Redis之前5個必須瞭解的事情Redis
- 移動開發者必須瞭解的10大跨平臺工具移動開發
- 移動開發者必須瞭解的三大職業趨勢移動開發
- 遊戲開發者必須掌握的移動廣告6大要點遊戲開發
- Zookeeper必須瞭解的基礎
- 關於機器學習你必須瞭解的十個真相機器學習
- JS 開發者必須知道的十個 ES6 新特性JS
- 作為 Android 開發者必須瞭解的 Gradle 知識 (譯)AndroidGradle
- 檔案管理,你必須要知道的三個要點
- 獨立遊戲想要生存 開發者必須要問自己這個問題遊戲
- 軟體工程師必須知道20個知識點你瞭解多少?軟體工程工程師
- 10個Node.js 開發人員必須使用的IDENode.jsIDE
- Linux 開發者必須瞭解的常見檔案系統對比Linux
- Android 開發者和設計師必須瞭解的顏色知識Android
- 釋出新聞稿必須瞭解的幾個問題
- 開發一個 Web App 必須瞭解的那些事WebAPP
- JS高階之面試必須知道的幾個點JS面試
- 15個必須知道的chrome開發者技巧Chrome
- 入門node.js你必須知道的那些事Node.js
- 黑科技在此!移動開發者必須瞭解的跨平臺開發工具移動開發
- Linux新手入門必須要掌握的10個知識點!Linux
- 50個你必須瞭解的Kubernetes面試問題面試
- 有關WebSocket必須瞭解的知識Web
- 你必須瞭解Spring的生態Spring
- 必須要會的 50 個 React 面試題React面試題
- Java程式設計師微服務架構你必須要掌握的十個要點Java程式設計師微服務架構
- 人生苦短,瞭解一下前端必須明白的http知識點前端HTTP
- Node.js簡單瞭解Node.js
- 你必須瞭解的「架構」小歷史架構
- 你必須瞭解的分散式事務解決方案分散式
- 13個網路管理員必須瞭解的網路監控工具
- 聊聊開始資料治理前必須瞭解的四個內容
- 【轉】33 個 2017 年必須瞭解的 iOS 開源庫iOS
- iOS程式設計師必須知道的Android要點iOS程式設計師Android