本書是Node.js的實戰(zhàn)教程,涵蓋了為開發(fā)產(chǎn)品級Node應用程序所需要的一切特性、技巧以及相關(guān)理念。 從搭建Node開發(fā)環(huán)境,到一些簡單的演示程序,到開發(fā)復雜應用程序所必不可少的異步編程。D2版介紹了全棧kai發(fā)者所需的全部技術(shù),包括前端構(gòu)建系統(tǒng)、選擇Web框架、在Node中與數(shù)據(jù)庫的交互、編寫測試和部署Web程序,等等。
作為JavaScript服務器,Node支持可伸縮的高性能Web應用,極大簡化了聊天、游戲和實時數(shù)據(jù)分析這樣的事件驅(qū)動實時應用程序的開發(fā),其生態(tài)系統(tǒng)也生機勃勃,模塊、工具、庫,應有盡有。
本書是在《Node.js實戰(zhàn)》基礎(chǔ)上打造的全新著作,由多位Node核心框架構(gòu)建者和經(jīng)驗豐富的Web開發(fā)人員執(zhí)筆,結(jié)合大量實例介紹如何用JavaScript和Node創(chuàng)建高性能的Web服務器,涵蓋異步編程、狀態(tài)管理、事件驅(qū)動編程等關(guān)鍵設(shè)計理念,旨在幫助讀者成功晉級全棧開發(fā)。
·前端系統(tǒng)構(gòu)建
·服務器端框架選擇
·如何用Express從頭開始搭建Web程序
·與數(shù)據(jù)庫的交互
·掌握非阻塞I/O
·Node的事件輪詢
·測試與部署
·Web程序模板
·用Node開發(fā)命令行工具和桌面軟件
亞歷克斯·楊(Alex Young),經(jīng)驗豐富的Webkai發(fā)者,廣受歡迎的JavaScript社區(qū)DailyJS創(chuàng)始人。目前任職于Apple。另著有《Node.js硬實戰(zhàn)》。
布拉德利·馬克(Bradley Meck),TC39和Node.js基金會成員。業(yè)余時間醉心于為JavaScript制作工具、園藝和指導學生。
麥克·坎特倫(Mike Cantelon),Node.js核心框架貢獻者,Node社區(qū)活躍分子,培訓師和演講人。
蒂姆·奧克斯利(Tim Oxley),JavaScript(Node.js/React)自由撰稿人。
馬克·哈特(Marc Harter),Node.js核心框架貢獻者。
T.J.霍洛瓦丘(T.J.Holowaychuk),參與開發(fā)了很多Node.js模塊,包括流行的Express框架。
內(nèi)森·拉伊利赫(Nathan Rajlich),大名鼎鼎的TooTallNate,Node.js核心代碼提交者。
第 一部分 Node基礎(chǔ)知識介紹
第 1 章 歡迎進入Node.js的世界 2
1.1 一個典型的Node Web應用程序 2
1.1.1 非阻塞I/O 3
1.1.2 事件輪詢 4
1.2 ES2015、Node和V8 5
1.2.1 Node與V8 7
1.2.2 使用特性組 8
1.2.3 了解Node的發(fā)布計劃 8
1.3 安裝Node 8
1.4 Node自帶的工具 9
1.4.1 npm 9
1.4.2 核心模塊 10
1.4.3 調(diào)試器 11
1.5 三種主流的Node程序 12
1.5.1 Web應用程序 12
1.5.2 命令行工具和后臺程序 13
1.5.3 桌面程序 14
1.5.4 適合Node的應用程序 14
1.6 總結(jié) 15
第 2 章 Node編程基礎(chǔ) 16
2.1 Node功能的組織及重用 16
2.2 開始一個新的Node項目 18
2.3 用module.exports微調(diào)模塊的創(chuàng)建 20
2.4 用node_modules重用模塊 22
2.5 注意事項 23
2.6 使用異步編程技術(shù) 24
2.7 用回調(diào)處理一次性事件 25
2.8 用事件發(fā)射器處理重復性事件 28
2.8.1 事件發(fā)射器示例 28
2.8.2 響應只應該發(fā)生一次的事件 29
2.8.3 創(chuàng)建事件發(fā)射器:一個PUB/SUB的例子 29
2.8.4 擴展事件監(jiān)聽器:文件監(jiān)視器 32
2.9 異步開發(fā)的難題 34
2.10 異步邏輯的順序化 35
2.11 何時使用串行流程控制 36
2.12 實現(xiàn)串行化流程控制 37
2.13 實現(xiàn)并行化流程控制 39
2.14 利用社區(qū)里的工具 41
2.15 總結(jié) 43
第 3 章 Node Web程序是什么 44
3.1 了解Node Web程序的結(jié)構(gòu) 45
3.1.1 開始一個新的Web程序 45
3.1.2 跟其他平臺比一比 47
3.1.3 然后呢 47
3.2 搭建一個RESTful Web服務 47
3.3 添加數(shù)據(jù)庫 50
3.3.1 制作自己的模型API 51
3.3.2 讓文章可讀并把它存起來 53
3.4 添加用戶界面 54
3.4.1 支持多種格式 54
3.4.2 渲染模板 55
3.4.3 用npm管理客戶端依賴項 56
3.5 總結(jié) 57
D二部分 Node的Web開發(fā)
第 4 章 前端構(gòu)建系統(tǒng) 60
4.1 了解基于Node的前端開發(fā) 60
4.2 用npm運行腳本 61
4.2.1 創(chuàng)建定制的npm腳本 62
4.2.2 配置前端構(gòu)建工具 63
4.3 用Gulp實現(xiàn)自動化 63
4.3.1 把Gulp添加到項目中 64
4.3.2 Gulp任務的創(chuàng)建及運行 64
4.3.3 監(jiān)測變化 66
4.3.4 在大項目中把任務分散到不同文件中 66
4.4 用Webpack構(gòu)建Web程序 67
4.4.1 使用打包器和插件 67
4.4.2 配置和運行Webpack 68
4.4.3 用Webpack開發(fā)服務器 68
4.4.4 加載CommonJS模塊和靜態(tài)資源 70
4.5 總結(jié) 71
第 5 章 服務器端框架 72
5.1 用戶畫像 72
5.1.1 菲爾:代理kai發(fā)者 73
5.1.2 納迪娜:開源kai發(fā)者 73
5.1.3 愛麗絲:產(chǎn)品kai發(fā)者 73
5.2 框架是什么 74
5.3 Koa 74
5.3.1 設(shè)置 76
5.3.2 定義路由 76
5.3.3 REST API 77
5.3.4 優(yōu)點 77
5.3.5 弱點 77
5.4 Kraken 77
5.4.1 設(shè)置 77
5.4.2 定義路由 78
5.4.3 REST API 79
5.4.4 優(yōu)點 79
5.4.5 弱點 79
5.5 hapi 79
5.5.1 設(shè)置 80
5.5.2 定義路由 80
5.5.3 插件81
5.5.4 REST API 82
5.5.5 優(yōu)點 83
5.5.6 弱點 83
5.6 Sails.js 83
5.6.1 設(shè)置 83
5.6.2 定義路由 84
5.6.3 REST API 84
5.6.4 優(yōu)點 85
5.6.5 弱點 85
5.7 DerbyJS 85
5.7.1 設(shè)置 85
5.7.2 定義路由 86
5.7.3 REST API 87
5.7.4 優(yōu)點 87
5.7.5 弱點 87
5.8 Flatiron.js 87
5.8.1 設(shè)置 88
5.8.2 定義路由 88
5.8.3 REST API 89
5.8.4 優(yōu)點 90
5.8.5 弱點 90
5.9 LoopBack 90
5.9.1 設(shè)置 91
5.9.2 定義路由 92
5.9.3 REST API 92
5.9.4 優(yōu)點 93
5.9.5 弱點 93
5.10 比較 93
5.11 編寫模塊化代碼 95
5.12 用戶選擇 95
5.13 總結(jié) 95
第 6 章 深入了解Connect和Express 96
6.1 Connect 96
6.1.1 創(chuàng)建Connect程序 97
6.1.2 了解Connect中間件的工作機制 97
6.1.3 組合中間件 98
6.1.4 中間件的順序 98
6.1.5 創(chuàng)建可配置的中間件 99
6.1.6 使用錯誤處理中間件 101
6.2 Express 103
6.2.1 生成程序框架 103
6.2.2 Express和程序的配置 107
6.2.3 渲染視圖 109
6.2.4 Express路由入門 113
6.2.5 用戶認證 120
6.2.6 注冊新用戶 124
6.2.7 已注冊用戶登錄 130
6.2.8 用戶加載中間件 133
6.2.9 創(chuàng)建REST API 134
6.2.10 啟用內(nèi)容協(xié)商 140
6.3 總結(jié) 142
第 7 章 Web程序的模板 143
7.1 用模板保持代碼的整潔性 143
7.2 Embedded JavaScript的模板 147
7.2.1 創(chuàng)建模板 148
7.2.2 將EJS集成到你的程序中 149
7.2.3 在客戶端程序中使用EJS 150
7.3 使用Mustache模板語言與Hogan 151
7.3.1 創(chuàng)建模板 151
7.3.2 Mustache標簽 151
7.3.3 微調(diào)Hogan 154
7.4 用Pug做模板 154
7.4.1 Pug基礎(chǔ)知識 155
7.4.2 Pug模板中的邏輯 157
7.4.3 組織Pug模板 159
7.5 總結(jié) 163
第 8 章 存儲數(shù)據(jù) 164
8.1 關(guān)系型數(shù)據(jù)庫 164
8.2 PostgreSQL 164
8.2.1 安裝及配置 164
8.2.2 創(chuàng)建數(shù)據(jù)庫 165
8.2.3 從Node中連接Postgres 165
8.2.4 定義表 166
8.2.5 插入數(shù)據(jù) 166
8.2.6 更新數(shù)據(jù) 166
8.2.7 查詢數(shù)據(jù) 167
8.3 Knex 167
8.3.1 查詢構(gòu)建器 168
8.3.2 用Knex實現(xiàn)連接和查詢 168
8.3.3 切換數(shù)據(jù)庫 170
8.3.4 注意抽象漏洞 171
8.4 MySQL和PostgreSQL 171
8.5 ACID保證 172
8.5.1 原子性:無論成敗,事務必須整體執(zhí)行 172
8.5.2 一致性:始終確保約束條件 172
8.5.3 隔離性:并發(fā)事務不會相互干擾 172
8.5.4 耐用性:事務是永久性的 173
8.6 NoSQL 173
8.7 分布式數(shù)據(jù)庫 173
8.8 MongoDB 174
8.8.1 安裝和配置 174
8.8.2 連接MongoDB 174
8.8.3 插入文檔 175
8.8.4 查詢 176
8.8.5 使用MongoDB標識 177
8.8.6 使用復制集 178
8.8.7 了解寫關(guān)注 180
8.9 鍵/值存儲 181
8.10 Redis 181
8.10.1 安裝和配置 182
8.10.2 初始化 182
8.10.3 處理鍵/值對 183
8.10.4 處理鍵 184
8.10.5 編碼與數(shù)據(jù)類型 184
8.10.6 使用散列表 186
8.10.7 使用列表 186
8.10.8 使用集合 187
8.10.9 用頻道實現(xiàn)發(fā)布/訂閱功能 188
8.10.10 提升性能 189
8.11 嵌入式數(shù)據(jù)庫 189
8.12 LevelDB 190
8.12.1 LevelUP與LevelDOWN 190
8.12.2 安裝 191
8.12.3 API概覽 191
8.12.4 初始化 191
8.12.5 鍵/值編碼 192
8.12.6 鍵/值對的讀寫 192
8.12.7 可插拔的后臺 193
8.12.8 模塊化數(shù)據(jù)庫 194
8.13 昂貴的序列化和反序列化 195
8.14 瀏覽器內(nèi)存儲 196
8.14.1 Web存儲:localStorage和sessionStorage 196
8.14.2 值的讀寫 197
8.14.3 localForage 199
8.14.4 讀和寫 199
8.15 存儲托管 200
8.16 選哪個數(shù)據(jù)庫 201
8.17 總結(jié) 201
第 9 章 測試Node程序 202
9.1 單元測試 203
9.1.1 assert模塊 203
9.1.2 Mocha 206
9.1.3 Vows 211
9.1.4 Chai 213
9.1.5 Should.js 214
9.1.6 Sinon.JS的探測器和存根 216
9.2 功能測試 218
9.3 處理失敗的測試 221
9.3.1 獲取更詳細的日志 221
9.3.2 更好的棧跟蹤 223
9.4 總結(jié) 224
第 10 章 Node程序的部署及運維 225
10.1 安置Node程序 225
10.1.1 平臺即服務 226
10.1.2 服務器 227
10.1.3 容器 228
10.2 部署的基礎(chǔ)知識 229
10.2.1 從Git庫部署 229
10.2.2 保證Node不掉線 230
10.3 在線時長和性能的zui大化 231
10.3.1 用Upstart保證在線時長 232
10.3.2 集群API:充分利用多核處理器 233
10.3.3 靜態(tài)文件及代理 235
10.4 總結(jié) 236
第三部分 超越Web開發(fā)
第 11 章 編寫命令行程序 238
11.1 了解慣例和理念 238
11.2 parse-json 239
11.3 使用命令行參數(shù) 239
11.3.1 解析命令行參數(shù) 239
11.3.2 驗證參數(shù) 240
11.3.3 將stdin作為文件傳遞 241
11.4 用npm分享命令行工具 242
11.5 用管道連接腳本 243
11.5.1 將數(shù)據(jù)通過管道傳給parse-json 243
11.5.2 處理錯誤和退出碼 243
11.5.3 在Node中使用管道 245
11.5.4 管道與命令的執(zhí)行順序 246
11.6 解釋真正的腳本 247
11.7 總結(jié) 247
第 12 章 用Electron征服桌面 248
12.1 認識Electron 248
12.1.1 Electron的技術(shù)!249
12.1.2 界面設(shè)計 250
12.2 創(chuàng)建一個Electron程序 250
12.3 搭建完整的桌面端程序 252
12.3.1 引導React與Babel 253
12.3.2 安裝依賴項 253
12.3.3 設(shè)置Webpack 254
12.4 React程序 255
12.4.1 定義Request組件 256
12.4.2 定義Response組件 258
12.4.3 React組件之間的通信 261
12.5 構(gòu)建與分發(fā) 261
12.5.1 用Electron打包器構(gòu)建程序 261
12.5.2 打包 262
12.6 總結(jié) 263
附錄 A 安裝Node 264
附錄 B 自動化的網(wǎng)絡(luò)抓取 267
附錄 C Connect的官方中間件 277
術(shù)語表 307