Node.js 来一打 C++ 扩展

Node.js 来一打 C++ 扩展
编辑推荐
适读人群 :本书读者群为有一定 Node.js 基础并且会一些 C++,有过 C++ 原生模块开发经验想系统学习或者并没有开发经验但是想入门的人。
目前市面上的图书多停留在对 Node.js 入门知识的讲解,如果想进一步提升功力,你会发现无书可觅,无秘籍可得!现在,《Node.js:来一打 C++ 扩展》来了,正好可以满足你的刚需——学习完本书,你可以毫无压力地秒变全端高手!打通任督二脉,笑傲江湖!
《Node.js:来一打 C++ 扩展》在深度上远远超过了目前市面上的 Node 书籍。全书自始至终围绕一个主题展开:从介绍 Node.js 的包和模块规范开始,深入解析(包括但不限于剖析 Node.js 自身的源码) Node.js 的模块是如何在运行时被引入的,尤其是如何引入 C++ 模块的;接下来详细讲解了在什么时候、为何要编写 C++ 模块;借此契机,深入介绍了 Node.js 的基石 Chrome V8 和 libuv,以及异步非阻塞的原理——不仅如此,本书更教你如何在底层去驾驭它们。所以,本书以 Node.js 的 C++ 扩展为中心,衍生出对 Node.js 底层风光的层层剖析,最后再回归到如何编写 Node.js 的 C++ 扩展,一气呵成。读来酣畅淋漓,痛快不已!
买这一本书相当于买了 Node.js 的底层风格、 C++ 扩展编写、Chrome V8 和 libuv 三本书!
读完本书后,你甚至能为 Node.js 自身的添砖加瓦做出非凡贡献。
内容简介
Node.js 作为近几年新兴的一种编程运行时,托 V8 引擎的福,在作为后端服务时有比较高的运行效率,在很多场景下对于我们的日常开发足够用了。不过,它还为开发者开了一个使用 C++ 开发 Node.js 原生扩展的口子,让开发者进行项目开发时有了更多的选择。
《Node.js:来一打 C++ 扩展》以 Chrome V8 的知识作为基础,配合 GYP 的一些内容,将教会大家如何使用 Node.js 提供的一些 API 来编写其 C++ 的原生扩展。此外,在后续的进阶章节中,还会介绍原生抽象 NAN 以及与异步相关的 libuv 知识,最后辅以几个实例来加深理解。不过,在学习本书内容之前,希望读者已经具备了初步的 Node.js 以及 C++ 基础。
阅读《Node.js:来一打 C++ 扩展》,相当于同时学习 Chrome V8 开发、libuv 开发以及 Node.js 的原生 C++ 扩展开发知识,非常值得!
目录
-
1 Node.js 的 C++ 扩展前驱知识储备 1
-
1.1 Node.js 的模块机制 2
-
1.1.1 CommonJS 的模块规范 2
-
1.1.2 Node.js 的模块 4
-
1.1.3 小结 9
-
1.1.4 参考资料 9
-
1.2 Node.js 的包机制 9
-
1.2.1 CommonJS 的包规范 9
-
1.2.2 Node.js / NPM 下的包 13
-
1.2.3 NPM 与 CNPM 16
-
1.2.4 小结 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 小结 30
-
1.3.5 参考资料 30
-
1.4 C++ 扩展开发的准备工作 31
-
1.4.1 编辑器 / IDE 31
-
1.4.2 node-gyp 36
-
1.4.3 其他构建工具 54
-
1.4.4 小结 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 小结 77
-
2.1.4 参考资料 77
-
2.2 什么是 C++ 扩展 78
-
2.2.1 C++ 模块本质 78
-
2.2.2 Node.js 模块加载原理 80
-
2.2.3 小结 102
-
2.2.4 参考资料 103
-
3 Chrome V8 基础 104
-
3.1 Node.js 与 Chrome V8 104
-
3.2 基本概念 105
-
3.2.1 内存机制 105
-
3.2.2 隔离实例(Isolate) 108
-
3.2.3 上下文(Context) 109
-
3.2.4 脚本(Script) 110
-
3.2.5 小结 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 待实本地句柄(Maybe Local) 119
-
3.3.5 小结 121
-
3.3.6 参考资料 121
-
3.4 句柄作用域 121
-
3.4.1 一般句柄作用域(Handle Scope) 122
-
3.4.2 可逃句柄作用域(Escapable Handle Scope) 125
-
3.4.3 小结 129
-
3.4.4 参考资料 129
-
3.5 上下文(Context) 129
-
3.6 模板(Template) 133
-
3.6.1 函数模板(Function Template) 133
-
3.6.2 对象模板(Object Template) 138
-
3.6.3 对象模板的访问器(Accessor)与拦截器(Interceptor) 144
-
3.6.4 对象模板的内置字段(Internal Field) 175
-
3.6.5 函数模板的继承(Inherit) 183
-
3.6.6 小结 188
-
3.6.7 参考资料 189
-
3.7 常用数据类型 189
-
3.7.1 基值(Value) 189
-
3.7.2 字符串(String) 194
-
3.7.3 数值类型 196
-
3.7.4 布尔类型(Boolean) 196
-
3.7.5 对象(Object) 196
-
3.7.6 函数(Function) 200
-
3.7.7 数组(Array) 202
-
3.7.8 JSON 解析器 203
-
3.7.9 函数回调信息(Function Callback Info) 203
-
3.7.10 函数返回值(Return Value) 204
-
3.7.11 隔离实例(Isolate) 204
-
3.7.12 小结 205
-
3.7.13 参考资料 206
-
3.8 异常机制 206
-
3.8.1 try-catch 206
-
3.8.2 抛出异常 209
-
3.8.3 异常生成类(Exception) 211
-
3.8.4 小结 211
-
3.8.5 参考资料 211
-
4 C++ 扩展实战初探 212
-
4.1 binding.gyp 212
-
4.1.1 惊鸿一瞥 213
-
4.1.2 binding.gyp 基础结构 213
-
4.1.3 GYP 文件 214
-
4.1.4 常用字段 221
-
4.1.5 小结 228
-
4.1.6 参考资料 228
-
4.2 牛刀小试 229
-
4.2.1 又是 Hello World 229
-
4.2.2 函数参数 232
-
4.2.3 回调函数 234
-
4.2.4 函数返回 238
-
4.2.5 小结 239
-
4.2.6 参考资料 240
-
4.3 循序渐进 240
-
4.3.1 C++ 与 JavaScript 类封装 240
-
4.3.2 实例化 C++ 类封装对象的函数 250
-
4.3.3 将 C++ 类封装对象传来传去 253
-
4.3.4 进程退出钩子 255
-
4.3.5 小结 259
-
4.3.6 参考资料 259
-
5 Node.js 原生抽象——NAN 260
-
5.1 Node.js 原生模块开发方式的变迁 260
-
5.1.1 以不变应万变 260
-
5.1.2 时代在召唤 261
-
5.1.3 小结 267
-
5.1.4 参考资料 267
-
5.2 基础开发 267
-
5.2.1 什么是 NAN 267
-
5.2.2 安装和配置 269
-
5.2.3 先睹为快——搭上 NAN 的快车 270
-
5.2.4 基础帮助函数和宏 276
-
5.2.5 忽略 node_modules 279
-
5.2.6 小结 279
-
5.2.7 参考资料 280
-
5.3 JavaScript 函数 280
-
5.3.1 函数参数类型 280
-
5.3.2 函数声明 282
-
5.3.3 函数设置 288
-
5.3.4 小结 296
-
5.3.5 参考资料 296
-
5.4 常用帮助类与函数 296
-
5.4.1 句柄相关 296
-
5.4.2 创建数据对象 298
-
5.4.3 与数据对象“玩耍” 300
-
5.4.4 封装一个类 314
-
5.4.5 异常处理 315
-
5.4.6 小结 315
-
5.4.7 参考资料 316
-
5.5 NAN 中的异步机制 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 小结 327
-
5.5.6 参考资料 327
-
6 异步之旅——libuv 328
-
6.1 基础概念 329
-
6.1.1 事件循环 330
-
6.1.2 句柄(Handle)与请求(Request) 333
-
6.1.3 尝尝甜头 335
-
6.1.4 小结 340
-
6.1.5 参考资料 340
-
6.2 libuv 的跨线程编程基础 341
-
6.2.1 libuv 的线程 342
-
6.2.2 同步原语(Synchronization Primitive) 347
-
6.2.3 工作队列 355
-
6.2.4 小结 356
-
6.2.5 参考资料 357
-
6.3 跨线程通信 357
-
6.3.1 uv_async_t 句柄 357
-
6.3.2 Watchdog 半成品实战解析 358
-
6.3.3 Watchdog 试运行 367
-
6.3.4 小结 368
-
6.3.5 参考资料 369
-
7 实战——文件监视器 370
-
7.1 准备工作 370
-
7.1.1 功能规划 370
-
7.1.2 文件系统监听库——efsw 373
-
7.1.3 小结 376
-
7.1.4 参考资料 376
-
7.2 核心设计 376
-
7.2.1 API 设计 377
-
7.2.2 EFSWCore 的血肉之躯 377
-
7.2.3 EFSWCore 的灵魂 381
-
7.2.4 小结 385
-
7.3 编写 JavaScript 类 386
-
7.3.1 类的设计 386
-
7.3.2 核心逻辑 388
-
7.3.3 简单容错 391
-
7.3.4 小结 393
-
7.4 进一步完善 393
-
7.4.1 C++ 代码的完善 393
-
7.4.2 JavaScript 代码的完善 398
-
7.4.3 小结 400
-
8 实战——现有包剖析 401
-
8.1 字符串哈希模块——Bling Hashes 401
-
8.1.1 文件设定 402
-
8.1.2 C++ 源码剖析 403
-
8.1.3 JavaScript 源码剖析 408
-
8.1.4 小结 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 小结 424
-
8.2.5 参考资料 424
-
9 N-API——下一代 Node.js C++ 扩展开发方式 425
-
9.1 浅尝辄止 426
-
9.1.1 实现一个 Echo 函数 426
-
9.1.2 尝试运行 N-API 扩展 430
-
9.1.3 向下兼容 431
-
9.1.4 N-API Package——C++ 封装 433
-
9.1.5 小结 433
-
9.1.6 参考资料 433
-
9.2 基本数据类型与错误处理 433
-
9.2.1 基本数据类型 433
-
9.2.2 与作用域及生命周期相关的数据类型 435
-
9.2.3 回调数据类型 438
-
9.2.4 错误处理 439
-
9.2.5 模块注册 441
-
9.2.6 小结 442
-
9.2.7 参考资料 442
-
9.3 对象与函数 442
-
9.3.1 对象 442
-
9.3.2 函数 448
-
9.3.3 类的封装 453
-
9.3.4 小结 455
-
9.3.5 参考资料 455