编写Node原生模块

2021/5/24 14:24:37

本文主要是介绍编写Node原生模块,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

9b7ec139b8a7955e7c27650b8e3b72b1.jpeg

平常我们写node module的时候,都是直接用javascript去写,今天我们来学习下如何使用c/c++来写node模块,用c/c++写的优势就在于,你可以调用许多系统级的API,如fork,缺点就是它强平台依赖的,不一定能在所有平台下去运行。


写一个node addon一点都不可怕 * 3


我们用到的工具有2个


1.cmake-js 代替node-gyp,使用起来很方便。
2.nodejs源码(需要一些头文件和库)


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原生模块的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程