当源代码已被编写,它必须被编译成二进制 addon.node 文件。 要做到这点,需在项目的顶层创建一个名为 binding.gyp 的文件,它使用一个类似 JSON 的格式来描述模块的构建配置。 该文件会被 [node-gyp](一个用于编译 Node.js 插件的工具)使用。

    1. {
    2. "targets": [
    3. {
    4. "target_name": "addon",
    5. "sources": [ "hello.cc" ]
    6. }
    7. ]
    8. }

    Node.js 会捆绑与发布一个版本的 node-gyp 工具作为 npm 的一部分。 该版本不可以直接被开发者使用,仅为了支持使用 npm install 命令编译与安装插件的能力。 需要直接使用 node-gyp 的开发者可以使用 npm install -g node-gyp 命令进行安装。 查看 node-gyp [安装说明][installation instructions]了解更多信息,包括平台特定的要求。

    binding.gyp 文件已被创建,使用 node-gyp configure 为当前平台生成相应的项目构建文件。 这会在 build/ 目录下生成一个 Makefile 文件(在 Unix 平台上)或 vcxproj 文件(在 Windows 上)。

    下一步,调用 node-gyp build 命令生成编译后的 addon.node 的文件。 它会被放进 build/Release/ 目录。

    当使用 npm install 安装一个 Node.js 插件时,npm 会使用自身捆绑的 node-gyp 版本来执行同样的一套动作,为用户要求的平台生成一个插件编译后的版本。

    当构建完成时,二进制插件就可以在 Node.js 中被使用,通过 [require()][require] 构建后的 addon.node 模块:

    1. // hello.js
    2. const addon = require('./build/Release/addon');
    3. console.log(addon.hello());
    4. // 打印: 'world'

    因为编译后的二进制插件的确切路径取决于它如何被编译(比如有时它可能在 ./build/Debug/ 中),所以插件可以使用 [bindings] 包加载编译后的模块。

    虽然 bindings 包在如何定位插件模块的实现上更复杂,但它本质上使用了一个 try…catch 模式,类似如下:

    1. try {
    2. return require('./build/Release/addon.node');
    3. } catch (err) {
    4. return require('./build/Debug/addon.node');
    5. }