如果想要编写高质量的C/C++扩展模块,还需要深厚的C/C++编程功底才行。除此之外,以下这些条目都是不能避开的,在了解它们后,可以让你在编写过程中事半功倍。
## GYP项目生成工具
在Node 0.6中,第三方模块通过它自身提供的node_waf工具实现编译,但是它是`*nix`平台下的产物,无法实现跨平台编译。在Node 0.8 中,Node决定摒弃掉node_waf而采用跨平台效果更好的项目生成器,它就是GYP工具,即“Generate Your Projects”单词的缩写。它的好处在于,可以帮助你生成各个平台下的项目文件,比如Windows下的Visual Studio解决方案文件(.sln)、Mac下的XCode项目配置文件以及Scons工具。在这个基础上,再动用各个平台下的编译器编译项目。这大大减少了跨平台模块在项目组织上的精力投入。
Node源码中一度出现过各种项目文件,后来均统一为GYP工具。这除了可以减少编写跨平台项目文件的工作量外,另一个简单的原因就是Node自身的源码就是通过GYP编译的。为此,Nathan Rajlich基于GYP为Node提供了一个专有的扩展构建工具node-gyp,这个工具通过 `npm install -g node-gyp` 这个命令即可安装。
## V8引擎C++库
V8是Node自身的动力来源之一。它自身由C++写成,可以实现JavaScript与C++的互相调用。
## libuv库
它是Node自身的动力来源之二。Node能够实现跨平台的一个诀窍就是它的libuv库,这个库是跨平台的一层封装,通过它去调用一些底层操作,比自己在各个平台下编写实现要高效的多。libuv封装的功能包括事件循环、文件操作等。
## Node内部库
写C++模块时,免不了要做一些面向对象编程工作,而Node自身提供了一些C++代码,比如node::ObjectWrap类可以用来包装你的自定义类,它可以帮助实现对象回收等工作。
## 其它库
其它存在deps目录下的库在编写扩展模块时也许可以帮助你,比如zlib、openssl、http_parser等。
- 目录
- 第1章 Node 简介
- 1.1 Node 的诞生历程
- 1.2 Node 的命名与起源
- 1.2.1 为什么是 JavaScript
- 1.2.2 为什么叫 Node
- 1.3 Node给JavaScript带来的意义
- 1.4 Node 的特点
- 1.4.1 异步 I/O
- 1.4.2 事件与回调函数
- 1.4.3 单线程
- 1.4.4 跨平台
- 1.5 Node 的应用场景
- 1.5.1 I/O 密集型
- 1.5.2 是否不擅长CPU密集型业务
- 1.5.3 与遗留系统和平共处
- 1.5.4 分布式应用
- 1.6 Node 的使用者
- 1.7 参考资源
- 第2章 模块机制
- 2.1 CommonJS 规范
- 2.1.1 CommonJS 的出发点
- 2.1.2 CommonJS 的模块规范
- 2.2 Node 的模块实现
- 2.2.1 优先从缓存加载
- 2.2.2 路径分析和文件定位
- 2.2.3 模块编译
- 2.3 核心模块
- 2.3.1 JavaScript核心模块的编译过程
- 2.3.2 C/C++核心模块的编译过程
- 2.3.3 核心模块的引入流程
- 2.3.4 编写核心模块
- 2.4 C/C++扩展模块
- 2.4.1 前提条件
- 2.4.2 C/C++扩展模块的编写
- 2.4.3 C/C++扩展模块的编译
- 2.4.2 C/C++扩展模块的加载
- 2.5 模块调用栈
- 2.6 包与NPM
- 2.6.1 包结构
- 2.6.2 包描述文件与NPM
- 2.6.3 NPM常用功能
- 2.6.4 局域NPM
- 2.6.5 NPM潜在问题
- 2.7 前后端共用模块
- 2.7.1 模块的侧重点
- 2.7.2 AMD规范
- 2.7.3 CMD规范
- 2.7.4 兼容多种模块规范
- 2.8 总结
- 2.9 参考资源
- 第3章 异步I/O
- 3.1 为什么要异步I/O
- 3.1.1 用户体验
- 3.1.2 资源分配
- 3.2 异步I/O实现现状
- 3.2.1 异步I/O与非阻塞I/O
- 3.2.2 理想的非阻塞异步I/O
- 3.2.3 现实的异步I/O
- 3.3 Node的异步I/O
- 3.3.1 事件循环
- 3.3.2 观察者
- 3.3.3 请求对象
- 3.3.4 执行回调
- 3.3.5 小结
- 3.4 非I/O的异步API
- 3.4.1 定时器
- 3.5 事件驱动与高性能服务器