最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

支付寶技術(shù)專家極力推薦!深入理解node.js萬字手冊(cè)!

2023-07-28 17:26 作者:印客學(xué)院官方  | 我要投稿

前言

作為后端JavaScript的運(yùn)行平臺(tái),Node保留了前端瀏覽器JavaScript中那些熟悉的接口,沒有改寫語言本身的任何特性,依舊基于作用域和原型鏈,區(qū)別在于它將前端中廣泛運(yùn)用的思想遷移到了服務(wù)器端。下面我們來看看Node相較其他語言的一些特點(diǎn)。

第一章node簡(jiǎn)介

有需要領(lǐng)取資料的可后臺(tái)私信【666】免費(fèi)領(lǐng)取

第二章模塊機(jī)制

經(jīng)歷了長(zhǎng)長(zhǎng)的后天努力過程,JavaScript不斷被類聚和抽象、以更好地組織業(yè)務(wù)邏輯。從另一個(gè)角度而言,它也道出了JavaScript先天就缺乏的一項(xiàng)功能:模塊。

在其他高級(jí)語言中,Java有類文件,Python有import機(jī)制,Ruby有require,PHP有include和require。而JavaScript通過<script>標(biāo)簽引入代碼的方式顯得雜亂無章,語言自身毫無組織和約束能力。人們不得不用命名空間等方式人為地約束代碼,以求達(dá)到安全和易用的目的。

3.異步I\O

與Node的事件驅(qū)動(dòng)、,異步IO設(shè)計(jì)理念比較相近的一個(gè)知名產(chǎn)品為Nginx.Nginx采用純C編寫,性能表現(xiàn)非常優(yōu)異。它們的區(qū)別在于,Nginx具備面向客戶端管理連接的強(qiáng)大能力,但是它的背后依然受限于各種同步方式的編程語言。但Nodc卻是全方位的,既可以作為服務(wù)器端去處理客戶端帶來的大量并發(fā)請(qǐng)求,也能作為客戶端向網(wǎng)絡(luò)中的各個(gè)應(yīng)用進(jìn)行并發(fā)請(qǐng)求。

web的含義是網(wǎng),Node的表現(xiàn)就如它的名字一樣,是網(wǎng)絡(luò)中靈活的一個(gè)節(jié)點(diǎn)。


4.異步編程

在開始異步編程之前,先得知曉JavaScript現(xiàn)今的回調(diào)函數(shù)和深層嵌套的來龍去脈。在JavaScript中,函數(shù)( function )作為一等公民,使用上非常自由,無論調(diào)用它,或者作為參數(shù),或者作為返回值均可。函數(shù)的靈活性是JavaScript比較吸引人的地方之一,它與古老的Lisp語言頗具淵源。JavaScript在誕生之前,Brendan Eich借鑒了Scheme語言( Scheme作為L(zhǎng)isp的派生),吸收了函數(shù)式編程的精華,將函數(shù)作為一等公民便是典型案例。

鑒于函數(shù)式編程在近年來重新火熱,而前端類圖書中較少述及這部分知識(shí),這里稍作補(bǔ)充,因?yàn)樗荍avaScript異步編程的基礎(chǔ)。

第5章內(nèi)存控制

也許讀者會(huì)好奇為何會(huì)有這樣一章存在于本書中,因?yàn)樵谶^去很長(zhǎng)一段時(shí)間內(nèi),JavaScript開發(fā)者很少在開發(fā)過程中遇到需要對(duì)內(nèi)存精確控制的場(chǎng)景,也缺乏控制的手段。說到內(nèi)存泄漏,大家首先想起的也只是早期版本的IE中JavaScript與DOM交互時(shí)發(fā)生的問題。如果頁面里的內(nèi)存占用過多,基本等不到進(jìn)行代碼回收,用戶已經(jīng)不耐煩地刷新了當(dāng)前頁面。

隨著Node的發(fā)展,JavaScript已經(jīng)實(shí)現(xiàn)了CommonJS的生態(tài)圈大一統(tǒng)的夢(mèng)想,JavaScript的應(yīng)用場(chǎng)景早已不再局限在瀏覽器中。本章將暫時(shí)拋開那些短時(shí)間執(zhí)行的場(chǎng)景,比如網(wǎng)頁應(yīng)用、命令行工具等,這類場(chǎng)景由于運(yùn)行時(shí)間短,且運(yùn)行在用戶的機(jī)器上,即使內(nèi)存使用過多或內(nèi)存泄漏,也只會(huì)影響到終端用戶。由于運(yùn)行時(shí)間短,隨著進(jìn)程的退出,內(nèi)存會(huì)釋放,幾乎沒有內(nèi)存管理的必要。但隨著Node在服務(wù)器端的廣泛應(yīng)用,其他語言里存在著的問題在JavaScript中也暴露出來了。

基于無阻塞、事件驅(qū)動(dòng)建立的Node服務(wù),具有內(nèi)存消耗低的優(yōu)點(diǎn),非常適合處理海量的網(wǎng)絡(luò)請(qǐng)求。在海量請(qǐng)求的前提下,開發(fā)者就需要考慮一些平常不會(huì)形成影響的問題。本書寫到這里算是正式邁進(jìn)服務(wù)器端編程的領(lǐng)域了,內(nèi)存控制正是在海量請(qǐng)求和長(zhǎng)時(shí)間運(yùn)行的前提下進(jìn)行探討的。在服務(wù)器端,資源向來就寸土寸金,要為海量用戶服務(wù),就得使一切資源都要高效循環(huán)利用。在第3章中,差不多已介紹完Node是如何利用CPU和IO這兩個(gè)服務(wù)器資源,而本章將介紹在Node中如何合理高效地使用內(nèi)存。

第6章理解Buffer

與第5章介紹的內(nèi)容一樣,本章講述的也是前端JavaScript開發(fā)者不曾涉及的內(nèi)容。文件和網(wǎng)絡(luò)IO對(duì)于前端開發(fā)者而言都是不曾有的應(yīng)用場(chǎng)景,因?yàn)榍岸酥恍枳鲆恍┖?jiǎn)單的字符串操作或DOM操作基本就能滿足業(yè)務(wù)需求,在ECMAScript規(guī)范中,也沒有對(duì)這些方面做任何的定義,只有CommonJS中有部分二進(jìn)制的定義。由于應(yīng)用場(chǎng)景不同,在Node中,應(yīng)用需要處理網(wǎng)絡(luò)協(xié)議、操作數(shù)據(jù)庫、處理圖片、接收上傳文件等,在網(wǎng)絡(luò)流和文件的操作中,還要處理大量二進(jìn)制數(shù)據(jù),JavaScript自有的字符串遠(yuǎn)遠(yuǎn)不能滿足這些需求,于是Buffer對(duì)象應(yīng)運(yùn)而生。

第7章網(wǎng)絡(luò)編程

Node是一個(gè)面向網(wǎng)絡(luò)而生的平臺(tái),它具有事件驅(qū)動(dòng)、無阻塞、單線程等特性,具備良好的可伸縮性,使得它十分輕量,適合在分布式網(wǎng)絡(luò)中扮演各種各樣的角色。同時(shí)Node提供的API十分貼合網(wǎng)絡(luò),適合用它基礎(chǔ)的API構(gòu)建靈活的網(wǎng)絡(luò)服務(wù)。從本章起,我將介紹Node在網(wǎng)絡(luò)服務(wù)器方面的具體能力。

利用Node可以十分方便地搭建網(wǎng)絡(luò)服務(wù)器。在Web領(lǐng)域,大多數(shù)的編程語言需要專門的Web服務(wù)器作為容器,如ASP、ASP.NET需要IIS作為服務(wù)器,PHP需要搭載Apache或Nginx環(huán)境等,JSP需要Tomcat服務(wù)器等。但對(duì)于Node而言,只需要幾行代碼即可構(gòu)建服務(wù)器,無需額外的容器。

Node提供了net、dgram、http、https這4個(gè)模塊,分別用于處理TCP 、UDP、HTTP、HTTPS,適用于服務(wù)器端和客戶端。

第8章構(gòu)建web應(yīng)用

為了勝任Web應(yīng)用的開發(fā)工作,各種語言、模式、框架層出不窮。單從框架而言,在后端數(shù)得出來大名的就有Structs、Codelgniter、Rails、Django、web.py等,在前端也有知名的BackBone,Knockout. js 、AngularJS、Meteor等。在Node中,有Connect中間件,也有Express這樣的MVC框架。值得注意的是Meteor框架,它在后端是Node,在前端是JavaScript,它是一個(gè)融合了前后端JavaScript的框架。

由于前后端采用的語言都是JavaScript,在跨越HTTP進(jìn)行溝通時(shí),會(huì)有一些額外的好處。無須切換語言環(huán)境,部分知識(shí)不會(huì)因?yàn)檎Z言環(huán)境的切換而丟失,上下文一致性較好。數(shù)據(jù)(因?yàn)镴SON)可以很好地實(shí)現(xiàn)跨前后端直接使用。

一些業(yè)務(wù)(如模板渲染)可以很自由地輕量地選擇是在前端還是在后端進(jìn)行,因?yàn)榫幊陶Z言相同,所以切換代價(jià)小。

第9章玩轉(zhuǎn)進(jìn)程

Node在選型時(shí)決定在V8引擎之上構(gòu)建,也就意味著它的模型與瀏覽器類似。我們的JavaScript將會(huì)運(yùn)行在單個(gè)進(jìn)程的單個(gè)線程上。它帶來的好處是:程序狀態(tài)是單一的,在沒有多線程的情況下沒有鎖、線程同步問題,操作系統(tǒng)在調(diào)度時(shí)也因?yàn)檩^少上下文的切換,可以很好地提高CPU的使用率。

但是單進(jìn)程單線程并非完美的結(jié)構(gòu),如今CPU基本均是多核的,真正的服務(wù)器(非VPS)往往還有多個(gè)CPU。一個(gè)Node進(jìn)程只能利用一個(gè)核,這將拋出Node實(shí)際應(yīng)用的第一個(gè)問題:如何充分利用多核CPU服務(wù)器?

另外,由于Node執(zhí)行在單線程上,一旦單線程上拋出的異常沒有被捕獲,將會(huì)引起整個(gè)進(jìn)程的崩潰。這給Node的實(shí)際應(yīng)用拋出了第二個(gè)問題:如何保證進(jìn)程的健壯性和穩(wěn)定性?

在這兩個(gè)問題中,前者只是利用率不足的問題,后者對(duì)于實(shí)際產(chǎn)品化帶來一定的顧慮。本章關(guān)于進(jìn)程的介紹和討論將會(huì)解決掉這兩個(gè)問題。

從嚴(yán)格的意義上而言,Node并非真正的單線程架構(gòu),在第3章中我們有敘述過Node自身還有一定的I/O線程存在,這些IO線程由底層libuv處理,這部分線程對(duì)于JavaScript開發(fā)者而言是透明的,只在C++擴(kuò)展開發(fā)時(shí)才會(huì)關(guān)注到。JavaScript代碼永遠(yuǎn)運(yùn)行在V8上,是單線程的。本章將圍繞JavaScript部分展開,所以屏蔽底層細(xì)節(jié)的討論。

第10章測(cè)試

在使用Node進(jìn)行實(shí)際的項(xiàng)目開發(fā)之前,我內(nèi)心也曾十分忐忑。盡管JavaScript歷史悠久,但相較成熟的后端語言而言,Node尚且算是新晉同學(xué)。甚至對(duì)于前端,因?yàn)楦鞣N各樣的原因,JavaScript的測(cè)試都十分少。Node編寫的在線產(chǎn)品,在成千上萬用戶面前能否具備良好的質(zhì)量保證,我是心存疑問的。

從最早寫出的代碼讓自己睡不著覺,無法精確定位bug到底位于一堆程序里的哪個(gè)位置,到后來很踏實(shí)地面對(duì)自己產(chǎn)出的代碼,對(duì)自己代碼的了解如手心紋路那么清晰明了。從面對(duì)問題時(shí)的被動(dòng)到主動(dòng),測(cè)試在這個(gè)演變過程中起到了至關(guān)重要的作用。

測(cè)試的意義在于,在用戶消費(fèi)產(chǎn)出的代碼之前,開發(fā)者首先消費(fèi)它,給予其重要的質(zhì)量保證。這里值得提醒的是,JavaScript開發(fā)者需要轉(zhuǎn)變觀念,正視自己的代碼,對(duì)自己產(chǎn)出的代碼負(fù)責(zé)。為自己的代碼寫測(cè)試用例則是一種行之有效的方法,它能夠讓開發(fā)者明確掌握到代碼的行為和性能等。

測(cè)試包含單元測(cè)試、性能測(cè)試、安全測(cè)試和功能測(cè)試等幾個(gè)方面,本章將從Node實(shí)踐的角度來介紹單元測(cè)試和性能測(cè)試。

第11章產(chǎn)品化

Node相對(duì)于大多數(shù)Web技術(shù)還算是年輕的,這意味著沒有現(xiàn)成和成熟的框架或應(yīng)用系統(tǒng)可以直接上手使用,商業(yè)化還處于萌芽狀態(tài)。反過來,這也能讓開發(fā)者接觸到較多的底層細(xì)節(jié),如HTTP協(xié)議、進(jìn)程模型、服務(wù)模型等,這些底層原理與其他現(xiàn)有技術(shù)并無實(shí)質(zhì)性的差別。對(duì)于Node開發(fā)者而言,很多其他語言走過的路需要開發(fā)者帶著Node特性重新去踐行一遍。這并不是壞事,Node更接近底層使得開發(fā)者對(duì)于具體細(xì)節(jié)的可控度非常高。

目前,在國內(nèi)大多數(shù)人都將Node以實(shí)驗(yàn)性質(zhì)的方式來使用,國外已經(jīng)有知名的項(xiàng)目將Node應(yīng)用在實(shí)際的生產(chǎn)環(huán)境中,如eBay的數(shù)據(jù)中間層、Linkedin移動(dòng)應(yīng)用的服務(wù)器端等。本章將詳細(xì)介紹將Node產(chǎn)品化過程中需要注重的一些細(xì)節(jié),這些細(xì)節(jié)其實(shí)是具備普適性的,并非Node所獨(dú)有。鑒于部分Node開發(fā)者可能從前端轉(zhuǎn)來,為了完善Node生態(tài)的介紹,所以添加了此章。盡管因?yàn)槭煜avaScript,可以較好地上手Node,但是事實(shí)上從演示原型到產(chǎn)品還有較長(zhǎng)的縫隙需要去填補(bǔ)。

在實(shí)際的產(chǎn)品中,需要很多非編碼相關(guān)的工作以保證項(xiàng)目的進(jìn)展和產(chǎn)品的正常運(yùn)行等,這些細(xì)節(jié)包括工程化、架構(gòu)、容災(zāi)備份、部署和運(yùn)維等。只有這些任務(wù)在持續(xù)性進(jìn)行,才表明項(xiàng)目是活著的。

有需要領(lǐng)取資料的可后臺(tái)私信【666】免費(fèi)領(lǐng)取


支付寶技術(shù)專家極力推薦!深入理解node.js萬字手冊(cè)!的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
内江市| 红安县| 九台市| 和林格尔县| 即墨市| 瓦房店市| 泾阳县| 吉安县| 兰溪市| 广水市| 安国市| 桃园县| 赣榆县| 工布江达县| 大石桥市| 张掖市| 定结县| 广平县| 房产| 琼结县| 扎兰屯市| 淮北市| 黔江区| 云阳县| 英超| 上杭县| 象州县| 贞丰县| 吴旗县| 保定市| 南投县| 肥东县| 宁陵县| 华蓥市| 旬邑县| 阿巴嘎旗| 柳江县| 都江堰市| 公安县| 蕲春县| 揭阳市|