本書講解了如何在 Node.js 上寫 C++ 的原生模塊以供使用,包括且不僅限于一些 API 和原理的介紹,但是不包括 Node.js 的基礎(chǔ)入門知識(shí)(如語法等)。目標(biāo)是讀者能用 C++ 寫出 Node.js 原生模塊來提高開發(fā)和運(yùn)行效率。
朱凱迪,花名“死月”,國內(nèi)早期 Node.js 開發(fā)者之一,現(xiàn)為Node.js Collaborator(核心貢獻(xiàn)者)之一。擅造輪子,包括Node.js的C++擴(kuò)展。
1 Node.js 的 C++ 擴(kuò)展前驅(qū)知識(shí)儲(chǔ)備 / 1
1.1 Node.js 的模塊機(jī)制 / 2
1.1.1 CommonJS 的模塊規(guī)范 / 2
1.1.2 Node.js 的模塊 / 4
1.1.3 小結(jié) / 9
1.1.4 參考資料 / 9
1.2 Node.js 的包機(jī)制 / 9
1.2.1 CommonJS 的包規(guī)范 / 9
1.2.2 Node.js / NPM 下的包 / 13
1.2.3 NPM 與 CNPM / 16
1.2.4 小結(jié) / 19
1.2.5 參考資料 / 19
1.3 Node.js 依賴簡介 / 20
1.3.1 Chrome V8 / 20
1.3.2 libuv / 25
1.3.3 其他依賴 / 28
1.3.4 小結(jié) / 30
1.3.5 參考資料 / 30
1.4 C++ 擴(kuò)展開發(fā)的準(zhǔn)備工作 / 31
1.4.1 編輯器 / IDE / 31
1.4.2 node-gyp / 36
1.4.3 其他構(gòu)建工具 / 54
1.4.4 小結(jié) / 56
1.4.5 參考資料 / 56
2 C++ 模塊原理簡析 / 57
2.1 為什么要寫 C++ 模塊 / 57
2.1.1 C++ 比 JavaScript 解釋器高效 / 57
2.1.2 已有的 C++ 輪子 / 72
2.1.3 小結(jié) / 77
2.1.4 參考資料 / 77
2.2 什么是 C++ 擴(kuò)展 / 78
2.2.1 C++ 模塊本質(zhì) / 80
2.2.3 小結(jié) / 102
2.2.4 參考資料 / 103
3 Chrome V8 基礎(chǔ) / 104
3.1 Node.js 與 Chrome V8 / 104
3.2 基本概念 / 105
3.2.1 內(nèi)存機(jī)制 / 105
3.2.2 隔離實(shí)例(Isolate) / 108
3.2.3 上下文(Context) / 109
3.2.4 腳本(Script) / 110
3.2.5 小結(jié) / 110
3.2.6 參考資料 / 111
3.3 句柄(Handle / 111
3.3.1 本地句柄(Local) / 112
3.3.2 持久句柄(Persistent) / 115
3.3.3 永生句柄(Eternal) / 119
3.3.4 待實(shí)本地句柄(Maybe Local) / 119
3.3.5 小結(jié) / 121
3.3.6 參考資料 / 121
3.4 句柄作用域 / 121
3.4.1 一般句柄作用域(Handle Scope) / 122
3.4.2 可逃句柄作用域(Escapable Handle Scope) / 125
3.4.3 小結(jié) / 129
3.4.4 參考資料 / 129
3.5 上下文(Context) / 129
3.6 模板(Template) / 133
3.6.1 函數(shù)模板(Function Template) / 133
3.6.2 對象模板(Object Template) / 138
3.6.3 對象模板的訪問器(Accessor)與攔截器(Interceptor) / 144
3.6.4 對象模板的內(nèi)置字段(Internal Field) / 175
3.6.5 函數(shù)模板的繼承(Inherit) / 183
3.6.6 小結(jié) / 188
3.6.7 參考資料 / 189
3.7 常用數(shù)據(jù)類型 / 189
3.7.1 基值(Value) / 189
3.7.2 字符串(String) / 194
3.7.3 數(shù)值類型 / 196
3.7.4 布爾類型(Boolean) / 196
3.7.5 對象(Object) / 196
3.7.6 函數(shù)(Function) / 200
3.7.7 數(shù)組(Array) / 202
3.7.8 JSON 解析器 / 203
3.7.9 函數(shù)回調(diào)信息(Function Callback Info) / 203
3.7.10 函數(shù)返回值(Return Value) / 204
3.7.11 隔離實(shí)例(Isolate) / 204
3.7.12 小結(jié) / 205
3.7.13 參考資料 / 206
3.8 異常機(jī)制. / 206
3.8.1 try-catch / 206
3.8.2 拋出異常 / 209
3.8.3 異常生成類(Exception) / 211
3.8.4 小結(jié) / 211
3.8.5 參考資料 / 211
4 C++ 擴(kuò)展實(shí)戰(zhàn)初探 / 212
4.1 binding.gyp / 212
4.1.1 驚鴻一瞥 / 213
4.1.2 binding.gyp 基礎(chǔ)結(jié)構(gòu) / 213
4.1.3 GYP 文件 / 214
4.1.4 常用字段 / 221
4.1.5 小結(jié) / 228
4.1.6 參考資料 / 228
4.2 牛刀小試. / 229
4.2.1 又是 Hello World / 229
4.2.2 函數(shù)參數(shù) / 232
4.2.3 回調(diào)函數(shù) / 234
4.2.4 函數(shù)返回 / 238
4.2.5 小結(jié) / 239
4.2.6 參考資料 / 240
4.3 循序漸進(jìn) / 240
4.3.1 C++ 與 JavaScript 類封裝 / 240
4.3.2 實(shí)例化 C++ 類封裝對象的函數(shù) / 250
4.3.3 將 C++ 類封裝對象傳來傳去 / 253
4.3.4 進(jìn)程退出鉤子 / 255
4.3.5 小結(jié) / 259
4.3.6 參考資料 / 259
5 Node.js 原生抽象——NAN / 260
5.1 Node.js 原生模塊開發(fā)方式的變遷 / 260
5.1.1 以不變應(yīng)萬變 / 260
5.1.2 時(shí)代在召喚 / 261
5.1.3 小結(jié) / 267
5.1.4 參考資料 / 267
5.2 基礎(chǔ)開發(fā) / 267
5.2.1 什么是 NAN / 267
5.2.2 安裝和配置 / 269
5.2.3 先睹為快——搭上NAN 的快車 / 270
5.2.4 基礎(chǔ)幫助函數(shù)和宏 / 276
5.2.5 忽略 node_modules / 279
5.2.6 小結(jié) / 279
5.2.7 參考資料 / 280
XXII Node.js:來一打C++ 擴(kuò)展
5.3 JavaScript 函數(shù) / 280
5.3.1 函數(shù)參數(shù)類型 / 280
5.3.2 函數(shù)聲明 / 282
5.3.3 函數(shù)設(shè)置 / 288
5.3.4 小結(jié) / 296
5.3.5 參考資料 / 296
5.4 常用幫助類與函數(shù). / 296
5.4.1 句柄相關(guān) / 296
5.4.2 創(chuàng)建數(shù)據(jù)對象 / 298
5.4.3 與數(shù)據(jù)對象“玩耍” / 300
5.4.4 封裝一個(gè)類 / 314
5.4.5 異常處理 / 315
5.4.6 小結(jié) / 315
5.4.7 參考資料 / 316
5.5 NAN 中的異步機(jī)制 / 316
5.5.1 Nan::AsyncQueueWorker / 316
5.5.2 Nan::Callback / 317
5.5.3 Nan::AsyncWorker / 317
5.5.4 Nan::AsyncProgressWorker / 323
5.5.5 小結(jié) / 327
5.5.6 參考資料 . / 327
6 異步之旅——libuv / 328
6.1 基礎(chǔ)概念 / 329
6.1.1 事件循環(huán) / 330
6.1.2 句柄(Handle)與請求(Request) / 333
6.1.3 嘗嘗甜頭 / 335
6.1.4 小結(jié) / 340
6.1.5 參考資料 / 340
6.2 libuv 的跨線程編程基礎(chǔ) / 341
6.2.1 libuv 的線程 / 342
6.2.2 同步原語(Synchronization Primitive) / 347
6.2.3 工作隊(duì)列 / 355
6.2.4 小結(jié) / 356
6.2.5 參考資料 / 357
6.3 跨線程通信 / 357
6.3.1 uv_async_t 句柄 / 357
6.3.2 Watchdog 半成品實(shí)戰(zhàn)解析 / 358
6.3.3 Watchdog 試運(yùn)行 / 367
6.3.4 小結(jié) / 368
6.3.5 參考資料 / 369
7 實(shí)戰(zhàn)——文件監(jiān)視器. / 370
7.1 準(zhǔn)備工作 / 370
7.1.1 功能規(guī)劃 / 370
7.1.2 文件系統(tǒng)監(jiān)聽庫——efsw / 373
7.1.3 小結(jié) / 376
7.1.4 參考資料 / 376
7.2 核心設(shè)計(jì) / 376
7.2.1 API 設(shè)計(jì) . / 377
7.2.2 EFSWCore 的血肉之軀 / 377
7.2.3 EFSWCore 的靈魂 / 381
7.2.4 小結(jié) / 385
7.3 編寫JavaScript 類 / 386
7.3.1 類的設(shè)計(jì) / 386
7.3.2 核心邏輯 / 388
7.3.3 簡單容錯(cuò) / 391
7.3.4 小結(jié) / 393
7.4 進(jìn)一步完善 / 393
7.4.1 C++ 代碼的完善 / 393
7.4.2 JavaScript 代碼的完善 / 398
7.4.3 小結(jié) / 400
8 實(shí)戰(zhàn)——現(xiàn)有包剖析 / 401
8.1 字符串哈希模塊——Bling Hashes / 401
8.1.1 文件設(shè)定 / 402
8.1.2 C++ 源碼剖析 / 403
8.1.3 JavaScript 源碼剖析 / 408
8.1.4 小結(jié) / 409
8.1.5 參考資料 / 410
8.2 類 Proxy 包——Auto Object / 410
8.2.1 Proxy / 410
8.2.2 Auto Object 使用范例 / 412
8.2.3 代碼剖析 / 415
8.2.4 小結(jié) / 424
8.2.5 參考資料 / 424
9 N-API——下一代 Node.js C++ 擴(kuò)展開發(fā)方式 / 425
9.1 淺嘗輒止 / 426
9.1.1 實(shí)現(xiàn)一個(gè) Echo 函數(shù) / 426
9.1.2 嘗試運(yùn)行 N-API 擴(kuò)展 / 430
9.1.3 向下兼容 / 431
9.1.4 N-API Package——C++ 封裝 / 433
9.1.5 小結(jié) / 433
9.1.6 參考資料 / 433
9.2 基本數(shù)據(jù)類型與錯(cuò)誤處理 / 433
9.2.1 基本數(shù)據(jù)類型 / 433
9.2.2 與作用域及生命周期相關(guān)的數(shù)據(jù)類型 / 435
9.2.3 回調(diào)數(shù)據(jù)類型 / 438
9.2.4 錯(cuò)誤處理 / 439
9.2.5 模塊注冊 / 441
9.2.6 小結(jié) / . 442
9.2.7 參考資料 / 442
9.3 對象與函數(shù) / 442
9.3.1 對象 / 442
9.3.2 函數(shù) / 448
9.3.3 類的封裝 / 453
9.3.4 小結(jié) / 455
9.3.5 參考資料v455