1.创建一个hello.cc的源代码文件
这里是在根目录下创建的hello.cc
文件,其它目录都可以,只需要与下面的 binding.gyp
文件配置的sources
数组里面的内容对应就行)
#include <node.h>
namespace demo {
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
void Method(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
args.GetReturnValue().Set(String::NewFromUtf8(
isolate, "world").ToLocalChecked());
}
void Initialize(Local<Object> exports) {
NODE_SET_METHOD(exports, "hello", Method);
}
NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)
} // namespace demo
复制代码
2.在根目录下创建binding.gyp文件
编写源代码后,必须将其编译为二进制 addon.node
文件。 为此,请在项目的顶层创建名为 binding.gyp
的文件,使用类似 JSON 的格式描述模块的构建配置。 该文件由 node-gyp 使用,这是一个专门为编译 Node.js 插件而编写的工具
{
"targets": [
{
"target_name": "addon", #最终生成的.node文件名
"sources": [ "hello.cc" ] #需要编译的cc文件
}
]
}
复制代码
复制的时候请把中文注释去掉,不然后面编译要报错。
3.安装node-gyp
node-gyp
实用工具的一个版本作为 npm
的一部分与 Node.js 捆绑和分发。 此版本不直接提供给开发人员使用,仅旨在支持使用 npm install
命令编译和安装插件的能力。 希望直接使用 node-gyp
的开发人员需要先安装
npm install -g node-gyp
复制代码
4.生成项目的构建文件
创建 binding.gyp
文件后,使用
node-gyp configure
复制代码
为当前平台生成适当的项目构建文件,这将在 build/
目录中生成 Makefile
(在 Unix 平台上)或 vcxproj
文件(在 Windows 上)
5.生成.node文件并使用
最后,调用
node-gyp build
复制代码
命令生成编译后的 addon.node
文件。 这将被放入 build/Release/
目录.
当使用 npm install
安装 Node.js 插件时,npm 使用它自己的 node-gyp
捆绑版本来执行相同的一组操作,按需为用户平台生成插件的编译版本(不懂这句话啥意思)
构建完成后,可以通过将 require()
指向构建的 addon.node
模块在 Node.js 中使用二进制插件,我们新建一个hello.js
文件来进行测试
// hello.js
const addon = require('./build/Release/addon');
console.log(addon.hello());
// 打印: 'world'
复制代码
6. 使用绑定包来加载模块
在Node的插件历史过程中,插件最终会在各种不同的位置进行编译,具体取决于使用的构建工具和Node版本。更糟糕的是,现在gyp构建工具可以生成Release
或Debug
构建,每个构建都构建在不同的位置。
可以使用绑定bindings
包来加载已经编译个模块,用来帮助你加载你自己的模块的帮助模块此模块检查将在其中构建本机插件的 所有 可能位置,并返回第一个成功加载的位置
安装
npm install --save bindings
复制代码
也可以添加它到package.json
文件中dependencies
中
安装完成后,我们可以通过这样的方式在hello.js
进行使用
require()
为当前节点版本,平台和体系结构提供正确的绑定文件非常简单
const addon = require('bindings')('hello.node')
console.log(addon.hello());
// 打印: 'world'
复制代码
附
# C++源文件
"sources": [
"./src/greeting.cpp",
"./src/index.cpp"
],
# C++ 头文件目录
"include_dirs": [
"<!@(node -p \"require('node-addon-api').include\")"
],
# 预编译宏
'defines': [
'NAPI_DISABLE_CPP_EXCEPTIONS'
],
# 静态库
'libraries':[]
}
复制代码