深入淺出nodejs

1.node特點(diǎn)

高性能web服務(wù)器的要點(diǎn):事件驅(qū)動(dòng)、非阻塞I/O

  • 單線程
    單線程的優(yōu)點(diǎn)在于:
    • 不用在意狀態(tài)同步問(wèn)題
    • 沒(méi)有死鎖的存在
    • 沒(méi)有線程上下文交換帶來(lái)的性能上的開(kāi)銷
      單線程的缺點(diǎn):
    • 無(wú)法利用多CPU
    • 錯(cuò)誤會(huì)引起整個(gè)應(yīng)用退出羊赵,應(yīng)用的健壯性值得考驗(yàn)
    • 大量計(jì)算占用CPU導(dǎo)致無(wú)法繼續(xù)調(diào)用異步I/O
      使用子進(jìn)程來(lái)解決單線程中大量計(jì)算的問(wèn)題鹉动,通過(guò)將計(jì)算分發(fā)到各個(gè)子進(jìn)程众弓,可以將大量計(jì)算分解掉睦裳,然后通過(guò)進(jìn)程之間的事件消息來(lái)傳遞結(jié)果
  • 分布式應(yīng)用
    數(shù)據(jù)平臺(tái)在一個(gè)數(shù)據(jù)庫(kù)集群中去尋找需要的數(shù)據(jù)赫悄,阿里巴巴開(kāi)發(fā)的中間層應(yīng)用NodeFox
    披坏,將數(shù)據(jù)庫(kù)集群做了劃分和映射态坦,查詢調(diào)用依舊是針對(duì)單張表進(jìn)行SQL查詢,中間層分解查詢SQL棒拂,并行地去多臺(tái)數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)并合并

2.CommonJS規(guī)范

  • 所有代碼都運(yùn)行在模塊作用域伞梯,不會(huì)污染全局作用域

  • 模塊可以多次加載玫氢,但只會(huì)第一次加載時(shí)運(yùn)行一次,然后運(yùn)行結(jié)果會(huì)被緩存

  • 模塊的加載順序谜诫,按照其在代碼中出現(xiàn)的順序

  • 與AMD規(guī)范的區(qū)別
    require是同步的漾峡,在服務(wù)端所有的模塊都存放在本地,可以同步加載完成喻旷,但是在瀏覽器端生逸,所有的模塊都在服務(wù)器端,等待時(shí)間取決于網(wǎng)速且预,所以只能采用異步加載的策略槽袄,相當(dāng)于異步地去加載模塊,模塊內(nèi)的代碼就是加載完成后的回調(diào)函數(shù)

  • 相互引用問(wèn)題
    不會(huì)造成死循環(huán)锋谐,node會(huì)盡可能地去引用遍尺,如果引用不存在,就會(huì)給一個(gè)空的object涮拗,先加載a時(shí)乾戏,去加載b,在b中加載a時(shí)三热,應(yīng)為a還沒(méi)有導(dǎo)出屬性鼓择,因此b中應(yīng)用的a就是一個(gè)空對(duì)象,b的后續(xù)代碼中可能會(huì)報(bào)錯(cuò)

  • 模塊編譯
    每個(gè)文件模塊都是一個(gè)module對(duì)象康铭,有id惯退,exports赌髓,parent从藤,children屬性。

    • js模塊的編譯
      在編譯過(guò)程中锁蠕,node對(duì)獲取的js文件進(jìn)行了頭尾包裝:
(function(exports, require, module, __filename, __dirname){
  var math=require('math');
  exports.area=function(){
  };
});  

包裝后的代碼會(huì)返回一個(gè)function對(duì)象夷野,會(huì)將模塊對(duì)象的exports屬性,require方法荣倾,module模塊對(duì)象悯搔,以及文件路徑和文件目錄傳遞給這個(gè)function來(lái)執(zhí)行
不能直接重寫(xiě)

3.webpack特性

  • 具有requirejs和browserify的功能,即是一個(gè)模塊打包器舌仍,也是一個(gè)模塊加載器
  • 對(duì)CommonJS妒貌、AMD、ES6語(yǔ)法做了兼容
  • 對(duì)js铸豁,css灌曙,圖片資源都支持打包
  • 具有插件和加載器的機(jī)制
  • 將代碼切割成不同的chunk,實(shí)現(xiàn)按需加載节芥,降低初始化時(shí)間
  • 使用異步IO并具有多級(jí)緩存在刺,很快且在增量編譯上更快

4.異步編程

  • 偏函數(shù)
    通過(guò)指定部分參數(shù)來(lái)產(chǎn)生一個(gè)新的定制函數(shù)的形式就是偏函數(shù)
//通過(guò)初始構(gòu)造函數(shù)來(lái)判斷類型
function isType(type){
    return function(obj){
        return Object.prototype.toString.call(obj)==='[object '+type+']';
    }
}

var isString=isType('String');
console.log(isString('red'));
console.log(isString(new String('blue')));
//函數(shù)執(zhí)行多次后才會(huì)真正執(zhí)行的函數(shù)
function after(times,func){
    if(times<=0){
        return func();
    }

    return function(){
        if(--times<1){
            return func.apply(this,arguments);
        }
    }
}
var ready=after(3,function(){
    console.log('red');
});
  • 工作原理
    js線程相當(dāng)于一個(gè)分配任務(wù)和處理結(jié)果的大管家逆害,IO線程池里的各個(gè)IO線程都是小二,js線程無(wú)法承擔(dān)過(guò)多的細(xì)節(jié)性任務(wù)蚣驼,如果承擔(dān)過(guò)多魄幕,會(huì)影響到任務(wù)的調(diào)度,盡量使用非阻塞IO
    nodejs更適合處理IO密集問(wèn)題

  • 異常處理
    異步IO中實(shí)現(xiàn)主要包含提交請(qǐng)求和處理結(jié)果兩個(gè)階段颖杏,可能在異步IO的過(guò)程中會(huì)有異常
    nodejs有一個(gè)約定纯陨,將異常作為回調(diào)函數(shù)的第一個(gè)參數(shù)傳回,如果為空值留储,則表明異步調(diào)用沒(méi)有異常拋出队丝,因此寫(xiě)回調(diào)函數(shù)的時(shí)候,首先要判斷其第一個(gè)參數(shù)是否為空欲鹏,再執(zhí)行后面的操作

  • 函數(shù)嵌套過(guò)深

  • 阻塞代碼
    setTimeout和setInterval不能阻塞后續(xù)代碼的執(zhí)行机久,使用循環(huán)判斷時(shí)間,會(huì)持續(xù)占用CPU進(jìn)行判斷赔嚎,與真正的線程沉睡不同膘盖,完全破壞了事件循環(huán)的調(diào)度,最好使用setTimeout效果更好

  • 異步轉(zhuǎn)同步
    嵌套回調(diào)尤误,業(yè)務(wù)分散

  • 解決方案
    觀察者模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侠畔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子损晤,更是在濱河造成了極大的恐慌软棺,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尤勋,死亡現(xiàn)場(chǎng)離奇詭異喘落,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)最冰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門瘦棋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人暖哨,你說(shuō)我怎么就攤上這事赌朋。” “怎么了篇裁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵沛慢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我达布,道長(zhǎng)团甲,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任往枣,我火速辦了婚禮伐庭,結(jié)果婚禮上粉渠,老公的妹妹穿的比我還像新娘。我一直安慰自己圾另,他們只是感情好霸株,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著集乔,像睡著了一般去件。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扰路,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天尤溜,我揣著相機(jī)與錄音,去河邊找鬼汗唱。 笑死宫莱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哩罪。 我是一名探鬼主播授霸,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼际插!你這毒婦竟也來(lái)了碘耳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤框弛,失蹤者是張志新(化名)和其女友劉穎辛辨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瑟枫,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斗搞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了力奋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榜旦。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖景殷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澡屡,我是刑警寧澤猿挚,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站驶鹉,受9級(jí)特大地震影響绩蜻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜室埋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一办绝、第九天 我趴在偏房一處隱蔽的房頂上張望伊约。 院中可真熱鬧,春花似錦孕蝉、人聲如沸屡律。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)超埋。三九已至,卻和暖如春佳鳖,著一層夾襖步出監(jiān)牢的瞬間霍殴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工系吩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留来庭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓穿挨,卻偏偏與公主長(zhǎng)得像巾腕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子絮蒿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容