如何在“node-gyp rebuild”中声明“'NewInstance'已被弃用”警告? v8中NewInstance的替代select是什么?

你好V8程序员和节点gyp'ers。 我正在运行OS X 10.12.6 ,使用npm v3.10.10nan v2.6.2gcc作为XCode的一部分使用此版本输出运行的Node v6.11.1

 $ > gcc --version Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 8.1.0 (clang-802.0.42) Target: x86_64-apple-darwin16.7.0 Thread model: posix 

请帮我理解如何正确使用NewInstance并消除在我的自定义软件包安装的npm installnode-gyp rebuild过程中的警告?

 > node-gyp rebuild CXX(target) Release/obj.target/cellcrypt/src/cellcrypt.o CC(target) Release/obj.target/cellcrypt/src/decode.o CXX(target) Release/obj.target/cellcrypt/src/DecryptionWrapper.o ../src/DecryptionWrapper.cpp:55:44: warning: 'NewInstance' is deprecated [-Wdeprecated-declarations] v8::Local<v8::Object> instance = cons->NewInstance(); ^ /Users/sjcbsolo/.node-gyp/6.11.1/include/node/v8.h:3276:52: note: 'NewInstance' has been explicitly marked deprecated here V8_DEPRECATED("Use maybe version", Local<Object> NewInstance() const); ^ 1 warning generated. CC(target) Release/obj.target/cellcrypt/src/Encryption.o SOLINK_MODULE(target) Release/cellcrypt.node clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated] 

如果我不需要,我不想看到这些警告。 我在github上find了一个打开的票据,通过要求NewInstance被调用的方式详述了对另一个addon软件包的修复:

 info.GetReturnValue().Set(cons->NewInstance(argc, argv)); info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked()); 

实施Nan::NewInstance()速度和效率太低了,究竟是什么方法呢?

错误信息本身给你的答案的简短forms:“使用也许版本”。 它试图告诉你有一个重载版本的NewInstance返回MaybeLocal (而不是Local ),这就是你应该使用的。

背景是大多数操作可能会失败,通常是在引发exception时。 旧的V8 API使embedded者相对难以确定他们在所有相关的地方检查exception情况; 因此引入了基于MaybeLocal返回types的新API。 每当你得到一个MaybeLocal ,你应该检查它是否实际上包含一个值。 如果只是简单地使用.ToLocalChecked (而不是首先手动检查),那就意味着如果失败了,那么你只是简单地崩溃(如果你能保证没有任何事情会失败的话,这是很好的)。 在光明的一面,这并不比你的代码显然一直在做的更糟糕;-)