如果只需要知道一種編程語言就可以構(gòu)建一個(gè)全棧的應(yīng)用程序,是不是特別了不起?Ryan Dahl為了把這個(gè)想法成為現(xiàn)實(shí),創(chuàng)造了node.js。Node.js是建立在Chrome強(qiáng)勁的V8 JavaScript引擎上的服務(wù)器端框架。雖然最初是用C++編寫的,但是應(yīng)用程序通過JavaScript運(yùn)行。
成都創(chuàng)新互聯(lián)公司的客戶來自各行各業(yè),為了共同目標(biāo),我們?cè)诠ぷ魃厦芮信浜?,從?chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對(duì)我們的要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領(lǐng)域包括成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、電商網(wǎng)站開發(fā)、微信營(yíng)銷、系統(tǒng)平臺(tái)開發(fā)。這樣一來,問題就解決了。一種語言就可以統(tǒng)治一切。而且,在整個(gè)應(yīng)用程序中你只需要使用這一種語言。所以,我們需要深刻了解node.js。這就是本文的主題。
下面這四個(gè)基本概念是你想要掌握node.js所必需的。我會(huì)盡可能長(zhǎng)話短說向大家介紹它們。
由于Node.js是一種服務(wù)器端框架,所以它的一個(gè)主要工作就是處理瀏覽器請(qǐng)求。在傳統(tǒng)的I/O系統(tǒng)中,當(dāng)前請(qǐng)求只有當(dāng)先前請(qǐng)求的響應(yīng)(HTML頁面)已到達(dá)才會(huì)發(fā)出。這就是為什么它被稱為阻塞I/O。服務(wù)器阻塞其他請(qǐng)求是為了處理當(dāng)前的請(qǐng)求,而這會(huì)導(dǎo)致瀏覽器的等待。
Node.js不遵循I/O的這個(gè)原則。如果一個(gè)請(qǐng)求需要花費(fèi)較長(zhǎng)時(shí)間,那么Node.js會(huì)發(fā)送請(qǐng)求到事件循環(huán)(event loop)中,并繼續(xù)在調(diào)用棧(call stack)中處理下一個(gè)請(qǐng)求。一旦未決請(qǐng)求完成處理,它就會(huì)告訴Node.js,并將響應(yīng)渲染在瀏覽器上。
用一個(gè)虛擬的例子來理解這一點(diǎn):
阻塞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.
在這個(gè)餐廳例子中,服務(wù)員給出菜單,等待訂單完成,然后再回到餐桌根據(jù)菜單上菜。在當(dāng)前客戶點(diǎn)菜時(shí),服務(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);
});
在這個(gè)例子中,服務(wù)員獲得菜單,并告知廚師,然后返回取另一份菜單。在完成第一個(gè)菜單進(jìn)程中,他既按照順序給當(dāng)前顧客上菜,也接受來自其他客戶的點(diǎn)單。服務(wù)員不會(huì)因?yàn)樽枞麃碜杂谄渌蛻舻狞c(diǎn)菜而浪費(fèi)時(shí)間。
原型是JavaScript的一個(gè)復(fù)雜概念。不過因?yàn)樵贜ode.js中你要多次用到原型,所以每個(gè)JavaScript開發(fā)人員都必須了解這個(gè)概念。
在實(shí)現(xiàn)經(jīng)典繼承的語言中,例如Java,或C ++,對(duì)于以代碼重用為目的的語言,你首先必須寫一個(gè)類,然后從該類創(chuàng)建對(duì)象或擴(kuò)展該類。但是,在JavaScript中不存在類的概念。首先在JavaScript中創(chuàng)建一個(gè)對(duì)象,然后從這個(gè)對(duì)象中增加自己的對(duì)象,或創(chuàng)建新的對(duì)象。這就是所謂的原型傳承和通過原型的實(shí)現(xiàn)。
每個(gè)JavaScript對(duì)象被鏈接到一個(gè)來自于它可以繼承屬性的原型對(duì)象。原型類似其他OO語言中的類,但不同的是,它們本身也是對(duì)象。每一個(gè)對(duì)象都鏈接到Object.prototype,而Object.prototype自帶JavaScript預(yù)定義。
如果你通過obj.propName或 obj['propName'] 查找屬性,而對(duì)象并不具有可通過 obj.hasOwnProperty(‘propName’)被檢查的屬性,那么JavaScript的運(yùn)行時(shí)會(huì)在其原型對(duì)象中查找屬性。如果原型對(duì)象也沒有這樣的屬性,那么依次檢查它的原型,直到找到匹配,或者到達(dá)Object.prototype。如果該屬性不存在原型鏈,那么它會(huì)導(dǎo)致一個(gè)未定義的值。
本次給大家推薦一個(gè)免費(fèi)的學(xué)習(xí)圈,里面概括移動(dòng)應(yīng)用網(wǎng)站開發(fā),css,html,webpack,vue node angular以及面試資源等。**獲取資料
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。