私はクラスの束を持っているnode.jsアドオンを作成しています。階層的な名前空間でそれらを整理したいと思います。私はJavaScriptでこれをやっていたならば、それは私が私のバインディングのNode.jsを書くためにナンを使用しています。このnode.js addonに名前空間階層を作成する方法は?
var com = function() {};
com.example = function() {};
com.example.Person = function() {};
var p = new com.example.Person();
ようになります。
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のメンバーとして定義することが推奨される方法でない場合は、それを達成する正しい方法は何ですか?何か案は?