标签:Node 原生 node js 模块 v8 using cmake hello
平常我们写node module的时候,都是直接用javascript去写,今天我们来学习下如何使用c/c++来写node模块,用c/c++写的优势就在于,你可以调用许多系统级的API,如fork,缺点就是它强平台依赖的,不一定能在所有平台下去运行。
写一个node addon一点都不可怕 * 3
我们用到的工具有2个
cmake-js是使用CMake作为工具,构建跨平台的Makefile,极大方便了Makefile配置的一个js工具。
我们做一个 Hello World,效果如
module.exports.hello = function() { return 'world'; };
废话不多,直接上代码
// hello.cc
#include <node.h>
namespace demo { //此处的命名空间应该和你的模块名一致
using v8::FunctionCallbackInfo;
using v8::HandleScope;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
void Method(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = args.GetIsolate(); args.GetReturnValue().Set(String::NewFromUtf8(isolate, "world")); //设置返回值
}
void init(Local<Object> exports) { NODE_SET_METHOD(exports, "hello", Method); //注册函数
} NODE_MODULE(demo, init) //注册模块
} // namespace demo
比起普通的js代码,的确要复杂很多呀~
然后我们写好CMakeList.txt
cmake_minimum_required(VERSION 3.3) #设定cmake的版本
project(hello) #设定项目名称
include_directories(${CMAKE_JS_INC}) #加载由cmake-js提供的环境变量
set(SOURCE_FILES "hello_world.cc") #设置我们需要编译的文件列表
add_library(hello SHARED exports.cpp ${SOURCE_FILES}) #标明我们要编译成一个lib,使用定义好的文件
set_target_properties(hello PROPERTIES PREFIX "" SUFFIX ".node") #设定编译出来的文件名(默认是libxxx.so,这里改成xxx.node)
好,在这个文件夹下面执行cmake-js,然后只要编译链接通过,在你的Build/Release下面就会出现hello.node,
然后在你的js文件里进行测试
var hello = require("hello").hello;console.log(hello()); //输出 world
哈,是不是很简单!
接下去的任务就是好好学习v8相关的API了,在C/C++环境下,要千万注意内存泄露的问题!
标签:Node,原生,node,js,模块,v8,using,cmake,hello 来源: https://blog.51cto.com/u_15127653/2806858
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。