我使用 NodeJS 0.11.x 发行版已经有一段时间了,主要是因为我相信生成器和yield
语句在异步可管理性方面带来了巨大的进步(参见coffy-script和suspend)。
也就是说,在运行前沿、不稳定的 NodeJS 安装时会遇到严重的挫折:当尝试编译任何 C 组件时npm install xy-module
,会失败(总是?有时?)。gyp
有一个普遍的原因吗?有什么技巧/补丁/配置我可以应用来纠正这种情况吗?如果给定的模块确实在 NodeJS 0.10.x 上编译,但在 0.11.x 上失败,我是否应该期望它在 0.12.x 可用时立即编译?
更新我在 NodeJS 邮件列表上交叉发布了这个问题,并且ben noordhuis 很友好地分享了一些细节。引用他的信息:
两个主要变化如下:
Persistent<T>
不再源自Handle<T>
. 要从 Persistent 重新创建句柄,请调用Local<T>::New(isolate, persistent)
. 您可以使用以下方法获得隔离Isolate::GetCurrent()
(但请注意,Isolate::GetCurrent()
在较新版本的 V8 中可能会消失。)C++ 回调和访问器的原型已经改变。之前,您的函数如下所示:
Handle<Value> MyCallback(const Arguments& args) { HandleScope handle_scope; /* Do useful work, then: */ return handle_scope.Close(Integer::New(42)); /* Or: */ return handle_scope.Close(String::New("hello")); /* Or: */ return Null(); }
在 v0.11 和 v0.12 中,变为:
void MyCallback(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); HandleScope handle_scope(isolate); /* Do useful work, then: */ args.GetReturnValue().Set(42); /* Or: */ args.GetReturnValue().Set(String::NewFromUtf8(isolate, "hello")); /* Or: */ args.GetReturnValue().SetNull(); }
有更多的变化,但这两个影响每个原生插件。