Node.js调用了大量的动态链接库,而其中使用最多的是chrom v8和open ssl,对这两个库了解的越多,对编写node 自定义扩展会有很大的帮助。而本文件针对node.org教程进行翻译,期望对Node.js编写扩展的同学有一个良好的帮助。

在下文中,Addons 将替代Node C/C++扩展函意思

Addons 基本流程回顾

1 . 编写一个C++文件-需要包函数如下内容:所有的Node.js扩展必须导出(export)一个初始化函数

void Initialize(Local<Object> exports);
NODE_MODULE(moudle_name,Initialize);

注意,上面两行代码的顺序是不能变的,NODE_MODULE不是一个函数,详细请见node.h。moudle_name必须匹配二进制文件名。例如,hello.cc初始化函数是 init 并且 Addon的模块名是addon

2. 构建binding.gyp-一旦源代码编写完成,它必须编译成像addon.node这类二进制文件。为了完成这件任务,需要在项目的顶层目录创建一个binding.gyp用JSON-like的格式描述你的扩展模块构配置。这个文件通常由专门编译C/C++扩展模块的 node-gyp 工具执行。binding.gyp的格式如下:

{
  "targets":[
    {
      "target_name":"module_name",
      "sources":["C++ file name"]
    }
  ]
}

关于node-gyp安装教程,请见‘node-gyp installation instruction’

3 . 应用node-gyp构建.node文件-使用node-gyp命令后,自动构建出build/Release目录下的.node文件

//写法1.单条一次配置构建完成
node-gyp configure build

//写法2.分两次执行完成
node-gyp configure
node-gyp build

构建Node.js的C/C++扩展的依赖注意事项 

在Linux下构建Node Addon时,使用的是Clion,会自动导入系统的依赖。

  • 当使用node-gyp运行,它將检测特定的Node.js的版本并且下载完整的源文件或头文件。如果完整下载源代码,Addons将完整访问Node.js的依赖集。但是,如果只是下载Node.js的头文件,将只是使用Node.js的导出的类型。
  • nodedir——node-gyp 在运行时调用–nodedir标志指出本地源代码的路径。这个参数,Addons将可以完整访问依赖集。

加载Addons调用require()

编译的文件扩展名为’.node’(实质是.dll.so文件).’require()’函数在写起来就像是’.node’文件扩展和初始化与这些动态链接库。当调用require(),’.node’扩展将会被调用。Node.js将找到并初始化Addon。一旦执行完成,该模块将加载完成。

Native Abstractions for Node.js(对Node.js的原生抽象)

每个实例说明本文档中直接使用的Node.js API和V8实现Addons。这是了解V8引擎API,具有重要的、戏剧性的从一个V8发布到下一个改变(和一个专业的Node.js发布到下一个)。 每一次改变,Addons需要更新并重新编译才能继续运行并实现Addons的功能。 Node.js的发布时间表,目的是尽量减少频率。这种变化的影响,Node.js可以确保V8引擎API的稳定性。

nan提供一个能在V8和Node.js的旧新版本之间保持兼容性的工具集。 示例展示了如果使用nan