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

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了