如何在 node.js 插件中创建命名空间层次结构?
How to create namespace hierarchy in node.js addon?
我正在创建一个 node.js 插件,其中有一堆 类。我想在分层命名空间中组织它们。如果我在 Javascript 中这样做,它将看起来像这样
var com = function() {};
com.example = function() {};
com.example.Person = function () {};
var p = new com.example.Person();
我正在使用 Nan 编写我的 node.js 绑定。为了实现上述结果,我编写了如下代码:
com.h
namespace addon {
void init(Local<Object> exports);
}
com.cpp
void addon::init(Local<Object> exports)
{
addon::Example::Init(exports);
}
NODE_MODULE(com, com::init)
example.h
namespace addon {
class Example : public Nan::ObjectWrap {
static void Init(v8::Local<v8::Object> exports);
}
}
example.cpp
void addon::Example::Init(v8::Local<v8::Object> exports) {
// Prepare constructor template
v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
tpl->SetClassName(Nan::New("example").ToLocalChecked());
tpl->InstanceTemplate()->SetInternalFieldCount(1);
addon::Person::Init(tpl);
constructor.Reset(tpl->GetFunction());
}
person.h
namespace addon {
class Person : public Nan::ObjectWrap {
static void Init(v8::Local<v8::FunctionTemplate> exports);
}
}
person.cpp
void addon::Person::Init(v8::Local<v8::FunctionTemplate> nmspace) {
Nan::HandleScope scope;
// Prepare constructor template
v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
tpl->SetClassName(Nan::New("Person").ToLocalChecked());
tpl->InstanceTemplate()->SetInternalFieldCount(1);
// Prototype
// ...
constructor.Reset(tpl->GetFunction());
nmspace->Set(Nan::New("Person").ToLocalChecked(), tpl->GetFunction()); // XXXXXX
}
此代码在 运行 时编译并成功通过了测试。但是加载插件时我收到警告。
(node) v8::FunctionTemplate::Set() with non-primitive values is deprecated
(node) and will stop working in the next major release.
它打印堆栈跟踪。此跟踪的顶部位于标记为 XXXXXX
.
的行
如果这不是将 FunctionTemplate 定义为另一个 FunctionTemplate 的成员的推荐方法,那么实现它的正确方法是什么?有什么想法吗?
我找到了一个简单的方法来做到这一点。我突然想到我可以用下面的 Javascript 代码实现同样的事情。
var com = {};
com.example = {};
com.example.Person = function () {};
var p = new com.example.Person();
所以我发现完全没有必要为Example定义一个ObjectWrap class。相反,我将它定义为一个简单的对象
v8::Isolate *isolate = v8::Isolate::GetCurrent();
v8::Handle<Object> example = v8::Object::New(isolate);
然后像这样传给Person::Init()
void addon::Person::Init(v8::Local<v8::Object> nmspace) {
// ...
nmspace->Set(Nan::New("Person").ToLocalChecked(), tpl->GetFunction());
}
生成的代码没有任何警告或错误。
我正在创建一个 node.js 插件,其中有一堆 类。我想在分层命名空间中组织它们。如果我在 Javascript 中这样做,它将看起来像这样
var com = function() {};
com.example = function() {};
com.example.Person = function () {};
var p = new com.example.Person();
我正在使用 Nan 编写我的 node.js 绑定。为了实现上述结果,我编写了如下代码:
com.h
namespace addon {
void init(Local<Object> exports);
}
com.cpp
void addon::init(Local<Object> exports)
{
addon::Example::Init(exports);
}
NODE_MODULE(com, com::init)
example.h
namespace addon {
class Example : public Nan::ObjectWrap {
static void Init(v8::Local<v8::Object> exports);
}
}
example.cpp
void addon::Example::Init(v8::Local<v8::Object> exports) {
// Prepare constructor template
v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
tpl->SetClassName(Nan::New("example").ToLocalChecked());
tpl->InstanceTemplate()->SetInternalFieldCount(1);
addon::Person::Init(tpl);
constructor.Reset(tpl->GetFunction());
}
person.h
namespace addon {
class Person : public Nan::ObjectWrap {
static void Init(v8::Local<v8::FunctionTemplate> exports);
}
}
person.cpp
void addon::Person::Init(v8::Local<v8::FunctionTemplate> nmspace) {
Nan::HandleScope scope;
// Prepare constructor template
v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
tpl->SetClassName(Nan::New("Person").ToLocalChecked());
tpl->InstanceTemplate()->SetInternalFieldCount(1);
// Prototype
// ...
constructor.Reset(tpl->GetFunction());
nmspace->Set(Nan::New("Person").ToLocalChecked(), tpl->GetFunction()); // XXXXXX
}
此代码在 运行 时编译并成功通过了测试。但是加载插件时我收到警告。
(node) v8::FunctionTemplate::Set() with non-primitive values is deprecated
(node) and will stop working in the next major release.
它打印堆栈跟踪。此跟踪的顶部位于标记为 XXXXXX
.
如果这不是将 FunctionTemplate 定义为另一个 FunctionTemplate 的成员的推荐方法,那么实现它的正确方法是什么?有什么想法吗?
我找到了一个简单的方法来做到这一点。我突然想到我可以用下面的 Javascript 代码实现同样的事情。
var com = {};
com.example = {};
com.example.Person = function () {};
var p = new com.example.Person();
所以我发现完全没有必要为Example定义一个ObjectWrap class。相反,我将它定义为一个简单的对象
v8::Isolate *isolate = v8::Isolate::GetCurrent();
v8::Handle<Object> example = v8::Object::New(isolate);
然后像这样传给Person::Init()
void addon::Person::Init(v8::Local<v8::Object> nmspace) {
// ...
nmspace->Set(Nan::New("Person").ToLocalChecked(), tpl->GetFunction());
}
生成的代码没有任何警告或错误。