Node.js:来一打 C++ 扩展
  • 推荐2
  • 收藏5
  • 浏览1.6K

Node.js:来一打 C++ 扩展

死月 (作者) 

  • 书  号:978-7-121-33642-3
  • 出版日期:2018-06-19
  • 页  数:480
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 维护人:刘皎
纸质版 ¥109.00
本书讲解了如何在 Node.js 上写 C++ 的原生模块以供使用,包括且不仅限于一些 API 和原理的介绍,但是不包括 Node.js 的基础入门知识(如语法等)。目标是读者能用 C++ 写出 Node.js 原生模块来提高开发和运行效率。



本书以 Chrome V8 的知识作为基础,配合 GYP 的一些内容,将教会大家如何使用 Node.js
提供的一些 API 来编写其 C++ 的原生扩展。此外,还介绍了原生抽象NAN 以及与异步相关的 libuv 知识,最后辅以几个实例来加深理解。
阅读本书,相当于同时学习Chrome V8 开发、libuv 开发以及 Node.js 的原生 C++ 扩展开发知识,物超所值!
本书作者死月是Node.js 核心贡献者(Node.js Core Collaborator)之一,CNode 社区版主之一,杭州 Node Party 组织者之一,曾任大搜车无线架构组 Node.js 团队负责人;浙江大学工程硕士,退役 OI、ACM 选手。
序一
1995 年Brendan Eich 花了10 天时间开发出了一门脚本语言,用来弥补Java Applet 的不足,随后Marc Andreessen 给它起名为Mocha。其最初的定位是,Java 用于大型专业级开发,而Mocha 则是给测试脚本编写人员、业余爱好者、设计师使用的。1995 年5 月,Mocha 被集成到了Netscape 浏览器中,其不久后改名为LiveScript,当年年
底网景公司和Sun 公司达成协议并获得了Java 商标的使用权,其正式更名为JavaScript。有人说Sun 公司的介入限制了Brendan Eich 的手脚。JavaScript 除了某些语法和Java 类似以外,骨子里却是完全不一样的东西。也有人说正式改名为JavaScript 才使得这门语言成为浏览器执行的唯一语言。时至今日JavaScript 已经不仅仅局限于为网页做特效了,而真正发展成为一门全功能的编程语言:
? 2008 年Chrome 发布、V8 发布;
? 2009 年Node.js 发布;
? 2010 年NPM 发布;
? 2014 年12 月,多位核心Node.js 开发者不满于Joyent 对Node.js 的管理制度,创建了io.js;
? 2015 年初Node.js 基金会成立;
? 2015 年9 月Node.js 4.0 发布,Node.js 和io.js 正式合并。
Node.js 4.0 版引入了ES6 的语言特性和“长期支持版本”的发布周期。
如今Node.js 社区已经成为最活跃的编程社区之一,而从NPM 的包数量来看,其已经超越了Java 的Manven、Ruby 的gem、PHP 的composer。
但是Node.js 仍有很多不足之处,Node.js 的使用者绝大部分仅仅把Node.js 作为前端开发的辅助工具。大家把Node.js 作为后端主力开发平台使用时,遇到CPU 密集的场景时又不得不借助Java 或者Go。虽然V8 引擎一直致力于让JavaScript 运行得更快,但是和Java、C++ 相比,还有不小的性能差距。
虽然关于JavaScript 的书已经汗牛充栋,但是有关Node.js 原理的书却屈指可数。而目前真正能够深入介绍原理的,国内的图书中也只有朴灵的《深入浅出Node.js》了,但如今四五年过去了依然没有等到该书的第2 版,而死月的这本书却可以弥补这一方面的不足。
所有的编程语言底层都会回归C/C++,Node.js 的底层依赖库V8 使用C++ 开发,libuv 则使用C 语言。而使用C++ 开发Node.js 扩展将直接把擅长CPU 的C++ 和擅长I/O 的Node.js结合在了一起,弥补了JavaScript 在计算密集型应用方面的不足。
我从2015 年开始研究V8,认识死月的时间则更早。死月不仅仅精通C++,他也是国内的Node.js 布道师之一。从我认识他起,他就一直在使用Node.js。如果你想深入了解Node.js 的原理,或者想打开Node.js 另一个世界的大门,这本《Node.js:来一打C++ 扩展》值得你精读。
——迷渡(justjavac),Flarum 中文社区创始人,国内知名前端技术专家
2018 年3 月22 日于天津

序二
我跟死月相识于GitHub,那时我们经常会向Node.js 贡献一些代码,彼此也会在微信上讨论一些技术问题。当我听说死月在写一本关于Node.js C++ 扩展相关的图书时,激动得几乎要从床上蹦起来。因为我深知一个对Node.js 与V8 引擎都如此了解之人,愿意将他所知所想分享出来,这将是给予社区的一份大礼。
从我个人的角度来看,这本书非常适合这类开发者:他们对于Node.js 的使用已经了然于胸,但却苦于没有底层开发经验,对整个V8 虚拟机也一知半解。这时,他们可以从第3 章开始读起。本书用了很长的篇幅介绍JavaScript 代码究竟在虚拟机里是怎么运行的,它们又都分别对应着哪一类数据结构等。因为作者深知,只有把这些基础理解透了,则无论是开发C++ 扩展,还是写纯JavaScript 代码,大家都能更得心应手。
本书像是在述说着Node.js 在C++ 扩展这一课题中曲折而又有趣的历史进程。首先从最原始的V8 API 时代开始。对于每个原始时代,开发者最痛苦的莫过于解决各种版本的兼容问题。之后迎来的是NAN 时代。它解决了原始时代的接口抽象问题,接口也更丰富多样,异步接口也封装在内。最后,是还在路上的N-API。它与NAN 一脉相承,拥有更官方的支持和更友好的接口。
另外,我们通常在写一个C++ 扩展时,多数情况下会跟异步打交道,这其中包含着如何非阻塞地调用底层接口,如何将异步的结果返回到JavaScript 的回调函数中,以及如何正确地在异步封装中释放你的资源。对这些内容特别感兴趣的读者,可以打开第6 章一睹为快。
Node.js 已快走完它的第一个10 年,尽管被人诟病于其回调地狱、虚假繁荣、超高并发场景下的不适应性,以及低端设备上的内存等问题,但这仍旧无法阻止它前进的步伐。然而对于我们Node.js 工程师来说,除了掌握好这门语言之外,学习如何写C++ 扩展、了解它如何运转将是我们下一阶段的重要功课。相信《Node.js:来一打C++ 扩展》将会成为常伴大家左右的另一本《代码大全》。
——刘亚中(Yorkie),Rokid 系统工程师,tensorflow-nodejs 作者
2018 年3 月22 日于杭州

目录

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++ 模块本质 / 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
XXII Node.js:来一打C++ 扩展
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 参考资料v455

读者评论

  • 第6个扩展我终于编译过啦,✌️!!!

    RonnyChan发表于 2022/11/8 14:07:45
  • 124页中在第三行到第四中应该是析构函数,不是构造函数

    geekknight发表于 2018/7/26 14:52:36

相关博文

  • Chrome V8 与 Node.js

    Chrome V8 与 Node.js

    管理员账号 2018-06-28

    从某种意义上来说,Node.js 并不是一个从零开始编写的 JavaScript 运行时,它其实也是站在“巨人的肩膀”上进行了一系列的拼凑和封装得到的结果。它的高效离不开一些很牛的第三方程序和类库。本文选自《Node.js:来一打 C...

    管理员账号 2018-06-28
    1579 0 0 0

相关图书

高可靠系统构建指南:服务稳定性建设与技术债务治理

本书以服务稳定性建设与技术债务治理为主线,深度剖析 Java 服务全生命周期中的关键问题与解决方案,通过“问题诊断-治理框架-实践落地”的三层递进结构,构建了覆...

 

算法训练营:进阶篇(全彩版)

《算法训练营:进阶篇(全彩版)》图文并茂、通俗易懂,详细讲解数据结构和算法进阶知识,并融入大量的竞赛实例和解题技巧,可帮助读者领悟数据结构和算法的精髓,并熟练应...

 

算法训练营:入门篇(全彩版)

本书图文并茂、通俗易懂,详细讲解常用的算法知识,又融入了大量的竞赛实例和解题技巧,可帮助读者熟练应用各种算法解决实际问题。 本书总计9章。第1章讲解C++基础...

 

亿级流量系统架构设计与实战

李琛轩 (作者)

本书涵盖了亿级用户应用后台通用的技术和系统架构设计思路,在内容结构上分为三大篇:架构知识篇(第1~3章),作为全书的基础知识篇,首先介绍后台的关键组件构成以及机...

 

算法笔记(第2版)

刁瑞 谢妍 (作者)

ChatGPT掀起了现象级的风暴,赶超ChatGPT潮流,算法突破是关键。 本书介绍了若干常见算法,涉及排序、哈希、动态规划与近似算法、高斯消去法、图论与线性...

 

看漫画学Python:有趣、有料、好玩、好用(全彩修订版)

关东升 著 赵大羽 绘 (作者)

ython是一门既简单又强大的编程语言,被广泛应用于数据分析、大数据、网络爬虫、自动化运维、科学计算和人工智能等领域。Python也越来越重要,成为国家计算机等...