怎么理解Node.js,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)是一家專業(yè)提供永春企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站建設(shè)、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為永春眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
一、Node簡(jiǎn)介
二、模塊機(jī)制
A.CommonJS規(guī)范
1.模塊引用:通過require()方法來引入外部模塊
2.模塊定義:提供exports對(duì)象用于導(dǎo)出當(dāng)前模塊的方法或者變量,并且是唯一導(dǎo)出的出口
3.模塊標(biāo)識(shí):就是傳遞給require()方法的參數(shù),必須是符合小駝峰命名的字符串,或者以.、..開頭的相對(duì)路徑
B.Node的模塊實(shí)現(xiàn)
1.不論是核心模塊還是文件模塊,require()方法對(duì)相同模塊的干凈加載都一律采用緩存優(yōu)先的方式,這是第一優(yōu)先級(jí)的
2.核心模塊》路徑形式的文件模塊》自定義模塊(自定義模塊的生成方式與JS原型鏈或作用域鏈的查找方式十分類似)
3.Node會(huì)按.js、.json、.node次序補(bǔ)足擴(kuò)展名,在嘗試的過程中,需要調(diào)用fs模塊同步阻塞式地判斷文件是否存在,這里會(huì)是一個(gè)引起性能問題的地方,如果是.node和.json文件,在傳遞給require()時(shí)帶上擴(kuò)展名
4.js模塊的編譯:包裝成(function(exports, require,module,__filename,__dirname)){….})的方式
C.核心模塊
1.JS核心模塊
Node采用了V8附帶的js2c.py工具,將所有內(nèi)置的JS代碼轉(zhuǎn)換成C++里的數(shù)組,生成node_natives.h頭文件
與文件模塊的區(qū)別在于:獲取源代碼的方式(核心模塊是從內(nèi)存中加載的)以及緩存執(zhí)行結(jié)果的位置
2.C/C++核心模塊
C++主內(nèi)完成核心,JS主外實(shí)現(xiàn)封裝的模式,Node的buffer、crypto、evals、fs、os等模塊都是部分通過C/C++編寫的
D.C/C++擴(kuò)展模塊
1.JS的一個(gè)典型弱點(diǎn)是位運(yùn)算,效率不高
E.模塊調(diào)用棧
1.C/C++內(nèi)建模塊屬于最底層模塊,如果不是非常了解要調(diào)用的C/C++內(nèi)建模塊,盡量避免使用process.binding()方法直接調(diào)用
2.JS核心模塊的職責(zé):作為C/C++內(nèi)建模塊的封裝層和橋接層;純粹的功能模塊;
3.文件模塊通常由第三方編寫,包括普通JS模塊和C/C++擴(kuò)展模塊
F.包與NPM
1.包描述文件:package.json,可以幫助Node解決依賴包安裝的問題
G.前后端共用模塊
1.AMD、CMD規(guī)范
三、異步I/O
A.為什么要異步I/O
1.用戶體驗(yàn)
2.資源分配
單線程同步編程模型會(huì)因阻塞I/O導(dǎo)致硬件資源得不到更優(yōu)的使用。多線程編程模型也因?yàn)榫幊讨械乃梨i、狀態(tài)同步等問題讓開發(fā)人員頭疼
Node在兩者之間給出了它的方案:利用單線程,遠(yuǎn)離多線程死鎖、狀態(tài)同步等問題;利用異步I/O,讓單線程遠(yuǎn)離阻塞,以更好地使用CPU
B.異步I/O實(shí)現(xiàn)現(xiàn)狀
1.阻塞/非阻塞:操作系統(tǒng)內(nèi)核對(duì)于I/O只有兩種方式,阻塞與非阻塞
在調(diào)用阻塞I/O時(shí),應(yīng)用程序需要等待I/O完成才返回結(jié)果
阻塞I/O的一個(gè)特點(diǎn)是調(diào)用之后一定要等到系統(tǒng)內(nèi)核層面完成所有操作后,調(diào)用才結(jié)束
非阻塞I/O的差別是調(diào)用之后立即返回,返回的并 不是業(yè)務(wù)層期望的數(shù)據(jù),而僅僅是當(dāng)前調(diào)用的狀態(tài)。為了獲取完整的數(shù)據(jù),需要重復(fù)調(diào)用I/O操作來確認(rèn)是否完成
這種重復(fù)調(diào)用判斷操作是否完成的技術(shù)叫做輪詢:read(原始、性能最低)、select(改進(jìn)read,只能同時(shí)檢查1024個(gè)文件描述符)、poll(采用鏈表方式,但文件描述符多的情況下性能還是十分低下)、epoll(目前Linux下效率最高的I/O事件通知機(jī)制,真實(shí)利用了事件通知、執(zhí)行回調(diào)的方式,而不是遍歷查詢)、kqueue(僅在FreeBSD系統(tǒng)下存在)
2.理想的非阻塞異步I/O:AIO(僅支持Linux,僅支持內(nèi)核I/O中的0_DIRECT方式讀取,無法利用系統(tǒng)緩存)
3.現(xiàn)實(shí)的異步I/O:模擬線程池、glibc的AIO、libeio、windows下的IOCP
C.Node的異步I/O
1.事件循環(huán):Node自身的執(zhí)行模型,在進(jìn)程啟動(dòng)時(shí),Node便會(huì)創(chuàng)建一個(gè)類似于while(true)的循環(huán),每執(zhí)行一次循環(huán)體的過程我們稱為Tick,每個(gè)Tick的過程就是查看是否有事件待處理,如果有,就取出事件及其相關(guān)的回調(diào)函數(shù)。如果存在關(guān)聯(lián)的回調(diào)函數(shù),就執(zhí)行它們
2.觀察者:每個(gè)事件循環(huán)中有一個(gè)或者多個(gè)觀察者,而判斷是否有事件要處理的過程就是向這些觀察者詢問是否有要處理的事件,瀏覽器采用了類似的機(jī)制,Node中有文件I/O觀察者、網(wǎng)絡(luò)I/O觀察者等
3.事件循環(huán)是一個(gè)典型的生產(chǎn)者/消費(fèi)者模型。異步I/O、網(wǎng)絡(luò)請(qǐng)求等則是事件的生產(chǎn)者,事件被傳遞到觀察者那里,事件循環(huán)則從觀察都那里取出事件并處理
4.請(qǐng)求對(duì)象:從JS發(fā)起調(diào)用到內(nèi)核執(zhí)行完I/O操作的過渡過程中,存在一種中間產(chǎn)物,叫做請(qǐng)求對(duì)象
5.事件循環(huán)、觀察者、請(qǐng)求對(duì)象、I/O線程池這四者共同構(gòu)成了Node異步I/O模型的基本要素
D.非I/O的異步API
1.定時(shí)器
setTimeout()和setInterval()與瀏覽器中的API是一致的,他們的實(shí)現(xiàn)原理與異步I/O類似,只是不需要I/O線程池的參與
利用定時(shí)器觀察者內(nèi)部的一個(gè)紅黑樹,定時(shí)器并不精確
2.process.nextTick()
相對(duì)輕量,每次調(diào)用時(shí),只會(huì)將回調(diào)函數(shù)放入隊(duì)列中,在下一輪Tick時(shí)取出執(zhí)行
定時(shí)器時(shí)間復(fù)雜度為O(lg(n)),nextTick()時(shí)間復(fù)雜度為O(1)
3.setImmediate()
與nextTick()類似,優(yōu)先級(jí)比nextTick()低,原因在于事件循環(huán)對(duì)觀察者的檢查是有午后順序的,nextTick()屬于idle觀察者,setImmediate()屬于check觀察者
idle觀察者->I/O觀察者->check觀察者
E.事件驅(qū)動(dòng)與高性能服務(wù)器
1.Node通過事件驅(qū)動(dòng) 的方式處理請(qǐng)求,無須為每一個(gè)請(qǐng)求創(chuàng)建額外的對(duì)應(yīng)線程,可以省掉創(chuàng)建線程和銷毀線程的開銷,同時(shí)操作系統(tǒng)在調(diào)度任務(wù)時(shí)因?yàn)榫€程少,上下文切換的代價(jià)很低
2.Nginx同樣采用事件驅(qū)動(dòng)的方式
四、異步編程
A.函數(shù)式編程
1.高階函數(shù):可以將函數(shù)作為參數(shù)或是返回值,并形成了一種后續(xù)傳遞風(fēng)格,將函數(shù)的業(yè)務(wù)重點(diǎn)從返回值轉(zhuǎn)移到了回調(diào)函數(shù)中
2.偏函數(shù):是指創(chuàng)建一個(gè)調(diào)用另外一個(gè)部分——參數(shù)或變量已經(jīng)預(yù)置的函數(shù)——的函數(shù)用法。通過指定部分參數(shù)來產(chǎn)生一個(gè)新的定制函數(shù)的形式就是偏函數(shù)
B.異步編程的優(yōu)勢(shì)與難點(diǎn)
1.優(yōu)勢(shì)
Node帶來的最大特性莫過于事件驅(qū)動(dòng)的非阻塞I/O模型,這是它的靈魂所在
Node是為了解決編程模型中阻塞I/O的性能問題的,采用了單線程模型,這導(dǎo)致Node更像一個(gè)處理I/O密集問題的能手
呆計(jì)算不影響異步I/O的調(diào)度,那就不構(gòu)成問題,建議對(duì)CPU的耗用不要超過10ms,或者將大量的計(jì)算分解為諸多的小量計(jì)算,通過setImmediate()進(jìn)行調(diào)度
2.難點(diǎn)
異步處理:Node在處理異常上形成了一種約定,將異步作為回調(diào)函數(shù)的第一個(gè)參數(shù)傳回,不要對(duì)用戶傳遞的回調(diào)函數(shù)進(jìn)行異常捕獲
函數(shù)嵌套過程:對(duì)于Node而言,事務(wù)中多個(gè)異步調(diào)用的場(chǎng)景比比皆是,這并沒有利用好異步I/O帶來的并行優(yōu)勢(shì)
阻塞代碼:沒有sleep()這樣的線程沉睡功能
多線程編程:由于前端瀏覽器存在對(duì)標(biāo)準(zhǔn)的滯后性,Web Workers沒有流行下來,Node借鑒了這個(gè)模式,child_process是其基礎(chǔ)API,cluster模塊是更深層次的應(yīng)用
異步轉(zhuǎn)同步:偶爾出現(xiàn)的同步需求將會(huì)因?yàn)闆]有同步API讓開發(fā)者突然無所適從
C.異步解決方案
1.事件發(fā)布/訂閱模式
事件監(jiān)聽器模式是一種廣泛用于異步編程的模式,是回調(diào)函數(shù)的事件化,又稱發(fā)布/訂閱模式
Node自身提供的events模塊是發(fā)布/訂閱模式的一個(gè)簡(jiǎn)單實(shí)現(xiàn),Node中部分模塊都繼承自它
事件發(fā)布/訂閱模式自身并無同步和異步調(diào)用的問題,但在Node中,emit()調(diào)用多半是伴隨事件循環(huán)而異步觸發(fā)的,所以廣泛應(yīng)用于異步編程
常常用來解耦業(yè)務(wù)邏輯,也是一種鉤子機(jī)制,利用鉤子導(dǎo)出內(nèi)部數(shù)據(jù)或狀態(tài)給外部的調(diào)用者
如果對(duì)一個(gè)事件添加了超過10個(gè)偵聽器,會(huì)得到警告;為了處理異常,EventEmitter對(duì)象對(duì)error事件進(jìn)行了特殊對(duì)待
利用once解決緩存雪崩問題
2.Promise/Deferred模式
Promises/A:只要具備then()有一份發(fā)即可
Promise通過封裝異步調(diào)用,實(shí)現(xiàn)了正向用例和反向用例的分享以及邏輯處理延遲
Promise模式比原始的事件偵聽和觸發(fā)略為優(yōu)美,它的缺陷則是需要為不同的場(chǎng)景封裝不同的API,沒有直接的原生事件那么靈活
Promise和秘決其實(shí)在于對(duì)隊(duì)列的操作
3.流程控制庫(kù)
尾觸發(fā)與Next:除了事件和Promise外,還有一類方法是需要手工調(diào)用才能持續(xù)執(zhí)行后續(xù)調(diào)用的,我就將此類方法叫做尾觸發(fā),常見的關(guān)鍵詞是next,應(yīng)用最多的是Connect的中間件
中間件機(jī)制使得在處理網(wǎng)絡(luò)請(qǐng)求時(shí),可以像面向切面 編程一樣進(jìn)行過濾、驗(yàn)證、日志等功能,而不與具體業(yè)務(wù)邏輯產(chǎn)生關(guān)聯(lián),以致產(chǎn)生耦合
中間件并不要求每個(gè)中間方法都是異步的,但是如果每個(gè)步驟都采用異步來完成,實(shí)際上只是串行化的處理,沒辦法通過并行的異步調(diào)用來提升業(yè)務(wù)的處理效率
async方法:series()實(shí)現(xiàn)一組任務(wù)的串行執(zhí)行;parallel()實(shí)現(xiàn)并行異步操作;waterfall()實(shí)現(xiàn)前一個(gè)結(jié)果是后一個(gè)的輸入;auto實(shí)現(xiàn)自動(dòng)依賴處理
Step庫(kù):默認(rèn)實(shí)現(xiàn)串行方式,this中包含parallel()方法實(shí)現(xiàn)并行,group()實(shí)現(xiàn)分組
Wind庫(kù)
D.異步并發(fā)控制
1.異步I/O與同步I/O的顯著差距:同步I/O因?yàn)槊總€(gè)I/O都是彼此阻塞的,在循環(huán)體中,總是一個(gè)接一個(gè)調(diào)用,不會(huì)出現(xiàn)耗用文件描述符太多的情況,同時(shí)性能也是低下的;對(duì)于異步I/O,雖然并發(fā)容易實(shí)現(xiàn),但是由于太容易實(shí)現(xiàn),依然需要控制。盡管是要壓榨底層系統(tǒng)的恒通,但還是需要給予一定的過載保護(hù),以防止過猶不及
2.bagpipe的解決方案
通過一個(gè)隊(duì)列來控制并發(fā)量
如果當(dāng)前活躍(指調(diào)用發(fā)起但未執(zhí)行回調(diào))的異步調(diào)用量小于限定值,從隊(duì)列中取出執(zhí)行
如果活躍調(diào)用達(dá)到限定值,調(diào)用暫存放在隊(duì)列中
每個(gè)異步調(diào)用結(jié)束時(shí),從隊(duì)列中取出新的異步調(diào)用執(zhí)行
3.async的解決方案:parallelLimit()方法
五、內(nèi)存控制
A.V8的垃圾回收機(jī)制與內(nèi)存限制
1.V8的內(nèi)存限制:64位系統(tǒng)下約為1.4GB,32位系統(tǒng)下約為0.7GB
2.V8中,所有的JS對(duì)象都是通過堆來進(jìn)行分配的,使用process.memoryUsage()來查看,heapTotal和heapUsed表示已申請(qǐng)到的內(nèi)存和當(dāng)前使用的量,rss是resident set size的縮寫,即進(jìn)程的常駐內(nèi)存部分
3.在V8中,主要將內(nèi)存分為新生代和老生代,新生代中的對(duì)象為存活時(shí)間較短的對(duì)象,老生代中的對(duì)象為存活時(shí)間較長(zhǎng)或常駐內(nèi)存的對(duì)象
4.在分代的基礎(chǔ)上,新生代中的對(duì)象主要通過Scavenge算法進(jìn)行垃圾回收。在Scavenge的具體實(shí)現(xiàn)中,主要采用了Cheney算法;在老生代中主要采用了Mark-Sweep和Mark-Compact相結(jié)合的方式進(jìn)行垃圾回收
5.為了降低全堆垃圾回收帶來的停頓時(shí)間,V8先從標(biāo)記階段入手,將原本要一口氣停頓完成的動(dòng)作改為增量標(biāo)記(incremental marking),也就是拆分為這么多小“步進(jìn)”,每做完一“步進(jìn)”就讓JS應(yīng)用邏輯執(zhí)行一小會(huì)兒,垃圾回收與應(yīng)用邏輯交替執(zhí)行直到標(biāo)記階段完成
B.高效使用內(nèi)存
1.作用域:如果變量是全局變量(不通過var或定義在global變量上),由于全局作用域需要直到進(jìn)程退出才能釋放,此時(shí)將導(dǎo)致引用 的對(duì)象常駐內(nèi)存(常駐在老生代中),如果需要釋放常駐內(nèi)存的對(duì)象,可以通過delete操作來刪除引用關(guān)系,在V8中通過delete刪除對(duì)象的屬性有可能干擾V8的優(yōu)化,所以通過賦值方式解除引用更好
2.閉包:一旦有變量引用中間函數(shù),這個(gè)中間函數(shù)將不會(huì)釋放,同時(shí)也支使原始的作用域不會(huì)得到釋放,作用域中產(chǎn)生的內(nèi)存占用也不會(huì)得到釋放。除非不同有引用,都會(huì)逐步釋放
C.內(nèi)存指標(biāo)
1.查看內(nèi)存使用情況
2.os模塊中的totalmem()和freemen()這兩個(gè)方法用于查看操作系統(tǒng)的內(nèi)存使用情況,分別返回系統(tǒng)的總內(nèi)存和閑置內(nèi)存
不是通過V8分配的內(nèi)存稱為堆外內(nèi)存,利用堆外內(nèi)存可以突破內(nèi)存限制 的問題
3.Node的內(nèi)存構(gòu)成主要由通過V8進(jìn)行分配的部分和Node自行分配的部分。受V8的垃圾回收限制的主要是V8的堆內(nèi)存
D.內(nèi)存泄漏
1.在Node中,緩存并非物美價(jià)廉,一旦一個(gè)對(duì)象被當(dāng)做緩存來使用,那就意味著它將會(huì)常駐在老生代中。緩存中的鍵越多,長(zhǎng)期存活的對(duì)象也就越多,這將導(dǎo)致垃圾回收在進(jìn)行掃描和整理時(shí),對(duì)這些對(duì)象做無用功
2.盡量使用外部緩存,如redis和Memcached
3.隊(duì)列問題,如數(shù)據(jù)庫(kù)寫入操作的堆積:
表層解決方案是換用消費(fèi)速度更高的技術(shù)
深層的解決方案應(yīng)該是監(jiān)控隊(duì)列的長(zhǎng)度,一旦堆積,應(yīng)當(dāng)通過監(jiān)控系統(tǒng)產(chǎn)生報(bào)警并通知相關(guān)人員
E.內(nèi)存泄漏排查
1.node-heapdump、node-memwatch等工具
F.大內(nèi)存應(yīng)用
1.Node提供了stream處理大文件,如果不需要進(jìn)行字符串層面的操作,則不需要V8來處理,可以嘗試進(jìn)行純粹的Buffer操作,這不會(huì)受到V8內(nèi)存堆的限制
六、理解Buffer
A.Buffer結(jié)構(gòu)
1.Buffer是一個(gè)典型的JS與C++結(jié)合的模塊,它將性能相關(guān)部分用C++實(shí)現(xiàn),將非性能相關(guān)的部分用JS實(shí)現(xiàn)
2.Buffer受Array類型的影響很大,可以訪問length屬性得到長(zhǎng)度,也可以通過下標(biāo)訪問元素;給元素的賦值如果小于0,就將該值逐次加到256,直到得到一個(gè)0到255之間的整數(shù)。如果得到的數(shù)值大于255,就逐次減256,如果是小數(shù),舍棄小數(shù)部分
3.Node在內(nèi)存的使用上應(yīng)用的是在C++層面申請(qǐng)內(nèi)存、在JS中分配內(nèi)存的策略。Node采用了slab分配機(jī)制
B.Buffer的轉(zhuǎn)換
1.字符串:
new Buffer(str,[encoding]);
buf.toString([encoding],[start],[end]);
Buffer.isEncoding(encoding),判斷編碼是否支持轉(zhuǎn)換,可以使用iconv和iconv-lite庫(kù)
C.Buffer的拼接
1.Buffer不等于字符串,只是會(huì)隱式轉(zhuǎn)換??!需要注意編碼問題
2.setEncoding()只能處理utf8、Base64和UCS-2/UTF-16LE這3種編碼
3.用一個(gè)數(shù)組來存儲(chǔ)接收到的所有Buffer片段并記錄下所有片段的總長(zhǎng)度,然后調(diào)用Buffer.concat()方法生成一個(gè)合并的Buffer對(duì)象。Buffer.concat()方法封裝了從小Buffer對(duì)象向大Buffer對(duì)象的復(fù)制過程。
D.Buffer與性能
1.通過預(yù)告轉(zhuǎn)換靜態(tài)內(nèi)容為Buffer對(duì)象,可以有效地減少CPU的重復(fù)使用,節(jié)省服務(wù)器資源。在Node構(gòu)建的Web應(yīng)用中,可以選擇將頁面中的動(dòng)態(tài)內(nèi)容和靜態(tài)內(nèi)容分離,靜態(tài)內(nèi)容部分可以通過預(yù)先轉(zhuǎn)換為Buffer的方式,使性能得到提升。由于文件自身是二進(jìn)制數(shù)據(jù),所以在不需要改變內(nèi)容的場(chǎng)景下,盡量只讀取Buffer,然后直接輸出,不做額外的轉(zhuǎn)換,避免損耗
2.highWaterMark的大小對(duì)性能的影響
highWaterMark設(shè)置對(duì)Buffer內(nèi)存的分配和使用有一定影響
highWaterMark設(shè)置過濾,可能導(dǎo)致系統(tǒng)調(diào)用次數(shù)過多
3.如果文件較?。ㄐ∮?kb),有可能造成slab未能完全使用;對(duì)于大文件而言,highWaterMark的大小決定會(huì)觸發(fā)系統(tǒng)調(diào)用和data事件的次數(shù);讀取一個(gè)相同的大文件時(shí),highWaterMark值的大小與速度的關(guān)系:該值越大,讀取速度越快
七、網(wǎng)絡(luò)編程
A.構(gòu)建TCP服務(wù)
1.服務(wù)器事件(net.createServer()):listening、connection、close、error
2.連接事件(net.connecct()):data、end、connect、drain、error、close、timeout
3.在Node中,由于TCP默認(rèn)啟用了Nagle算法
B.構(gòu)建UDP服務(wù)
1.UDP事件:message、listening、close、error
C.構(gòu)建HTTP服務(wù)
1.http服務(wù)端事件:connection、request、close、checkContinue、connect、upgrade、clientError
2.http客戶端事件:response、socket、connect、upgrade、continue
D.構(gòu)建WebSocket服務(wù)
E.網(wǎng)絡(luò)服務(wù)與安全
1.Node在網(wǎng)絡(luò)安全上提供了3個(gè)模塊,分別為crypto、tls和https
八、構(gòu)建Web應(yīng)用
1.Cookie優(yōu)化:減小Cookie的大??;為靜態(tài)組件使用不同的域名;減少DNS的查詢;
2.緩存規(guī)則:添加Expires或Cache-Control到報(bào)文頭中;配置ETags;讓Ajax可緩存;
3.清除緩存:url請(qǐng)求后帶版本號(hào),如http://xxx.com/?v=1.0.0
4.Content-Disposition,inline表示內(nèi)容只需即時(shí)查看,attachment表示數(shù)據(jù)可以存為附件
九、玩轉(zhuǎn)進(jìn)程
1.PHP的健壯性是由它給每個(gè)請(qǐng)求都建立獨(dú)立的上下文來實(shí)現(xiàn)的
2.Master-Worker模式,又稱主從模式。主進(jìn)程不負(fù)責(zé)具體的業(yè)務(wù)處理,而是負(fù)責(zé)調(diào)度或管理工作進(jìn)程,它是趨向于穩(wěn)定的。工作進(jìn)程負(fù)責(zé)具體的業(yè)務(wù)處理。
3.child_process模塊:
spawn():?jiǎn)?dòng)一個(gè)子進(jìn)程來執(zhí)行命令
exec():與spawn()不同的是有一個(gè)回調(diào)函數(shù)獲子進(jìn)程的狀況,可以指定timeout屬性設(shè)置超時(shí)時(shí)間,適合執(zhí)行現(xiàn)有命令
execFile():?jiǎn)?dòng)一個(gè)子進(jìn)程來執(zhí)行可執(zhí)行文件,適合執(zhí)行文件
Fork():創(chuàng)建Node的子進(jìn)程只需要指定要執(zhí)行的JS文件模塊即可
4.WebWorker允許創(chuàng)建工作線程并在后臺(tái)運(yùn)行,使得一些阻塞較為嚴(yán)重的計(jì)算不影響主線程上的UI渲染
5.IPC(Inter-Process Communication,進(jìn)程間通信),是為了讓不同的進(jìn)程能夠互相訪問資源并進(jìn)行協(xié)調(diào)工作,Node中使用的是管道(pipe)技術(shù)
6.句柄是一種可以用來標(biāo)識(shí)資源的引用,它的內(nèi)部包含了指向?qū)ο蟮奈募枋龇?/p>
7.Cluster事件:fork、online、listening、disconnect、exit、setup
十、測(cè)試
A.單元測(cè)試
1.編寫可測(cè)試代碼的原則:?jiǎn)我宦氊?zé)、接口抽象、層次分離
2.單元測(cè)試主要包含斷言、測(cè)試框架、測(cè)試用例、測(cè)試覆蓋率、mock、持續(xù)集成等,Node還會(huì)加入異步代碼測(cè)試和私有方法測(cè)試
3.斷言:是一種放在程序中的一階邏輯(如一個(gè)結(jié)果為真或是假的邏輯判斷式),目的是為了標(biāo)示程序開發(fā)者預(yù)期的結(jié)果——當(dāng)程序運(yùn)行到斷言的位置時(shí),對(duì)應(yīng)的斷言應(yīng)該為真。若斷言不為真,程序會(huì)中止運(yùn)行,并出現(xiàn)錯(cuò)誤信息
4.Node中的assert模塊包含:ok()、equal()、notEqual()、deepEqual()、notDeepEqual()、strictEqual()、notStrictEqual()、throws()、doesNotThrow()、ifError()
5.單元測(cè)試測(cè)試風(fēng)格:
TDD(測(cè)試驅(qū)動(dòng)開發(fā)):關(guān)注所有功能是否被正確實(shí)現(xiàn),表述方式偏向于功能說明書的風(fēng)格
BDD(行為驅(qū)動(dòng)開發(fā)):關(guān)注整體行為是否符合預(yù)期,表述方式更接近于自然語言的習(xí)慣
6.相關(guān)工具:mocha、blanket、jscover、muk、Makefile、travis-ci
B.性能測(cè)試
1.基準(zhǔn)測(cè)試:benchmark
2.壓力測(cè)試:ab、siege、http_load
十一、產(chǎn)品化
A.項(xiàng)目工程化
1.目錄結(jié)構(gòu) :只要遵循單一原則即可
2.構(gòu)建工具:Makefile、Grunt
3.編碼規(guī)范:JSLint、JSHint
4.代碼審查
B.部署流程
1.在實(shí)際的項(xiàng)目需求中,有兩點(diǎn)需要驗(yàn)證:一是功能的正確性,一是與數(shù)據(jù)相關(guān)的檢查
C.性能
1.拆分原則:做專一的事、讓擅長(zhǎng)的工具做擅長(zhǎng)的事情、將模型簡(jiǎn)化、將風(fēng)險(xiǎn)分離
2.動(dòng)靜分離、啟用緩存、多進(jìn)程架構(gòu)、讀寫分離
D.日志
1.訪問日志、異常日志、數(shù)據(jù)庫(kù)記錄、分割日志
E.監(jiān)控報(bào)警
1.監(jiān)控:日志監(jiān)控、響應(yīng)時(shí)間、進(jìn)程監(jiān)控、磁盤監(jiān)控、內(nèi)存監(jiān)控、CPU占用監(jiān)控、CPU load監(jiān)控、I/O負(fù)載、網(wǎng)絡(luò)監(jiān)控、應(yīng)用狀態(tài)監(jiān)控、DNS監(jiān)控
2.報(bào)警的實(shí)現(xiàn):郵件報(bào)警、短信或電話報(bào)警
F.穩(wěn)定性
1.多機(jī)器:需要考慮負(fù)載均衡、狀態(tài)共享、數(shù)據(jù)一致性、反向代理
2.多機(jī)房
3.容災(zāi)備份
G.異構(gòu)共存
1.通過協(xié)議與已有的系統(tǒng)進(jìn)行異構(gòu)共存
附錄B.調(diào)試Node
1.Debugger
通過debugger;設(shè)置斷點(diǎn)
使用node debug xxxx.js
步進(jìn)指令:cont或c、next或n、step或s、out或o、pause
2.Node Inspector
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。
新聞標(biāo)題:怎么理解Node.js
瀏覽路徑:http://jinyejixie.com/article34/ggijse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、微信公眾號(hào)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站改版、小程序開發(fā)、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)