一、 hello world 源代码分析
下面一段时间我们将专注于node-addon-api的用法,书接上回,我们首先从hello world 例子出发,具体看看node-addon是如何具体实现的。首先示例代码如下:
#include <napi.h>
Napi::String Method(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
return Napi::String::New(env, "world");
}
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "hello"),
Napi::Function::New(env, Method));
return exports;
}
NODE_API_MODULE(hello, Init)
我们一句句分析:
1.头文件
node-addon-api项目头文件为:
#include <napi.h>
所有node-addon-api封装的宏定义、类全部在这个头文件中定义。其位置是在node-addon-api下面:
fan@fan-virtual-machine:~/work/js2$ ls node_modules/node-addon-api/napi.h -la
-rw-rw-r-- 1 fan fan 119287 12月 17 21:18 napi.h
2.定义返回"hello"字符串的函数
Napi::String Method(const Napi::CallbackInfo& info) {
...}
这个语句定义了一个 名为 “Method”的函数,返回值 Napi::String 类型,参数是 Napi::CallbackInfo& 类型。 Napi::String 是 js中 string 类型在C++中对应的数据类型,Napi::CallbackInfo 是一个包含上游 Node.js运行时上下文环境的一个类型,其最重要的是包含了JS调用函数传递进来的参数。其参数可以用 info[0] info[1] 的形式获取。
Napi::Env 是js脚本运行环境,几乎每一个addon函数都需要指定Js运行环境,对于初级玩家的我们,只需要把CallbackInfo 中的 env取出来,传递下去即可。
分析了半天,这个函数实际上等同于非js环境下的
string Method()
{
return "hello";}
3.定义一个初始化函数
Napi::Object Init(Napi::Env env, Napi::Object exports) {
...