溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Node.js的4個基本概念詳解

發(fā)布時間:2021-09-02 11:31:53 來源:億速云 閱讀:102 作者:chen 欄目:web開發(fā)

本篇內(nèi)容主要講解“Node.js的4個基本概念詳解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Node.js的4個基本概念詳解”吧!

1.非阻塞或異步I/O

由于Node.js是一種服務(wù)器端框架,所以它的一個主要工作就是處理瀏覽器請求。在傳統(tǒng)的I/O系統(tǒng)中,當前請求只有當先前請求的響應(yīng)(HTML頁面)已到達才會發(fā)出。這就是為什么它被稱為阻塞I/O。服務(wù)器阻塞其他請求是為了處理當前的請求,而這會導致瀏覽器的等待。

Node.js不遵循I/O的這個原則。如果一個請求需要花費較長時間,那么Node.js會發(fā)送請求到事件循環(huán)(event loop)中,并繼續(xù)在調(diào)用棧(call stack)中處理下一個請求。一旦未決請求完成處理,它就會告訴Node.js,并將響應(yīng)渲染在瀏覽器上。

用一個虛擬的例子來理解這一點:

阻塞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.

在這個餐廳例子中,服務(wù)員給出菜單,等待訂單完成,然后再回到餐桌根據(jù)菜單上菜。在當前客戶點菜時,服務(wù)員就在旁邊等待,不接受其他客戶的菜單。

非阻塞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);
});

在這個例子中,服務(wù)員獲得菜單,并告知廚師,然后返回取另一份菜單。在完成第一個菜單進程中,他既按照順序給當前顧客上菜,也接受來自其他客戶的點單。服務(wù)員不會因為阻塞來自于其他客戶的點菜而浪費時間。

2.原型

原型是JavaScript的一個復雜概念。不過因為在Node.js中你要多次用到原型,所以每個JavaScript開發(fā)人員都必須了解這個概念。

在實現(xiàn)經(jīng)典繼承的語言中,例如Java,或C ++,對于以代碼重用為目的的語言,你首先必須寫一個類,然后從該類創(chuàng)建對象或擴展該類。但是,在JavaScript中不存在類的概念。首先在JavaScript中創(chuàng)建一個對象,然后從這個對象中增加自己的對象,或創(chuàng)建新的對象。這就是所謂的原型傳承和通過原型的實現(xiàn)。

每個JavaScript對象被鏈接到一個來自于它可以繼承屬性的原型對象。原型類似其他OO語言中的類,但不同的是,它們本身也是對象。每一個對象都鏈接到Object.prototype,而Object.prototype自帶JavaScript預定義。

如果你通過obj.propName或 obj['propName'] 查找屬性,而對象并不具有可通過 obj.hasOwnProperty(‘propName')被檢查的屬性,那么JavaScript的運行時會在其原型對象中查找屬性。如果原型對象也沒有這樣的屬性,那么依次檢查它的原型,直到找到匹配,或者到達Object.prototype。如果該屬性不存在原型鏈,那么它會導致一個未定義的值。

通過下面的示例代碼來理解這個概念:

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īng)該是它的原型的對象。這里,我們添加了一個方法到Object function。該方法創(chuàng)建了一個使用另一個對象作為其原型的新對象,而原型作為參數(shù)傳遞給它。

當我們改變新對象的時候,它的原型不受影響。但是,當我們進行改變原型對象的時候,這些變化在所有基于該原型的對象上可見。

原型是一個復雜的概念。我將在另一篇文章中詳細說明。

3.模塊

如果你曾經(jīng)接觸過Java中的包,那么Node.js中的模塊也沒有什么不同。如果沒有,那么也不用擔心。模塊是包含特定目的代碼的簡單的JavaScript文件。模塊模式用來使你的代碼易于導航和使用。要使用模塊屬性,你需要在JavaScript文件中需求它,很像在Java類中導入包。

node.js中有兩種類型的模塊。

核心模塊——這些模塊是用Node.js庫預編譯過的。核心模塊的目的是提供開發(fā)者經(jīng)常發(fā)生和重復的代碼段,這些代碼段如果不可用的話,會導致開發(fā)者陷入不得不一次又一次地寫相同代碼的處境。一些常見的核心模塊是HTTP,URL,EVENTS,F(xiàn)ILE SYSTEM,等等。

用戶定義模塊——用戶定義模塊是開發(fā)人員在應(yīng)用程序內(nèi)創(chuàng)建用于特定目的的模塊。當核心模塊不能滿足期望功能的時候就需要用戶定義模塊。

模塊通過require函數(shù)提取。如果它是一個核心模塊,那么參數(shù)僅僅是模塊的名稱。如果它是一個用戶自定義模塊,那么參數(shù)就是該模塊在文件系統(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.回調(diào)函數(shù)

在JavaScript中,函數(shù)被認為是第一類對象。這意味著你可以對這些函數(shù)做所有可對常規(guī)對象做的操作。你可以賦值函數(shù)給變量,作為參數(shù)傳遞函數(shù)給方法,作為對象屬性聲明函數(shù),甚至從函數(shù)返回函數(shù)。

回調(diào)函數(shù)是JavaScript中的匿名函數(shù),它可以作為參數(shù)傳遞給其他函數(shù),要么被執(zhí)行或返回自函數(shù)稍后執(zhí)行。這是回調(diào)函數(shù)——這個使用最廣的函數(shù)編程范式的基礎(chǔ)。

當我們將回調(diào)函數(shù)作為參數(shù)傳遞給另一個函數(shù)的時候,我們只能傳遞函數(shù)定義……換言之就是,我們不知道這個回調(diào)函數(shù)什么時候會執(zhí)行。這完全取決于調(diào)用函數(shù)的機制。它會在以后的某個時間點“回調(diào)”,因此而得名。這也是非阻塞或Node.js異步行為的唯一基礎(chǔ),如下例所示。

setTimeout(function() {
  console.log("world");
}, 2000)
console.log("hello");

這是回調(diào)函數(shù)最簡單的例子之一。我們將一個匿名函數(shù)作為一個參數(shù)傳遞,這個參數(shù)只需在控制臺上記錄一些輸出到setTimeout函數(shù)。它是唯一的函數(shù)定義,但是不知道何時執(zhí)行。這需要經(jīng)過2秒后,通過第二個參數(shù),調(diào)用setTimeout函數(shù)來決定。

首先,第二個日志語句記錄輸出到控制臺,然后,2秒鐘后,回調(diào)函數(shù)中的日志語句記錄輸出。

// output
hello
world

到此,相信大家對“Node.js的4個基本概念詳解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI