用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& 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
注意:如果有多个.cc 的文件,一定要将他们都包含在binding.gyp中,不然编译是通过了,但是node调用会报错。
测试代码地址:https://github.com/yupeng528/node-addon-test
用C++为nodejs 写组件,提高node处理效率的更多相关文章
- 用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具
用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具 前言 上周,同事抱怨说 react 怎么不能像 angular 那样,使用命令行工具来生成一个组件.对呀,平时工作时,想要创建 ...
- 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助
初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: var fs = require('f ...
- node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)
第七章 建议学习时间4小时 课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...
- Cannot install NodeJs: /usr/bin/env: node: No such file or directory
安装doxmate时,doxmate地址是:https://github.com/JacksonTian/doxmatenpm install doxmate -g 安装完后把错误:Cannot in ...
- nodejs写的一个网页爬虫例子(坏链率)
因为工作需要,用nodejs写了个简单的爬虫例子,之前也没用过nodejs,连搭环境加写大概用了5天左右,so...要多简陋有多简陋,放这里给以后的自己看~~ 整体需求是:给一个有效的URL地址,返回 ...
- 分享一个nodejs写的小论坛
引言:作为一个前端小菜鸟,最近迷上了node,于是乎空闲时间,为了练练手写了一个node的小社区,关于微信小程序的,欢迎大家批评指导. 项目架构部分 一.前端架构 作为一个写样式也得无聊的前端狮,我偷 ...
- [转载]要提高SQL查询效率where语句条件的先后次序应如何写
出处:https://www.cnblogs.com/exe19/p/5786806.html 我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则 ...
- 要提高SQL查询效率where语句条件的先后次序应如何写
我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句 ...
- nodejs 写服务器解决中文乱码问题
nodejs 写服务器解决中文乱码问题:https://blog.csdn.net/worldmakewayfordream/article/details/77483423 本文链接:htt ...
随机推荐
- 2015年8月18日,杨学明老师《技术部门的绩效管理提升(研讨会)》在中国科学院下属机构CNNIC成功举办!
2015年8月18日,杨学明老师为中国网络新闻办公室直属央企中国互联网络中心(CNNIC)提供了一天的<技术部门的绩效管理提升(研讨会)>培训课程.杨学明老师分别从研发绩效管理概述.研发绩 ...
- Unix常用指令
pwd 表示获取自己当前所在位置 ls 表示查看当前文件夹中的内容 cd 进入指定目录 mkdir 文件夹1 创建一个文件夹名为文件夹1的文件夹 rmdir 文件夹2 删除一个文件夹名为文件夹2的 ...
- Python字符转换
Python提供了ord和chr两个内置的函数,用于字符与ASCII码之间的转换. 如:>>> print ord('a') 97 >>> print chr(97 ...
- ORGANIZATION
Leader: Ming Xiang Ph.D students: Bo Yang Yupei Zhang M.Eng. students: Cheng Feng Jinquan Du Youli ...
- C++混合编程之idlcpp教程Python篇(4)
上一篇在这 C++混合编程之idlcpp教程Python篇(3) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial2中,同样加入了三个文件 Pyt ...
- delphi中获取调用堆栈信息
异常堆栈有利于分析程序的错误,Delphi的Exception有StackTrace属性,但是值为空,因为StackTrace的信息收集Delphi委托给了第三方组件来完成,真是脑子有毛病! 借助于m ...
- 用c#开发微信 (19) 公众平台接口权限列表说明 - 订阅号、服务号认证后的区别
最新发现有些原来认证服务号的权限对认证的订阅号开放了,这里是官方的文档说明<公众平台接口权限列表说明>,明显比这里说得详细.准确多了<微信公众平台服务号.订阅号的相关说明>.另 ...
- WebApi与手机客户端通信安全机制
最近公司有几个项目需要开发手机客户端,服务器端选用WebApi,那么如何保证手机客户端在请求服务器端时数据不被篡改,如何保证一个http请求的失效机制,下面总结一下我们在项目中针对这两个问题的解决方案 ...
- Salesforce 生成测试可用 Id
在写 Test Class 的时候,有时候需要一批有 Id 的数据或者把 Id 作为参数等情况,在数据关系比较复杂的情况下去造真实数据有些麻烦,于是找到这样一个可以生成 Id 的方法可以用来辅助测试! ...
- 【Android】事件总线(解耦组件) EventBus 详解
当Android项目越来越庞大的时候,应用的各个部件之间的通信变得越来越复杂,例如:当某一条件发生时,应用中有几个部件对这个消息感兴趣,那么我们通常采用的就是观察者模式,使用观察者模式有一个弊病就是部 ...