新時期的 Node.js 入門/Web前端技術叢書
內容描述
Node.js是一門開源的、為Web而生的語言,具有高並發、異步等特點,並且擁有一個十分活躍的開發者社區。與Ruby、Python等語言相比,Node.js更年輕、更易於沒有經驗的人上手使用,因此很快在世界各地的開發者中收獲了一大批擁躉。在國內,Node.js在許多企業中獲得了廣泛應用,並取得了一系列的應用成果。然而,隨著技術的不斷更新、ECMAScript2015等新標準紛紛確定,現有的中文書籍就變得有些過時。本書立足於新的技術潮流,介紹了一系列全新的語言特性和標準,以便讓讀者在學習基礎知識的同時緊跟新技術的發展。
本書分為8章6個附錄,講解了Node.js的各種基礎特性,使讀者快速入門,同時結合語言最新的發展趨勢,讓讀者能夠緊跟技術潮流。本書圍繞Node.js在Web站點開發和爬蟲系統中的應用展開,對Node.js在大型項目中的定位與應用做了詳細的說明。
本書可用於Node.js入門,適合未接觸過Node的讀者以及在校的學生閱讀,也適合作為高等院校和培訓學校相關專業的師生教學參考。
海報:
目錄大綱
第1章基礎知識1
1.1 Node是什麼1
1.1.1 Node與JavaScript 1
1.1.2 runtime和VM 2
1.2 Node的內部機制3
1.2.1何為回調3
1.2.2同步/異步和阻塞/非阻塞4
1.2.3單線程和多線程6
1.2.4並行和並發7
1.3事件循環(Event loop) 8
1.3.1事件與循環8
1.3.2 Node中的事件循環9
1.3.3 process.nextTick 13
1.4總結16
1.5參考資源16
第2章常用模塊17
2.1 Module 17
2.1.1 JavaScript的模塊規範17
2.1.2 require及其運行機制18
2.1.3 require的隱患20
2.1.4模塊化與作用域20
2.2 Buffer 22
2.2.1 Buffer的構建與轉換23
2.2.2 Buffer的拼接24
2.3 File System 26
2.4 HTTP服務30
2.4.1創建HTTP服務器30
2.4.2處理HTTP請求32
2.4.3 Response對象34
2.4.4上傳數據35
2.4.5 HTTP客戶端服務38
2.4.6創建代理服務器39
2.5 TCP服務40
2.5.1 TCP和Socket 41
2.5.2創建TCP服務器41
2.6更安全的傳輸方式——SSL 42
2.6.1什麼是SSL 43
2.6.2 SSL原理43
2.6.3對稱加密與非對稱加密44
2.6.4關於CA 45
2.6.5創建HTTPS服務45
2.7 WebSocket 48
2.7.1保持通話48
2.7.2為什麼要有WebSocket 49
2.7.3 WebSocket與Node 50
2.8 Stream 50
2.8.1 Stream的種類50
2.8.2 ReadLine 53
2.8.3自定義Stream 54
2.9 Events 55
2.9.1事件和監聽器55
2.9.2處理error事件56
2.9.3繼承Events模塊57
2.10多進程服務58
2.10.1 child_process模塊58
2.10.2 spawn 58
2.10.3 fork 59
2.10.4 exec和execFile 60
2.10.5各方法之間的比較62
2.10.6進程間通信64
2.10.7 Cluster 65
2.11 Process對象66
2.11.1環境變量67
2.11 .2方法和事件67
2.11.3一個例子:修改所在的時區68
2.12 Timer 70
2.12.1常用API 70
2.12.2定時器中的this 71
2.13小結72
2.14引用資源72
第3章用ES6來書寫Node 73
3.1新時代的EMCAScript 73
3.1.1 JavaScript的缺陷73
3.1.2 Node對新標準的支持74
3.1.3使用nvm管理Node版本75
3.2塊級作用域75
3.2.1 ES5中的作用域75
3.2. 2 let關鍵字77
3.2.3 const關鍵字78
3.3數組78
3.3.1 find()和findIndex() 79
3.3.2 from()方法79
3.3.3 fill()方法81
3.3.4數組的遍歷81
3.3.5 TypedArray 82
3.4函數82
3.4.1參數的默認值82
3.4.2 Spread運算符83
3.4.3箭頭函數83
3.4.4箭頭函數的陷阱86
3.5 Set和Map 87
3.5 .1 Set和WeakSet 87
3.5.2 Map和WeakMap 88
3.6 Iterator 89
3.6.1 Java中的Iterator 89
3.6.2 ES6中的Iterator 89
3.6.3 Iterator的遍歷90
3.7對象91
3.7.1新的方法91
3.7 .2對象的遍歷92
3.8類93
3.8.1屬性和構造函數94
3.8.2類方法94
3.8.3 proto 95
3.8.4靜態方法96
3.9類的繼承96
3.9.1 ES5中的繼承96
3.9.2 ES6中的繼承98
3.9.3 Node中的類繼承100
3.10 ES6的模塊化標準101
3.11使用babel來轉換代碼102
3.12小結106
3.13引用資源106
第4章書寫異步代碼107
4.1異步操作的返回值108
4.2組織回調方法108
4.2.1回調與CPS 108
4.2.2使用async模塊簡化回調110
4.3使用Promise 112
4.3.1 Promise的歷史112
4.3.2 Promise是什麼113
4.3.3 ES2015中的Promise 114
4.3.4 Promise的常用API 116
4.3.5使用Promise組織異步代碼119
4.3.6第三方模塊的Promise 120
4.4 Generator,一種過渡方案122
4.4.1 Generator的使用122
4.4.2 Generator函數的執行123
4.4.3 Generator中的錯誤處理126
4.4.4用Generator組織異步方法127
4.4.5 Generator的自動執行128
4.5回調的終點——async/await 131
4.5.1 async函數的概念131
4.5.2 await關鍵字133
4.5.3在循環中使用async方法135
4.5.4 async和await小結136
4.5.5 async函數的缺點137
4.6總結138
4.7引用資源139
第5章使用Koa2構建Web站點140
5.1 Node Web框架的發展歷程140
5.1.1 Connect 140
5.1.2 Express 141
5.1.3 Koa 141
5.2內容規劃142
5.2.1需求分析142
5.2.2技術選型142
5.3 Koa入門143
5.3.1 Koa1.x與Koa2 143
5.3.2 context對象144
5.4 middleware 148
5.4.1中間件的概念148
5.4.2 next方法150
5.4.3中間件的串行調用151
5.4 .4一個例子——如何實現超時響應152
5.5常用服務的實現154
5.5.1靜態文件服務154
5.5.2路由服務155
5.5.3數據存儲156
5.5.4文件上傳160
5.5.5頁面渲染163
5.6構建健壯的Web應用165
5.6.1上傳文件驗證166
5.6.2使用Cookie進行身份驗證167
5.6.3使用Session記錄會話狀態170
5.7使用Redis進行持久化173
5.7.1 Node和Redis的交互173
5.7.2 CURD操作174
5.7.3使用Redis持久化session 176
5.7.4 Redis在Node中的應用179
5.8 Koa源碼剖析180
5.8.1 Koa的啟動過程180
5.8.2中間件的加載181
5.8.3 listen()方法184
5.8.4 next()與return next() 185
5.8.5關於Can't set headers after they are sent. 186
5.8.6 Context對象的實現187
5.8. 7 Koa的優缺點189
5.9網站部署190
5.9.1本地部署190
5.9.2部署在雲服務主機上191
5.9.3通過GitHub pages來部署193
5.10總結194
5.11引用資源194
第6章爬蟲系統的開發195
6.1爬蟲技術概述196
6.2技術棧簡介196
6.2.1 request.js 196
6.2.2 cheerio 197
6.2.3消息隊列199
6.3構建腳手架199
6.3.1選擇目標網站199
6.3.2分析URL結構200
6.3.3構建HTTP請求200
6.3.4解析頁面元素201
6.4進行批量爬取203
6.4.1使用遞歸和定時器203
6.4.2多進程並行205
6.5爬蟲架構的改進206
6.5 .1異步流程控制206
6.5.2回到最初的目標206
6.5.3多進程模型的缺陷208
6.6進程架構的改進208
6.6.1生產/消費模型208
6.6.2生產者的實現209
6.6.3消費者的實現211
6.7反爬蟲處理213
6.7.1爬蟲的危害213
6.7.2識別一個爬蟲213
6.7.3針對爬蟲的處理214
6.8總結216
6.9引用資源216
第7章測試與調試217
7.1單元測試218
7.1 .1使用Assert模塊218
7.1.2 Jasmine 219
7.1.3 Ava.js——面向未來224
7.2測試現有代碼227
7.3更高維度的測試228
7.3.1基準測試228
7.3.2集成測試229
7.3.3持續集成229
7.4調試Node應用231
7.4.1語言和IDE 232
7.4.2使用node-inspector 233
7.4.3使用v8-inspector 234
7.4.4使用IDE進行調試236
7.4.5 cpu profiling 237
7.5總結239
7.6引用資源239
第8章Node中的錯誤處理240
8.1 Error模塊241
8.2錯誤處理的幾種方式241
8.3被拋棄的Domain 243
8.3.1 Domain模塊簡介243
8.3.2 Domain原理247
8.3.3 Domain中間件249
8.3.4 Domain的缺陷249
8.4 ES6中的錯誤處理250
8.4.1 Promise 250
8.4.2 Generator 250
8.4.3 async函數251
8.5 Web服務中的錯誤處理251
8.5.1針對每個請求的錯誤處理251
8.5.2 Express中的錯誤處理252
8.5.3 Koa中的錯誤處理252
8.6防禦式編程與Let it crash 253
8.7總結256
8.8引用資源256
附錄A進程、線程、協程257
A.1從操作系統說起257
A.2 Node中的協程258
附錄B Lua語言簡介259
B.1 Lua中的數據類型259
B.2定義一個函數260
B .3 Lua中的協程261
附錄C從零開發一個Node Web框架263
C.1框架的雛形263
C.2框架的完善264
C.3總結268
附錄D MongoDB和Redis簡介269
D.1 NoSQL 269
D .2 MongoDB簡介269
D.3 Redis簡介271
附錄E使用Docker來實現虛擬化274
E.1 Docker的一些常用命令274
E.2 Redis服務275
附錄F npm與包管理277
F.1 package.json常用字段277
F.2依賴版本的管理278
作者介紹
李鍇,畢業於廈門大學軟件學院,目前就職於花旗集團,從事Web前端開發工作。