0

たくさんのクラスを持つ 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)

たとえば .h

namespace addon {
  class Example : public Nan::ObjectWrap {
    static void Init(v8::Local<v8::Object> exports);
  }
}

たとえば .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);
  }
}

人.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 のメンバーとして定義するための推奨される方法ではない場合、それを達成する正しい方法は何ですか? 何か案は?

4

1 に答える 1