1

我使用 NodeJS 0.11.x 发行版已经有一段时间了,主要是因为我相信生成器和yield语句在异步可管理性方面带来了巨大的进步(参见coffy-scriptsuspend)。

也就是说,在运行前沿、不稳定的 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();
    }
    

有更多的变化,但这两个影响每个原生插件。

4

1 回答 1

0

在 NodeUp #52 中详细回答:http: //nodeup.com/fiftytwo

总结:v8 API 的大改动,Node 的一些小改动,改动还在进行中。但是有两个项目旨在帮助解决这个问题,NAN (github/rvagg/nan) 和 shim / node-addon-layer (github/tjfontaine/node-addon-layer)。

于 2013-09-21T23:26:19.983 回答