Node.js開發(fā)簡(jiǎn)單,性能極好,一經(jīng)發(fā)布便成了明星級(jí)項(xiàng)目。隨著大前端領(lǐng)域的蓬勃發(fā)展,跨平臺(tái)開發(fā)、API構(gòu)建、Web應(yīng)用開發(fā)等場(chǎng)景愈加常見,Node.js也成為大前端開發(fā)的必備神器。本書以Node.js為主,講解了Node.js的基礎(chǔ)知識(shí)、開發(fā)調(diào)試方法、源碼原理和應(yīng)用場(chǎng)景,旨在向讀者展示如何通過*的Node.js和npm編寫出更具前端特色、更具工程化優(yōu)勢(shì)的代碼。本書還講解了Node.js中相當(dāng)核心且復(fù)雜的異步流程控制,展望了未來異步流程的發(fā)展方向,非常適合大前端領(lǐng)域及后端領(lǐng)域的測(cè)試、運(yùn)維及軟件開發(fā)從業(yè)者閱讀、學(xué)習(xí)。
狼叔千日奮筆,狼書一嘯橫空:Node.js首席布道師 一手創(chuàng)辦垂直公號(hào)Node全棧 CNode技術(shù)社區(qū)活躍貢獻(xiàn)者,艷壓群芳,名動(dòng)八方。
狼書三卷一出,Node再無遺冊(cè):《狼書(卷1):更了不起的Node.js》 《狼書(卷2):Node.js Web應(yīng)用開發(fā)》 《狼書(卷3):Node.js高級(jí)技術(shù)》,百萬宏篇,精華盡現(xiàn)。
Node縱橫全網(wǎng),狼書更有良方:橫跨前后端的深厚功底 阿里|優(yōu)酷|去哪兒網(wǎng)高端項(xiàng)目練級(jí) Web|移動(dòng)|服務(wù)端架構(gòu)擔(dān)當(dāng),遠(yuǎn)非尋常,超出想象。
狼書新老咸宜,Node進(jìn)行到底:面向新人的超完整知識(shí)體系 面向進(jìn)階人群的超實(shí)用高級(jí)技巧 面向?qū)<胰巳旱某铄湓砥饰觯椴记伤,直指精髓?br />
序
本書從2015年10月開始寫作。
在那之前,我還在天津創(chuàng)業(yè),頂著CTO的頭銜干著各種最基礎(chǔ)的編碼工作。由于公司在天津的位置很偏僻,所以公司招人成了一個(gè)大問題。更要命的是,創(chuàng)始人沒有工資可拿,現(xiàn)在想想只能說是情懷在支撐我吧。
公司招人不便,那就只能想辦法把人才從北上廣拉到天津,于是就動(dòng)了擴(kuò)大技術(shù)影響力的心思我開始在CNode社區(qū)上發(fā)帖,后面慢慢嘗試做Node全棧公眾號(hào),效果還不錯(cuò)。我還記得CNode社區(qū)管理員、知名Node.js開發(fā)者alsotang曾評(píng)論過我的一篇文章,說我是Node.js布道者。當(dāng)時(shí)我臭美了很久,之后便自然而然地走上了布道之路。
2015年,我結(jié)婚了,財(cái)權(quán)上交,發(fā)覺生活窘迫,又不好意思向老婆要錢,于是便開始在網(wǎng)上教授VSCode,之后我又和極客邦旗下的StuQ合作課程,獲得收入的同時(shí)又可以進(jìn)一步擴(kuò)大技術(shù)影響力。而技術(shù)影響力擴(kuò)大的體現(xiàn)就是,我被出版社的編輯發(fā)現(xiàn)了。由于早有布道的心思,自然希望能夠出一本書,于是便開始了寫書之旅。
可是寫書從來都不是一件容易的事。閱歷淺,寫不來;無恒心,寫不來。從2015年10月到2019年2月,歷時(shí)三年多,很多朋友催書,以至于我經(jīng)常在演講中自黑:我的書從Node.js v4寫到Node.js v8,然而還沒有寫完。與出版社約稿時(shí),Node.js才剛剛發(fā)布4.0版本,而2019年年初,Node.js已經(jīng)發(fā)布了11.10版本。本書幾經(jīng)修改,最終確定以Node.js的8.0版本為核心版本。雖然后面Node.js更新的版本里又有新功能,但整體來看Node.js的API設(shè)計(jì)得非常好,幾乎都是向后兼容的,所以即使是11.10版本,和8.0版本的差別也不大,而且在本書的編輯過程中我又進(jìn)行了一定的更新,因此不會(huì)影響讀者閱讀和學(xué)習(xí)。
在這三年多的時(shí)間里,Node.js穩(wěn)定高效地發(fā)布了多個(gè)版本,國(guó)內(nèi)外的Node.js使用率也漸漸達(dá)到了一個(gè)前所未有的高度。感謝前端領(lǐng)域的爆發(fā)式增長(zhǎng),這極大擴(kuò)展了Node.js的應(yīng)用場(chǎng)景,而且新語法、新特性的使用也開始成為大前端開發(fā)團(tuán)隊(duì)中的標(biāo)配。
人生之美好就是在苦難之后能夠獲得成果。寫書的過程是痛苦的,但也讓我對(duì)于成全別人,才能成就自己這句話有了更深刻的認(rèn)識(shí)。最開始寫書是為了布道,希望更多人能從中受益,沒想到最先受益的是自己,通過長(zhǎng)時(shí)間的積累,我完善了自己的知識(shí)體系,受益匪淺。通過與CNode社區(qū)、出版社的編輯以及Node.js愛好者們之間的交流,我有了更好的學(xué)習(xí)機(jī)會(huì)。通過寫書、演講、組織社區(qū)活動(dòng),我有了更豐富的人生經(jīng)歷。
以前見到圖書的前言中總有致謝話語,還以為只是出版套路。然而今時(shí)今日,歷經(jīng)三年多的寫作,我確確實(shí)實(shí)要感謝很多人。
感謝我的家人,寫書會(huì)犧牲很多陪伴家人的時(shí)間,感謝他們的理解和支持。最難過的是周一到周五,只能看老婆通過微信發(fā)來的寶寶的視頻,一遍一遍地看,一遍一遍地想哭。
感謝所有推薦本書以及為本書進(jìn)行技術(shù)審校的專家們,若沒有他們的幫助,這本書恐怕無法以最佳狀態(tài)與各位讀者見面。他們的寶貴建議使得本書的內(nèi)容不至于空洞,也讓我受益良多。
感謝博文視點(diǎn)的張春雨編輯和孫奇俏編輯,他們一次次地叮囑我、鼓勵(lì)我,面對(duì)面指導(dǎo)我如何規(guī)范寫作,這種耐心和包容是極其難得的。這本書在審校初期,有6位出版社的編輯都參與其中,那時(shí)我是崩潰的感覺自己數(shù)學(xué)不好,常常上面說3項(xiàng)下面列4項(xiàng);語文也不好,連基本的語句都表達(dá)不清,很符合那句玩笑話:你的語文是體育老師教的吧。我能夠想象編輯們?cè)谛薷臅逯畷r(shí)是多么的痛苦,因此再次感謝各位編輯,感謝他們的辛苦付出,因?yàn)橛兴麄儯緯拍軌蝽樌霭妗?/p>
回想這三年多的寫作過程,其實(shí)幾次都想放棄,想將Node.js系統(tǒng)地講明白,真的不是一件容易的事?墒窃挾颊f出去了,不想讓一直以來支持我的讀者失望,更不能自己打臉,所以,這本書最終還是跟大家見面了。感謝各位粉絲在各個(gè)技術(shù)群里花式催書,感謝他們對(duì)我的鞭策。
再次感謝所有的小伙伴們。
所有未見面的讀者,但愿狼叔的碎碎念,能夠帶你們打開Node.js世界的大門,領(lǐng)略大前端領(lǐng)域璀璨的星光。
狼叔
2019年4月于北京
前言
Node.js誕生于2009年,是由Joyent公司的員工Ryan Dahl開發(fā)完成的,之后Joyent公司一直扮演著Node.js孵化者的角色。由于諸多原因,Ryan于2012年離開了Node.js社區(qū),隨后在2015年,由于Node.js的貢獻(xiàn)者們?cè)贓S6新特性集成問題上產(chǎn)生意見分歧,因此分裂出io.js。
io.js的分裂最終促成了2015年Node.js基金會(huì)的成立,同年Node.js v4.0順利發(fā)布。Node.js基金會(huì)的創(chuàng)始成員包括Google、Joyent、IBM、Paypal、Microsoft、Fidelity和Linux基金會(huì),創(chuàng)始成員將共同掌管過去由Joyent一家企業(yè)掌控的Node.js開源項(xiàng)目。此后,Node.js基金會(huì)發(fā)展得非常好,穩(wěn)定地發(fā)布了5.x、6.x、7.x、8.x、9.x、10.x、11.x等多個(gè)版本,截止到本書完稿之時(shí),最新版本已經(jīng)是v11.14,最新的長(zhǎng)期支持(LTS)版本是v10.15。
Node.js不是一門語言也不是一個(gè)框架,它是基于Chrome V8引擎的JavaScript運(yùn)行時(shí)環(huán)境,同時(shí)結(jié)合libuv擴(kuò)展了JavaScript功能,使得JavaScript能夠支持瀏覽器DOM操作,同時(shí)具有只有后端語言才有的I/O、文件讀寫于操作數(shù)據(jù)庫(kù)等能力,是目前使用最簡(jiǎn)單的全棧式環(huán)境。
本書內(nèi)容
從整體上來說,本書以Node.js為主,首先介紹了Node.js的發(fā)展歷史,然后簡(jiǎn)要概括了Node.js的特點(diǎn)和使用場(chǎng)景,之后講解了Node.js實(shí)現(xiàn)過程中的新增內(nèi)容(如語法、模塊、單進(jìn)程等)的基本用法。讀者入門Node.js之后,可以繼續(xù)從本書中了解Node.js的執(zhí)行原理,深入解讀源碼。最后,本書還講解了Node.js中非常核心且復(fù)雜的異步流程控制,對(duì)未來異步流程的發(fā)展方向進(jìn)行了展望。
本書共分7章,每章的內(nèi)容簡(jiǎn)介如下。
第1章 Node.js初識(shí)
本章介紹了Node.js的一些基礎(chǔ)知識(shí),包括什么是Node.js、Node.js和JavaScript的關(guān)系、Node.js的特點(diǎn)和應(yīng)用場(chǎng)景等。
第2章 Node.js安裝與入門
本章介紹了Node.js安裝與使用的基本方法,包括3m(即nvm、nrm、npm)安裝法、Node.js基礎(chǔ)示例,以及編輯器和調(diào)試等內(nèi)容。
第3章 更了不起的Node.js
本章更加詳細(xì)地介紹了Node.js的各類應(yīng)用場(chǎng)景,對(duì)Node.js的核心作用進(jìn)行了概括與總結(jié),還對(duì)如何成為全棧工程師提供了寶貴建議。
第4章 更好的Node.js
本章介紹了Node.js的各種寫法,包括單線程與集群,以及各種優(yōu)秀實(shí)踐,包括ES語法、多模塊管理器Lerna、npm的替代品Yarn等。
第5章 Node.js是如何執(zhí)行的
本章介紹了Node.js的源碼構(gòu)建和調(diào)試過程,闡述了Node.js是如何執(zhí)行的,還介紹了API的調(diào)用過程,以及事件循環(huán)機(jī)制。
第6章 模塊與核心
本章介紹了Node.js中的CommonJS規(guī)范、SDK模塊與核心技術(shù),還對(duì)未來的ES6模塊功能進(jìn)行了預(yù)測(cè)與展望。
第7章 異步寫法與流程控制
本章介紹了異步流程控制的演進(jìn)過程、Node.js的核心異步寫法,以及更好的異步流程控制機(jī)制,如Thunk、Promise、async函數(shù)等。
本書中的各章在內(nèi)容上基本是相互獨(dú)立的,因此各位讀者可以挑選自己感興趣的章節(jié)閱讀。這本書是狼書系列的第1卷,還有第2卷和第3卷稍后會(huì)和各位讀者見面,內(nèi)容涉及Web應(yīng)用和性能優(yōu)化等,搭配閱讀,效果更好。
目標(biāo)讀者
本書的目標(biāo)讀者有以下三類。
? 正在學(xué)習(xí)JavaScript開發(fā),對(duì)JavaScript語言有基本的了解和熟悉度,且希望能夠了解JavaScript發(fā)展情況的人。
? 正從事JavaScript開發(fā)相關(guān)工作,熟悉JavaScript的基本開發(fā)要領(lǐng),在日常工作中經(jīng)常接觸Node.js,想要深入了解Web應(yīng)用、BFF、API代理等內(nèi)容,以進(jìn)一步提升自我的Web工程師(此處不區(qū)分前端與后端)。
? 具有極客精神,想要深入研究JavaScript語言及Node.js的全棧工程師。
同時(shí),本書也適合正使用其他編程語言(如Go、PHP、Python、Ruby、Java等)進(jìn)行Web開發(fā)的工程師閱讀、學(xué)習(xí)。
閱讀準(zhǔn)備
要想運(yùn)行本書中的示例,需要安裝以下系統(tǒng)及軟件。
操作系統(tǒng):推薦Linux,以及macOS X 10.9或以上版本,使用Windows操作系統(tǒng)可能會(huì)報(bào)錯(cuò)。
瀏覽器:Google Chrome、Safari、Firefox、Internet Explorer 11、Windows Edge。
運(yùn)行環(huán)境:以Node.js 8.6為主。
狼叔(網(wǎng)名i5ting),Node.js 技術(shù)布道者,Node全棧公眾號(hào)作者,全棧技術(shù)實(shí)踐者。曾就職于多家知名IT企業(yè),從事前端開發(fā)、后端開發(fā)、數(shù)據(jù)分析等工作,目前負(fù)責(zé)公司內(nèi)的Node.js開發(fā)和基礎(chǔ)框架開發(fā)工作。
第1章 Node.js初識(shí) 1
1.1 引子 1
1.2 JavaScript 7
1.3 什么是Node.js 9
1.3.1 Node.js概述 9
1.3.2 Node.js的特點(diǎn) 12
1.3.3 Node.js的應(yīng)用場(chǎng)景 16
1.4 本章小結(jié) 18
第2章 Node.js安裝與入門 19
2.1 安裝Node.js 19
2.1.1 3m安裝法 19
2.1.2 nvm 20
2.1.3 npm 26
2.1.4 nrm 32
2.1.5 從源碼進(jìn)行編譯 35
2.1.6 狀態(tài)理論 35
2.2 Hello Node.js! 36
2.2.1 Hello World 36
2.2.2 Hello CommonJS 37
2.2.3 Hello HTTP 38
2.3 編輯器與調(diào)試 41
2.3.1 IDE/編輯器 41
2.3.2 VSCode 42
2.3.3 調(diào)試 45
2.4 本章小結(jié) 52
第3章 更了不起的Node.js 53
3.1 架構(gòu)升級(jí) 53
3.1.1 從LAMP到MEAN 54
3.1.2 前后端分離 55
3.1.3 頁面即服務(wù) 58
3.1.4 場(chǎng)景決定選型 59
3.2 貫穿開發(fā)全過程 60
3.2.1 靜態(tài)API 60
3.2.2 現(xiàn)代Web開發(fā) 63
3.2.3 后端開發(fā) 68
3.3 更多樂趣 78
3.3.1 更多應(yīng)用場(chǎng)景 78
3.3.2 C/C 擴(kuò)展 79
3.3.3 團(tuán)隊(duì)優(yōu)化 80
3.3.4 全棧之路 81
3.4 本章小結(jié) 85
第4章 更好的Node.js 86
4.1 選擇 86
4.1.1 語法可難可易 86
4.1.2 開發(fā)大型軟件 90
4.1.3 特定場(chǎng)景下的快速開發(fā) 91
4.2 單線程會(huì)死嗎 92
4.2.1 uncaughtException 93
4.2.2 異常捕獲 94
4.2.3 forever 95
4.2.4 小集群:?jiǎn)闻_(tái)服務(wù)器上多個(gè)實(shí)例 95
4.2.5 大集群:多臺(tái)機(jī)器 96
4.3 為Node.js正名 98
4.3.1 版本帝? 98
4.3.2 已無性能優(yōu)勢(shì)? 99
4.3.3 異步和回調(diào)地獄? 100
4.3.5 技術(shù)棧演進(jìn) 101
4.4 更好的實(shí)踐 102
4.4.1 ES.next 102
4.4.2 類型系統(tǒng) 110
4.4.3 更好的npm替代品Yarn 111
4.4.4 多模塊管理器Lerna 113
4.5 本章小結(jié) 114
第5章 Node.js是如何執(zhí)行的 115
5.1 準(zhǔn)備 115
5.1.1 編輯器 116
5.1.2 編譯 117
5.1.3 調(diào)試 118
5.2 編譯步驟 120
5.2.1 configure 120
5.2.2 make 130
5.2.3 make install 132
5.3 從入口開始 135
5.3.1 核心流程 137
5.3.2 構(gòu)造process對(duì)象 139
5.3.3 LoadEnvironment 147
5.3.4 bootstrap_node.js 148
5.3.5 EventLoop啟動(dòng)方法 160
5.4 API調(diào)用過程 162
5.4.1 相關(guān)的引用 163
5.4.2 FSReqWrap 163
5.4.3 核心open方法 164
5.4.4 src/node_file.cc 164
5.5 事件循環(huán)機(jī)制 167
5.5.1 概覽 167
5.5.2 生命周期 169
5.5.3 microtask和macrotask 170
5.5.4 process.nextTick(callback) 173
5.6 本章小結(jié) 175
第6章 模塊與核心 176
6.1 CommonJS規(guī)范 176
6.1.1 簡(jiǎn)介 176
6.1.2 核心技術(shù) 181
6.2 Node.js 模塊 189
6.2.1 從源碼分析實(shí)現(xiàn)原理 189
6.2.2 從Node.js代碼執(zhí)行開始 191
6.2.3 深入理解模塊 195
6.2.4 全局對(duì)象 205
6.2.5 Node.js模塊詳解 215
6.3 未來展望:ES模塊 220
6.3.1 ES模塊入門 221
6.3.2 模塊導(dǎo)入 222
6.3.3 模塊導(dǎo)出 222
6.3.4 ES模塊示例 223
6.3.5 兼容性更好的@std/esm 224
6.4 本章小結(jié) 224
第7章 異步寫法與流程控制 225
7.1 異步調(diào)用 226
7.1.1 異步與同步 226
7.1.2 瀏覽器中的異步 227
7.1.3 Node.js異步原理 227
7.1.4 API和示例 229
7.1.5 代碼優(yōu)化 231
7.2 Node.js自帶的異步寫法 236
7.2.1 錯(cuò)誤優(yōu)先的回調(diào)方式 236
7.2.2 EventEmitter 240
7.2.3 該選擇哪種風(fēng)格的寫法 247
7.3 更好的異步流程控制 248
7.3.1 回調(diào)地獄 248
7.3.2 Thunk 252
7.3.3 Promise 254
7.3.4 Generator 276
7.3.5 async函數(shù) 282
7.4 本章小結(jié) 287