第1章 Node簡介 1
1.1 Node的誕生曆程 1
1.2 Node的命名與起源 1
1.2.1 為什麼是JavaScript 2
1.2.2 為什麼叫Node 2
1.3 Node給JavaScript帶來的意義 2
1.4 Node的特點 4
1.4.1 異步I/O 4
1.4.2 事件與迴調函數 6
1.4.3 單綫程 7
1.4.4 跨平颱 7
1.5 Node的應用場景 8
1.5.1 I/O密集型 8
1.5.2 是否不擅長CPU密集型業務 8
1.5.3 與遺留係統和平共處 10
1.5.4 分布式應用 10
1.6 Node的使用者 10
1.7 參考資源 11
第2章 模塊機製 12
2.1 CommonJS規範 13
2.1.1 CommonJS的齣發點 13
2.1.2 CommonJS的模塊規範 14
2.2 Node的模塊實現 15
2.2.1 優先從緩存加載 16
2.2.2 路徑分析和文件定位 16
2.2.3 模塊編譯 18
2.3 核心模塊 20
2.3.1 JavaScript核心模塊的編譯過程 21
2.3.2 C/C++核心模塊的編譯過程 22
2.3.3 核心模塊的引入流程 25
2.3.4 編寫核心模塊 25
2.4 C/C++擴展模塊 27
2.4.1 前提條件 28
2.4.2 C/C++擴展模塊的編寫 29
2.4.3 C/C++擴展模塊的編譯 30
2.4.4 C/C++擴展模塊的加載 31
2.5 模塊調用棧 32
2.6 包與NPM 33
2.6.1 包結構 34
2.6.2 包描述文件與NPM 34
2.6.3 NPM常用功能 37
2.6.4 局域NPM 42
2.6.5 NPM潛在問題 43
2.7 前後端共用模塊 44
2.7.1 模塊的側重點 44
2.7.2 AMD規範 44
2.7.3 CMD規範 45
2.7.4 兼容多種模塊規範 45
2.8 總結 46
2.9 參考資源 46
第3章 異步I/O 47
3.1 為什麼要異步I/O 47
3.1.1 用戶體驗 48
3.1.2 資源分配 49
3.2 異步I/O實現現狀 50
3.2.1 異步I/O與非阻塞I/O 50
3.2.2 理想的非阻塞異步I/O 54
3.2.3 現實的異步I/O 54
3.3 Node的異步I/O 56
3.3.1 事件循環 56
3.3.2 觀察者 56
3.3.3 請求對象 57
3.3.4 執行迴調 59
3.3.5 小結 60
3.4 非I/O的異步API 60
3.4.1 定時器 60
3.4.2 process.nextTick() 61
3.4.3 setImmediate() 62
3.5 事件驅動與高性能服務器 63
3.6 總結 65
3.7 參考資源 65
第4章 異步編程 66
4.1 函數式編程 66
4.1.1 高階函數 66
4.1.2 偏函數用法 67
4.2 異步編程的優勢與難點 68
4.2.1 優勢 69
4.2.2 難點 70
4.3 異步編程解決方案 74
4.3.1 事件發布/訂閱模式 74
4.3.2 Promise/Deferred模式 82
4.3.3 流程控製庫 93
4.4 異步並發控製 105
4.4.1 bagpipe的解決方案 105
4.4.2 async的解決方案 109
4.5 總結 110
4.6 參考資源 110
第5章 內存控製 111
5.1 V8的垃圾迴收機製與內存限製 111
5.1.1 Node與V8 112
5.1.2 V8的內存限製 112
5.1.3 V8的對象分配 112
5.1.4 V8的垃圾迴收機製 113
5.1.5 查看垃圾迴收日誌 119
5.2 高效使用內存 121
5.2.1 作用域 121
5.2.2 閉包 123
5.2.3 小結 124
5.3 內存指標 124
5.3.1 查看內存使用情況 124
5.3.2 堆外內存 126
5.3.3 小結 127
5.4 內存泄漏 127
5.4.1 慎將內存當做緩存 127
5.4.2 關注隊列狀態 130
5.5 內存泄漏排查 130
5.5.1 node-heapdump 131
5.5.2 node-memwatch 132
5.5.3 小結 135
5.6 大內存應用 135
5.7 總結 136
5.8 參考資源 136
第6章 理解Buffer 137
6.1 Buffer結構 137
6.1.1 模塊結構 137
6.1.2 Buffer對象 138
6.1.3 Buffer內存分配 139
6.2 Buffer的轉換 141
6.2.1 字符串轉Buffer 141
6.2.2 Buffer轉字符串 142
6.2.3 Buffer不支持的編碼類型 142
6.3 Buffer的拼接 143
6.3.1 亂碼是如何産生的 144
6.3.2 setEncoding()與string_decoder() 144
6.3.3 正確拼接Buffer 145
6.4 Buffer與性能 146
6.5 總結 149
6.6 參考資源 149
第7章 網絡編程 150
7.1 構建TCP服務 150
7.1.1 TCP 150
7.1.2 創建TCP服務器端 151
7.1.3 TCP服務的事件 153
7.2 構建UDP服務 154
7.2.1 創建UDP套接字 154
7.2.2 創建UDP服務器端 154
7.2.3 創建UDP客戶端 155
7.2.4 UDP套接字事件 155
7.3 構建HTTP服務 155
7.3.1 HTTP 156
7.3.2 http模塊 157
7.3.3 HTTP客戶端 161
7.4 構建WebSocket服務 163
7.4.1 WebSocket握手 164
7.4.2 WebSocket數據傳輸 167
7.4.3 小結 169
7.5 網絡服務與安全 169
7.5.1 TLS/SSL 170
7.5.2 TLS服務 172
7.5.3 HTTPS服務 173
7.6 總結 175
7.7 參考資源 176
第8章 構建Web應用 177
8.1 基礎功能 177
8.1.1 請求方法 178
8.1.2 路徑解析 179
8.1.3 查詢字符串 180
8.1.4 Cookie 181
8.1.5 Session 184
8.1.6 緩存 190
8.1.7 Basic認證 193
8.2 數據上傳 195
8.2.1 錶單數據 195
8.2.2 其他格式 196
8.2.3 附件上傳 197
8.2.4 數據上傳與安全 199
8.3 路由解析 201
8.3.1 文件路徑型 202
8.3.2 MVC 202
8.3.3 RESTful 207
8.4 中間件 210
8.4.1 異常處理 214
8.4.2 中間件與性能 215
8.4.3 小結 216
8.5 頁麵渲染 217
8.5.1 內容響應 217
8.5.2 視圖渲染 219
8.5.3 模闆 220
8.5.4 Bigpipe 231
8.6 總結 235
8.7 參考資源 235
第9章 玩轉進程 236
9.1 服務模型的變遷 236
9.1.1 石器時代:同步 236
9.1.2 青銅時代:復製進程 237
9.1.3 白銀時代:多綫程 237
9.1.4 黃金時代:事件驅動 237
9.2 多進程架構 238
9.2.1 創建子進程 239
9.2.2 進程間通信 240
9.2.3 句柄傳遞 242
9.2.4 小結 247
9.3 集群穩定之路 248
9.3.1 進程事件 248
9.3.2 自動重啓 249
9.3.3 負載均衡 254
9.3.4 狀態共享 255
9.4 Cluster模塊 257
9.4.1 Cluster工作原理 258
9.4.2 Cluster事件 259
9.5 總結 259
9.6 參考資源 260
第10章 測試 261
10.1 單元測試 261
10.1.1 單元測試的意義 261
10.1.2 單元測試介紹 263
10.1.3 工程化與自動化 276
10.1.4 小結 277
10.2 性能測試 278
10.2.1 基準測試 278
10.2.2 壓力測試 280
10.2.3 基準測試驅動開發 281
10.2.4 測試數據與業務數據的轉換 283
10.3 總結 284
10.4 參考資源 284
第11章 産品化 285
11.1 項目工程化 285
11.1.1 目錄結構 285
11.1.2 構建工具 286
11.1.3 編碼規範 289
11.1.4 代碼審查 289
11.2 部署流程 290
11.2.1 部署環境 291
11.2.2 部署操作 291
11.3 性能 293
11.3.1 動靜分離 293
11.3.2 啓用緩存 294
11.3.3 多進程架構 294
11.3.4 讀寫分離 295
11.4 日誌 295
11.4.1 訪問日誌 295
11.4.2 異常日誌 296
11.4.3 日誌與數據庫 299
11.4.4 分割日誌 299
11.4.5 小結 299
11.5 監控報警 299
11.5.1 監控 300
11.5.2 報警的實現 302
11.5.3 監控係統的穩定性 303
11.6 穩定性 303
11.7 異構共存 304
11.8 總結 305
11.9 參考資源 305
附錄A 安裝Node 306
A.1 Windows係統下的Node安裝 306
A.2 Mac係統下Node的安裝 307
A.3 Linux係統下Node的安裝 308
A.4 總結 309
A.5 參考資源 309
附錄B 調試Node 310
B.1 Debugger 310
B.2 Node Inspector 311
B.2.1 安裝Node Inspector 312
B.2.2 錯誤堆棧 312
B.3 總結 313
附錄C Node編碼規範 314
C.1 根源 314
C.2 編碼規範 315
C.2.1 空格與格式 315
C.2.2 命名規範 317
C.2.3 比較操作 318
C.2.4 字麵量 318
C.2.5 作用域 318
C.2.6 數組與對象 319
C.2.7 異步 320
C.2.8 類與模塊 320
C.2.9 注解規範 321
C.3 最佳實踐 321
C.3.1 衝突的解決原則 321
C.3.2 給編輯器設置檢測工具 321
C.3.3 版本控製中的hook 322
C.3.4 持續集成 322
C.4 總結 322
C.5 參考資源 323
附錄D 搭建局域NPM倉庫 324
D.1 NPM倉庫的安裝 325
D.1.1 安裝Erlang和CouchDB 325
D.1.2 搭建NPM倉庫 326
D.2 高階應用 328
D.2.1 鏡像倉庫 328
D.2.2 私有模塊應用 328
D.2.3 純私有倉庫 329
D.3 總結 331
D.4 參考資源 332
· · · · · · (
收起)