Node.js開發(fā)者必須了解的4個JS要點
本文為開發(fā)者總結了4個Node.js要點。
1. 非阻塞(Non-blocking)或異步I/O
由于Node.js一個服務器端框架,所以它主要工作之一是處理瀏覽器請求。在傳統(tǒng)的I/O系統(tǒng)中,每個請求的發(fā)出都是在上一請求到達之后才發(fā)出的。所以這被稱為阻塞(blocking)I/O。服務器會阻擋其它的請求以處理當前請求,從而導致瀏覽器等待。
Node.js不以這種方式來進行I/O處理。如果一個請求需要長時間處理,Node.js會把該請求發(fā)送給一個事件循環(huán)(event loop),然后繼續(xù)處理在調用堆棧(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); });
而在非阻塞模式下,服務員會告知廚師他接受到的菜單指令,然后去接收下一桌的指令。當第一桌飯菜處理完畢時,他會為那桌客人上菜,然后繼續(xù)接收其它客人的指令。這樣一來服務員不會由于阻塞指令而造成時間浪費。
2. 原型(Prototype)
原型在JS中是一個復雜的概念。在典型繼承機制語言如Java或C++中,為了實現代碼復用,你必須先創(chuàng)建一個類然后透過它來生成對象或透過類擴展來生成對象。但是在JS中沒有類似的類概念。在JS中創(chuàng)建一個對象后,你需要透過它來擴展對象或創(chuàng)建新對象。這就叫做原型繼承(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);
當你創(chuàng)建了一個新對象,你必須選定一個以原型為基礎的對象。在這里,我們?yōu)閷ο蠛瘮堤砑恿艘粋€create方法。create方法創(chuàng)建了一個以其它對象為原型的對象,并作為參數傳入。
當我們變更新的對象時,它的原型是保持不變的。但是,當我們改動了原型對象,該變更會影響所有基于該原型的對象。
3. 組件(Modules)
如果你曾在Java中使用過包,那么Node.js的組件與之類似。如果沒有,也不用擔心;組件其實是簡單的JS文件,用于實現特定的功能。組件模式的意義是讓你工作得更加輕松。要使用組件,你必須像在JAVA中導入包一樣進行JS文件導入。Node.js中有兩種組件
核心組件(Core Modules)- 核心組件是結合Node.js庫被預編譯的。其目的是把程序員經常使用的功能開放出來,避免重復勞動。常見的核心組件有HTTP, URL, EVENTS, FILE SYSTEM等等。
用戶自定義組件(UserDefined Modules)- 用戶自定義組件是提供給用戶使用以實現具體功能的組件。當核心組件不足以滿足程序員需要的時候,自定義組件就可派上用場了。
組件是通過require函數被抽取的。如果這是一個核心組件,那么參數就是組件名。如果這是一個用戶自定義組件,那么參數就是其在文件系統(tǒng)中的組件路徑。例如:
// 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中,函數是第一類對象。也就是說你可以像對常規(guī)對象那樣對函數進行所有操作。例如指派函數到一個變量,把這些作為參數傳給方法,把它們聲明為對象的屬性,甚至是把它們從函數里返回。
回調在JS中是異步函數,可以作為參數傳遞給其它函數或從其它函數里執(zhí)行或返回而后再執(zhí)行。這是回調的基本概念。
當我們把一個回調函數作為參數傳遞給另外的函數時,我們傳遞的僅僅是函數的定義;換言之,我們不會知道回調函數的執(zhí)行時間。這完全依賴于回調函數機制。它會在稍后某個時間點進行回調調用。這是Node.js的非阻塞或異步行為的基本概念,可用下例進行說明:
setTimeout(function() { console.log("world"); }, 2000) console.log("hello");
這是一個最簡單的調用。我們把一個匿名函數作為參數進行傳遞,作用是為setTimeout函數進行控制臺的輸出記錄登記。因為這僅僅是個函數定義,我們不知道函數何時會被執(zhí)行。這取決于setTimeout函數的second參數,即2S后。
首先,second記錄語句記錄了對控制臺的輸出,2S后,在回調函數中的記錄語句記錄了輸出的內容。
// output hello world
寫在最后
以上4點對Node.js開發(fā)者來說是要徹底理解和掌握的,建議多動手來好好體會這4個要點的含義。
- 調試Node.JS的輔助工具(NodeWatcher)
- node.js開發(fā)中使用Node Supervisor實現監(jiān)測文件修改并自動重啟應用
- 我用的一些Node.js開發(fā)工具、開發(fā)包、框架等總結
- Windows8下搭建Node.js開發(fā)環(huán)境教程
- 在Linux系統(tǒng)中搭建Node.js開發(fā)環(huán)境的簡單步驟講解
- windows8.1+iis8.5下安裝node.js開發(fā)環(huán)境
- 詳解Windows下運用Docker部署Node.js開發(fā)環(huán)境
- Node.js開發(fā)之訪問Redis數據庫教程
- Node.js開發(fā)指南中的簡單實例(mysql版)
- Ubuntu 16.04 64位中搭建Node.js開發(fā)環(huán)境教程
- Node.js開發(fā)第三方微信公眾平臺
- 詳解Node.js開發(fā)中的express-session
- linux環(huán)境安裝node.js開發(fā)環(huán)境搭建圖文教程
- Node.js開發(fā)教程之基于OnceIO框架實現文件上傳和驗證功能
- 如何利用node.js開發(fā)一個生成逐幀動畫的小工具
- Node.js開發(fā)之套接字(socket)編程入門示例
- node.js開發(fā)輔助工具nodemon安裝與配置詳解
相關文章
Node.js服務器環(huán)境下使用Mock.js攔截AJAX請求的教程
Mock.js這個JavaScript庫最常見的用法便是被用來攔截AJAX請求,well,這里我們就來看一下Node.js服務器環(huán)境下使用Mock.js攔截AJAX請求的教程:2016-05-05Node.js使用NodeMailer發(fā)送郵件實例代碼
本篇文章主要介紹了Node.js使用NodeMailer發(fā)送郵件實例代碼,具有一定的參考價值,有興趣的可以了解一下。2017-03-03