阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      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

      目录
      目录