本書跟隨了Node.js的標準與行業(yè)的發(fā)展趨勢,在介紹新標準與新技術的同時兼顧了理論基礎和實際應用,主要內(nèi)容分為基礎和應用兩部分,基礎部分內(nèi)容包含了Node.js環(huán)境配置,npm項目管理,JavaScript語法基礎,Node.js基本模塊的原理與使用,異步代碼的編寫與組織,應用部分包含了網(wǎng)絡編程,桌面應用開發(fā)以及測試和調(diào)試。
本書講解與示例并重,由淺入深地剖析了Node.js模塊與語言原理,并通過各種實際場景下的用例來引導讀者進行思考,使讀者在學習編程語言的同時增進對語言本身的了解。
本書適用于高等院校計算機相關課程作為基礎教材使用,也可以供對Node.js語言感興趣的讀者自學使用。
1.從零開始學習開發(fā)完整可用的項目,掌握語言細節(jié)并獲得實際經(jīng)驗。
2.以實際應用為背景,闡述Node.js在實際項目中的定位和潛在的陷阱。
3.適合沒有Node.js經(jīng)驗的讀者,旨在快速上手到獨立開發(fā)小型應用
李鍇,畢業(yè)于廈門大學軟件學院,目前任職于花旗集團,從事Web前端開發(fā)工作。喜歡鉆研前沿技術,熱愛技術分享,自2014年接觸Node以來,使用Node.js完成了多個中小型應用的開發(fā),并且愿意將Node.js技術分享給更多人。
第1章 概述 1
1.1 了解Node.js 1
1.2 安裝 1
1.2.1 源代碼安裝 2
1.2.2 驗證安裝 2
1.3 hello world 3
1.4 其他準備工作 3
1.4.1 準備一個開發(fā)環(huán)境 4
1.4.2 準備一份源代碼 4
1.4.3 準備一個類Linux環(huán)境 4
1.4.4 熟悉控制臺 4
1.4.5 準備一份文檔 5
第2章 了解npm 6
2.1 package.json 7
2.1.1 生成package.json 7
2.1.2 第三方模塊 8
2.2 使用npm install 8
2.3 node_modules 10
2.4 控制模塊版本 11
2.4.1 子模塊的版本 12
2.4.2 package-lock.json 12
2.5 使用npm構建項目 13
2.6 關于版本升級 15
小結 15
思考與問題 16
第3章 JavaScript核心 17
3.1 基本類型 18
3.1.1 布爾值 18
3.1.2 數(shù)字 19
3.1.3 字符串 19
3.1.4 正則表達式 21
3.1.5 比較相等 23
3.2 數(shù)據(jù)結構 24
3.2.1 數(shù)組 24
3.2.2 TypedArray 28
3.2.3 !29
3.2.4 鏈表 29
3.2.5 二叉樹 30
3.2.6 Set 31
3.2.7 Map 32
3.3 變量與作用域 33
3.3.1 聲明變量 33
3.3.2 變量提升 34
3.3.3 作用域 36
3.3.4 this 37
3.4 函數(shù) 37
3.4.1 箭頭函數(shù) 37
3.4.2 覆蓋原生函數(shù) 38
3.4.3 閉包 39
3.4.4 函數(shù)式編程 40
3.5 對象 45
3.5.1 創(chuàng)建對象 45
3.5.2 Symbol屬性 47
3.5.3 對象遍歷器 48
3.6 類與繼承 51
3.6.1 定義一個類 51
3.6.2 繼承 52
3.7 實戰(zhàn):編寫字節(jié)碼執(zhí)行器 53
3.7.1 指令集 53
3.7.2 編寫執(zhí)行器 56
小結 59
思考與問題 59
第4章 編寫結構化程序 60
4.1 module 63
4.1.1 哪些模塊需要引入 64
4.1.2 require()及其運行機制 64
4.1.3 ES6 module 67
4.2 process 67
4.2.1 屬性和方法 67
4.2.2 預定義事件 69
4.3 Events 70
4.3.1 使用 70
4.3.2 事件監(jiān)聽的實現(xiàn)原理 70
4.3.3 繼承Events模塊 71
4.4 文件系統(tǒng) 71
4.4.1 源碼實現(xiàn) 71
4.4.2 文件系統(tǒng)API 72
4.4.3 同步和異步 74
4.4.4 關于文件路徑 75
4.5 Stream 76
4.5.1 流式數(shù)據(jù) 76
4.5.2 Stream API 77
4.5.3 可讀流 77
4.5.4 可寫流 79
4.5.5 和文件系統(tǒng)API的比較 82
4.6 Child Process 84
4.6.1 spawn() 84
4.6.2 fork() 85
4.7 處理CPU密集型任務 87
4.8 實戰(zhàn):控制CPU占用曲線 89
4.8.1 單核環(huán)境 90
4.8.2 適應多核 91
4.8.3 精準控制 92
4.8.4 獲取CPU占用率 94
4.9 C++擴展 95
4.9.1 V8 API 96
4.9.2 N-API 98
4.9.3 封裝bitset 99
4.9.4 封裝sleep函數(shù) 102
小結 104
思考與問題 104
第5章 組織異步代碼 105
5.1 回調(diào)函數(shù) 106
5.1.1 回調(diào)函數(shù)的執(zhí)行過程 106
5.1.2 回調(diào)的返回值 106
5.2 Promise 107
5.2.1 什么是Promise 108
5.2.2 then 109
5.2.3 使用Promise處理異步任務 110
5.2.4 使用Promise封裝現(xiàn)有方法 114
5.2.5 運行多個Promise 115
5.2.6 更多API 118
5.3 async/await 118
5.3.1 背景 118
5.3.2 async函數(shù) 119
5.3.3 await關鍵字 119
5.3.4 錯誤處理 121
5.3.5 循環(huán)中的async 121
5.3.6 事件循環(huán)與async 122
5.4 動手實現(xiàn)Promise 122
5.4.1 從外到內(nèi) 122
5.4.2 適應異步過程 123
5.4.3 實現(xiàn)鏈式調(diào)用 124
5.4.4 連續(xù)異步操作 126
小結 128
思考與問題 128
第6章 Web應用 129
6.1 Web服務器 129
6.1.1 使用HTTP模塊 130
6.1.2 server/request/response 131
6.1.3 處理HTTP請求 135
6.1.4 模板引擎與頁面渲染 140
6.1.5 數(shù)據(jù)庫的交互 143
6.2 使用express 144
6.2.1 基本概念 145
6.2.2 靜態(tài)文件服務 148
6.2.3 路由服務 148
6.2.4 中間件系統(tǒng) 150
6.2.5 迷你express 154
6.2.6 cookie 156
6.2.7 session 158
6.2.8 OAuth 161
6.2.9 與前端應用的整合 165
6.2.10 提高服務器性能 167
6.3 集群和進程管理 169
6.3.1 使用Cluster模塊 169
6.3.2 負載均衡 171
6.3.3 服務器安全 173
6.4 HTTPS 175
6.4.1 對稱加密和非對稱加密 176
6.4.2 升級HTTPS服務器 177
6.5 全雙工通信 177
6.5.1 輪詢和長連接 177
6.5.2 使用WebSocket 178
6.5.3 WebSocket握手 179
6.5.4 HTTP/2 180
6.6 HTTP客戶端 181
6.7 API文檔 183
6.7.1 Swagger UI 183
6.7.2 API描述文件 184
小結 186
思考與問題 187
第7章 圖形化應用 188
7.1 桌面應用 188
7.1.1 Java Swing 188
7.1.2 WPF 189
7.1.3 Qt 190
7.2 Electron 190
7.2.1 快速開始 191
7.2.2 頁面和后臺的交互 194
7.2.3 實現(xiàn)菜單欄 195
7.2.4 多窗口管理 199
小結 200
思考與問題 200
第8章 測試與調(diào)試 201
8.1 測試框架 201
8.1.1 斷言系統(tǒng) 201
8.1.2 使用jasmine 202
8.1.3 覆蓋率測試 208
8.1.4 壓力測試 209
8.2 調(diào)試 210
8.2.1 調(diào)試Node代碼 211
8.2.2 調(diào)試C++源代碼 211
8.2.3 CPU profile 212
小結 215
思考與問題 215
附錄A 基礎概念 216
A.1 編程語言和運行時 216
A.1.1 編程語言的產(chǎn)生 217
A.1.2 什么是運行時 217
A.1.3 為什么是JavaScript 217
A.1.4 編譯Node源碼 217
A.1.5 Node架構 218
A.1.6 js2c 220
A.2 關于操作系統(tǒng) 221
A.2.1 進程和線程 221
A.2.2 理解高并發(fā) 222
A.2.3 理解非阻塞 222
A.3 事件循環(huán) 222
A.3.1 各階段概述 223
A.3.2 阻塞事件循環(huán) 224
A.3.3 process.nextTick 225
A.3.4 模擬事件循環(huán) 227
A.3.5 microTask 和macroTask/task 228
附錄B 網(wǎng)絡通信基礎 232
B.1 發(fā)生了什么 232
B.1.1 尋址 232
B.1.2 建立連接 232
B.1.3 通信 233
B.2 socket接口 233
B.2.1 創(chuàng)建socket 234
B.2.2 建立連接 234
B.2.3 接收消息 234
B.3 socket與并發(fā) 234
B.3.1 select和poll 235
B.3.2 epoll 236
附錄C Node和其他語言的比較 237
C.1 面向?qū)ο蟆?37
C.2 C語言中的Stream 238
C.3 關于I/O的處理 239
C.4 C# Task 239
附錄D Docker 241
D.1 容器技術 241
D.1.1 鏡像 241
D.1.2 容器與鏡像 242
D.1.3 運行 242
D.2 運行MySQL 243
D.3 使用MongoDB 243
D.4 Dockerfile 244