如何在"node-gyp rebuild"中静默"'NewInstance'已被弃用"警告?v8中NewInstance的替代方案是什么?

aza*_*tar 1 javascript v8 node.js node-gyp node.js-addon

你好V8程序员和节点gyp'ers.我跑OS X 10.12.6,Node v6.11.1npm v3.10.10,nan v2.6.2,gcc为的XCode与此版本输出的一部分:

$ > 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
Run Code Online (Sandbox Code Playgroud)

请帮助我了解如何正确使用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]
Run Code Online (Sandbox Code Playgroud)

如果我不需要,我不想看到那些警告.我在github上发现了一个打开的票据,详细说明了对另一个插件包的修复,要求调用NewInstance:

info.GetReturnValue().Set(cons->NewInstance(argc, argv));
info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked());
Run Code Online (Sandbox Code Playgroud)

Nan::NewInstance()不违反速度和效率的情况下实施的bester方法是什么?

jmr*_*mrk 5

错误消息本身为您提供了简短的答案形式:"使用可能的版本".它试图告诉你,有一个重载版本NewInstance的返回a MaybeLocal(而不是a Local),这就是你应该使用的.

背景是大多数操作都可能失败,通常是在抛出异常时.旧的V8 API使得嵌入器相对难以确保它们在所有相关位置检查异常; 所以MaybeLocal引入了一个基于返回类型的新API .每当你得到一个MaybeLocal,你应该检查它是否实际包含一个值.如果您只是使用.ToLocalChecked(没有先手动检查),这意味着如果出现故障,您愿意简单地崩溃(如果您能保证什么都不会失败,那就没问题).从好的方面来说,这并不比你的代码显然一直在做的更糟糕;-)