javascript代码实例教程-用C++为nodejs 写组件,提高node处理效率

发布时间:2019-02-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了javascript代码实例教程-用C++为nodejs 写组件,提高node处理效率脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。  昨天研究了下如何用C++和node交互,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node。

 

首先,先来看看node 是如何和C++交互吧。

 

前提:需要安装nodejs 环境,安装node-gyp 包。采用npm 方式安装,这个太方便了,修改本文件夹下面的package.JSON 依赖选项,然后执行npm install 就可以了。

 

1.以hello world 为例来说明:

 

1)建立一个文件夹hello,在这个文件夹里依次添加3个文件,hello.cc, binding.gyp,test.js (其中hello.cc 是c++的源程序文件,binding.gyp 是编译模块的配置文件,这个文件被

 

node-gyp程序编译,test.js是nodejs的调用程序。)

 

文件下结构如下:

 

 

 

hello.cc 代码如下:

 

复制代码

#include <node.h>

#include <v8.h>

 

using namespace v8;

 

Handle<Value> Method(const arguments&amp; args) {

  HandleScoPE scope;

  return scope.Close(String::New("hello,world"));

}

 

void inIT(Handle<Object> exports) {

  exports->Set(String::NewSymbol("hello"),

      FunctionTemplate::New(Method)->GetFunction());

}

 

NODE_MODULE(hello, init)

复制代码

binding.gyp如下:

 

复制代码

{

  "targets": [

    {

      "target_name": "hello",

      "sources": [ "hello.cc" ]

    }

  ]

}

复制代码

test.js 为:

 

VAR addon = require('./build/Release/hello');

 

console.LOG(addon.hello()); 

2) 直接执行 node-gyp configure build  就直接编译了。

 

3) 运行 node test.js 就输出结果。

 

好了,就这么简单。node就可以直接调用C++编写的程序。

 

对上面程序的解释:在hello.cc 中,我们首先创建了一个函数Method, 此函数返回一个"hello,world"的字符串,后面我们又创建了一个init的函数,作为一个初始化函数,我们去调用了一个函数

 

最后面,我们将这个模块绑定为:NODE_MODULE(hello, init)

 

在官网中指出,所有的node的插件必须输出一个初始化的函数,也就是说如下代码是在每个模块都必须有的,固定格式。

 

void Initialize (Handle<Object> exports);

NODE_MODULE(module_name, Initialize)

其中 module_name 必须对应上binding.gyp中的 target_name 就可以了。

 

经过了node-gyp configure build 编译以后会在当前文件下生成一个build 的新的文件夹。我们通过在test.js中去引用这个build的结果,就可以调用C++的写的程序了。

 

OK,一个简单的node与C++程序就写完了。

 

现在这样node就可以和C++写的程序交互了,直接去调用C++写的程序了。如果觉得node处理不过来,都可以通过C++来处理。

 

2.node 通过callback 回调的方式,调用C++处理后的结果返回给node

 

1)按照上面的方式,首先建立3个文件 callback.cc, binding.gyp,test.js

 

callback.cc:

 

复制代码

#define BUILDING_NODE_EXTENSION

#include <node.h>

 

using namespace v8;

 

Handle<Value> RunCallback(const Arguments& args) {

  HandleScope scope;

 

  Local<Function> cb = Local<Function>::Cast(args[0]);

  const unsigned argc = 1;

  Local<Value> argv[argc] = { Local<Value>::New(String::New("hello world")) };

  cb->Call(Context::Getcurrent()->Global(), argc, argv);

 

  return scope.Close(Undefined());

}

 

void Init(Handle<Object> exports, Handle<Object> module) {

  module->Set(String::NewSymbol("exports"),

      FunctionTemplate::New(RunCallback)->GetFunction());

}

 

NODE_MODULE(callback, Init)

复制代码

binding.gyp:

 

复制代码

{

  "targets": [

    {

      "target_name": "callback",

      "sources": [ "callback.cc" ]

    }

  ]

}

复制代码

test.js:

 

var addon = require('./build/Release/callback');

 

addon(function(msg){

  console.log(msg); // 'hello world'

});

2)编译,在终端输入:node-gyp configure build ,会在当前目录下生成一个build 的新文件下

 

3)测试,node test.js  输出 //hello world

觉得可用,就经常来吧! 脚本宝典 欢迎评论哦! js脚本,巧夺天工,精雕玉琢。小宝典献丑了!

脚本宝典总结

以上是脚本宝典为你收集整理的javascript代码实例教程-用C++为nodejs 写组件,提高node处理效率全部内容,希望文章能够帮你解决javascript代码实例教程-用C++为nodejs 写组件,提高node处理效率所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。