nodejs C++ 扩展 hello-world

C++ native 扩展,让你的function也体验下function () { [native code] }的赶脚。

#资料收集

关于V8的各种概念(Handle Local Function …)

关于libuv

中文资料

#Hello World
nodejs 的 cpp addon,连接cpp代码和js代码

1.安装node-gyp

1
$ npm i node-gyp -g

node本身使用gyp构建工具,然后node社区出了node-gyp这种方便的addon 构建工具。

2.创建hello.cc文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "node.h"
#include "v8.h"

using namespace v8;

Handle<Value> a_method(const Arguments& args){
HandleScope scope;
return scope.Close(String::New("这是返回值。。。Hello C++ Addon ..."));
}

void init(Handle<Object> exports){
exports->Set(
String::NewSymbol("a_method"),
FunctionTemplate::New(a_method)->GetFunction()
);
}

NODE_MODULE(hello,init)

  • node.h v8.h node的头文件和v8的头文件
  • NODE_MODULE是个宏定义,不是方法,后面不需要分号,参见node.h
    NODE_MODULE宏(module_name,func)
    • module_name 表示这个要生成的module名字,必须与binding.gyp中target_name一致
    • func 初始化方法,两个参数(Handle<Object> exports,Handle<Object> module)
      使用
      1
      2
      module->Set(String::NewSymbol("exports"),xxx)
      表示 js 里的 module.exports = xxx

3.编写binding.gyp文件,用于生成vcxproj文件或者linux下的Makefile

1
2
3
4
5
6
7
8
{
"targets":[
{
"target_name": "hello",
"sources":["hello.cc"]
}
]
}

target_name要与NODE_MODULE(name,func)这个name一致

4.使用node-gyp 生成

1
node-gyp <command>

命令 作用
configure 生成项目文件,vcxproj or Makefile
clean 清理build目录
build 调用MsBuild 等生成工具生成
rebuild 上面三个操作

完整的见 https://github.com/TooTallNate/node-gyp

打开命令行窗口

1
$ node-gyp build

build\Release\hello.node就是生成的addon了

5.js 测试

1
2
3
4
5
var cpp_hello = require('./build/Release/hello');

console.log(cpp_hello.a_method());

console.log(cpp_hello.a_method.toString());

结果 - 就是这样,所谓的native code