如果想进一步提高效率,使用c++来优化部分模块是不错的选择。尤其可贵的是nodejs对于同c++的混合编程支持的很好,个人感觉跟写Python的扩展模块处于同样的易用水平。.../defines三行指定如果c++程序碰到意外错误的时候,由NAPI接口来处理,而不是通常的由c++程序自己处理。这防止因为c++部分程序碰到意外直接就退出了程序,而是由nodejs程序来捕获处理。...最后是c++的源码,democpp.cc文件: #include napi.h> using namespace Napi; String Hello(const CallbackInfo& info...,使用Napi的namespace还有最后的NODE_API_MODULE(addon,Init)都是模板化的,照抄过来不用动。...因为没有引出,nodejs并不知道这个函数的存在。 从nodejs传递参数给c++的函数,是使用info[0].As().Utf8Value()这样的形式。
最近基于puerts做了个nodejs addon,能让nodejs方便的调用c++的库。拿一个比较知名的同类方案v8pp做对比: 相同点 都是基于C++模板技术提供了声明式绑定API。...该标准的addon无需重新编译可以在实现了该标准的游戏引擎(UE /Unity),nodejs、lua等环境加载使用。...); return callbackInfo.result; } 其它接口 基本数据类型转换 对象生命周期管理:由虚拟机主动new的原生对象,没引用(gc)时应该释放掉,原生持有的一些虚拟机...napi_perf是手工调用nodejs的napi实现的addon,napi和pesapi类似,都是封装成c接口给addon调用(ps:pesapi的设计也有参考napi),它的测试数据和puerts模板绑定...这特性也有一些坑: 该特性并不是所有类型都支持,对于不支持的类型,含不支持类型的函数你用它提供给的模板库去收集签名信息时会报编译错误 成员方法并不直接支持 碰到过一个神奇的问题:静态方法甚至比不用该特性还慢
在这一点上,对我们来说,最有趣的是将NodeJS是如何工作的以及它涉及那些部分讲清楚。 重要的是要知道为什么我们可以在NodeJS中使用两种语言(JavaScript和C ++)。...我们需要定义的主要内容是指定要编译的文件以及我们如何调用最终的二进制文件。 它具有类似JSON的结构,获得此配置的关键是源和目标。 NODE-GYP 它是允许我们编译 Native 扩展的工具。...C文件: #include napi.h> Napi::String SayHi(const Napi::CallbackInfo& info) { Napi::Env env = info.Env...稍后,我们需要创建包含我们的Native扩展配置的binding.gyp文件: { "targets": [ { "cflags!"...总之,这是了解NodeJS内部的一种很好的方法。
接下来就是去编写我们的 c++ 代码了: #include // 定义 Add 函数 Napi::Value Add(const Napi::CallbackInfo& info) { Napi...(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); // 获取我们下边在创建 curryAdd 函数的时候传入的 result...: 如何在 c++ 函数中返回一个函数供 JS 调用 通过 Napi::Function::New 创建新的函数,并将计算结果存入函数可以获取到的地方供下次使用 如何让返回值既支持函数调用又支持取值操作...c++ 版本,因为是一个 JS 的扩展,所以会涉及到数据类型转换的问题,大致代码如下: #include void bubbleSort(double* arr, int len) { double...(list, len); // 将 double 数组转换为要传递给 JS 的数据类型 for (i = 0; i < len; i++) { arr[i] = Napi::Number
Napi; Napi::Value Run(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); Napi::HandleScope...如何理解最后两项呢? 用户代码在主线程执行,如果执行过程中,遇到一个异步调用,js引擎就会封装一个请求对象,并且注册到线程池去。...处理者把处理结果封装成一个观察者对象,塞进对应的事件队列。 因为异步调用有多种类型,事件队列也可能有多个。...整体的过程可以用下图表示 20181114140734214.png 上面说过,异步调用有多重类型,所以取任务的时候,也是有优先级之分的。...idle观察者:process.nextTick I/O观察者:一般性的I/O回调,如网络,文件,数据库I/O等 check观察者:setImmediate,setTimeout 可能在一些地方,看到过宏观任务和微观任务的说法
ENVTAG_NUMBER] = new JSVM_Env; g_callBackStructMap[ENVTAG_NUMBER] = new JSVM_CallbackStruct[5]; // 注册用户提供的本地函数的回调函数指针和数据...env对应存储方便后续调用 //napi_ref生命周期由开发者自己管理,需要手动delete,引用 napi_value 的抽象。...这允许用户管理 JavaScript 值的生命周期,包括明确定义它们的最小生命周期。 napi_ref callFun; //为Object创建一个reference,以延长其生命周期。...C++ 代码实现调用的C++方法类似于NAPI的写法,通过OH_JSVM_GetCbInfo获取JS传入方法的参数,将获取到的JSVM_Value的类型转换成c的类型。...,这样就不会出现像有的数据成员没有销毁导致内存泄露的问题或者程序直接崩溃 virtual ~Task() = default; // virtual纯虚函数的类是一个抽象类 virtual void
#include napi.h> Napi::String Method(const Napi::CallbackInfo& info) { Napi::Env env = info.Env()...但有些细节还是需要注意的。1 我们看到exports.Set函数的第一个参数是Env类型,但是New函数的第一个参数类型是napi_env,看起来不兼容。这个是如何自动转换的呢?...2 通过napi接口创建了值之后,最后返回的是一个String类型。我们看看String构造函数。...我们看看exports.Set(Napi::String::New(env, "hello"), Napi::Function::New(env, Method))的时候是如何使用这个String对象的...比如我们在addon里创建一个数字时, 我们会执行Number New(napi_env env, double value);New会调用napi的napi_create_double创建一个napi_value
本文介绍手动创建数据库的方法及创建过程遇到的错误(踩到的坑)....##手动创建数据库的方法 1.定义相关环境变量 export ORACLE_SID=orcl export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome...通过initorcl.ora创建spfile,并启动数据库Nomount状态,创建数据库。...执行相关脚本 conn / as sysdba ----创建数据字典视图和编译 @?...★命名是启动的数据库,连接时却是idle的??? SQL> exit 当仅仅设定ORACLE_SID=orcl时,正常连接,非Idle。
先自己开发一个DLL文件备用 非本文重点,熟悉的朋友可以略过。在这个DLL中,分别开发了三种情况的C函数: A. 参数为基本数据类型 B. 参数为指针 C....// MYDLLDEMO_API 是上面定义的宏,其实就是 __declspec(dllexport) // 参数和返回值都是基本数据类型 MYDLLDEMO_API int add(...// C函数使用指针操作函数外部的内存,所以首先需要 分配一个int类型的内存空间 第一个参数为 C语言数据类型,第二个参数为 默认值 var intBuf = ref.alloc(ref.types.int...和 ref-array-napi 库创建的数据类型,数组的长度为 8 // 这里一定要分配内存空间,否则 函数内的指针无法操作内存 let myArray = new IntArray(8) MyDellDemo.initArray...方法名一致 C语言数据类型是通过 ref-napi 库来映射的,详细映射可以查看以下文档: 官方文档1 官方文档2 官方文档3 参考资料: node-ffi使用指南 Node.js 调用C++库
NAPI是什么NAPI的概念源自Nodejs,为了实现javascript脚本与C++库之间的相互调用,Nodejs对V8引擎的api做了一层封装,称为NAPI。...当用户调用了NAPI接口 napi_create_int64(), 对于Nodejs而言,它会去访问V8引擎的api创建一个js的数字变量,而对于OpenHarmony,则是去访问ArkUI框架自己的js...是OpenHarmony版本的NAPI实现,想了解内部细节的可以从这里入手:创建一个简单的NAPI工程可以通过DevEco Studio的Native C++模板创建一个包含简单NAPI 实现的样例工程...应用如何调用NAPI接口应用代码导入对应的so库后,就可以调用该库实现的接口。...所有从JS运行环境传递过来的变量都是用napi_value类型来表示的。需要通过NAPI接口转为C++语言的变量类型。
通过NAPI框架进行C/C++与JS数据类型的转换OpenHarmony NAPI将ECMAScript标准中定义的Boolean、Null、Undefined、Number、BigInt、String...、Symbol和Object八种数据类型,以及函数对应的Function类型,统一封装成napi_value类型,下文中表述为JS类型,用于接收ArkUI应用传递过来的数据及返回数据给ArkUI应用。...in value: 传入要转换的napi_value类型数据对象(可视为一个JS对象)。out result: 转换出对应类型(double)结果。...in value: 传入要转换的napi_value类型数据对象(可视为一个JS对象)。out result: 返回value参数对应的JS类型。...napi_valuetype对应了ECMAScript标准中定义的Boolean、Null、Undefined、Number、BigInt、String、Symbol和Object八种数据类型,以及函数对应的
最近研究了一下reflect包,感觉这个包的功能很强大,顺便研究了一下如何在函数中动态创建struct{},平常我们都是用如下方式定义struct类型。...如果我们有时候读不同的数据库不同的数据表,事先我们又不确定这些数据表的字段,但是数据表是存在另外一个地方,这个时候我们需要动态创建struct类型来临时建类型,以及设置对应的tag和执行的sql进行绑定...下面我们看下如何通过reflect来实现建struct类型。 比如我们要建一个带有Height,Age,Test三个字段的结构。...struct类型,创建这个类型可以用于绑定查询单个sql,查询sql我们很多时候也有批量查询的需求,我们如何把上面的定义的struct又转换成slice呢?...通过makeslice函数来处理,这样就能创建这个slice了。 好了,到这里我们就先简单讲完动态创建stuct类型以及当前struct转换成slice的案例。
> 方法定义 使用 Node-API 定义方法,需按照 napi_callback 所指定的类型创建,接收两个参数: napi_env:存储 VM 状态的上下文信息,对于嵌套的 Node-API 回调...,是个枚举类型,参考文档 n_api_napi_status[5] napi_value:一个不透明的指针,用来表示 JavaScript 的值,类似于 JavaScript 里 var/let 是一个抽象的数据类型...napi_create_string_utf8() 该方法用于创建一个 UTF8 格式的字符串,其返回值是一个 status 表示是否创建成功,所以我们在最后一个参数传入了一个指针存储返回值。...void* data; // 这个数据会传递到 method/getter/setter } napi_property_descriptor; ---- napi_define_properties...: https://github.com/nodejs/node-gyp#installation [5]n_api_napi_status: https://nodejs.org/api/n-api.html
如何使用N-API 先强调一点,N-API并不是对原有node扩展实现方式的替代,它只是提供了一系列底层无关的API,来帮助开发者编写跨版本的node扩展。...至于如何编写、编译、使用扩展,跟原来的差不多。 本文会从一个超级简单的例子,简单介绍N-API的使用,包括环境准备、编写扩展、编译、运行几个步骤。...mkdir hello & cd hello # 目录名随便起 npm init -f 2、编写扩展 创建hello.cc作为扩展的源文件。...npm install --save bindings 然后,创建app.js,调用刚编译的扩展。...相关链接 N-API:https://nodejs.org/api/n-api.html C++ Addons:https://nodejs.org/api/addons.html 本文摘录自《Nodejs
napi_value是NAPI中非常重要的数据结构,定义如下 typedef struct napi_value__* napi_value; 学过c语言的同学应该知道typedef是什么意思,他的作用就是定义类型别名...,需要有类型信息,比如char、int类型,这时候才能知道要读取多少字节的内存数据。...他保存了v8创建的对象的地址信息。我们可以先不用深究*local是什么。...接着执行了 *result = napi_value变量; result类型是napi_value*,即二级指针,这样调用方就拿到了v8创建的对象。我们看一下具体的调用代码。...napi_value其实就是暂存v8对象信息的变量,他的用处就是可以保存任意类型的v8对象,因为不管什么类型的v8对象,他的地址大小是一样的,我们只需要面对napi_value就行,不需要关注v8的对象类型
它必须由【系统编程语言C / Cpp / Rust】编写,并经由nodejs开放接口N-API, 接入nodejs的JS VM,并 与nodejs交换数据·互操作。...比如,JS堆对象的wasm_bindgen::JsValue(似智能指针)结构体就比nj_sys::napi_value可修改原始指针更能发挥Rust类型系统与Borrow / Drop Checker...一图抵千词): 由上图可见,真实数据被保存于JS端(堆)内存中。...模块napi_rc包含了对智能指针std::rc::Rcnapi_ref>的AOP封装。 函数napi_export_method()模仿nodejs c-addon的FFI导出函数。...比如,如何做到“从一个工程,一个分支,一套Rust程序同时编译出三版.node链接库文件,以分别适用于nodejs / nwjs / electron三款应用程序容器”的呢?。哎!
本篇介绍使用 Node-API 为 Node.js 开发基于 C 的 Addons 时,如何接收与处理 Node.js 层传递的参数、Node-API 参数类型如何与 C 的类型互转、使用 CMake.js...napi_value* thisArg,// 接收 JavaScript 参数 this void** data // 接收回调的数据指针 ) 定义参数个数 argc 为 2,同样的再定义存储参数的数组...NULL; } } 错误处理还有一种是获取参数的类型,做类型校验,这可以通过 napi_typeof 函数获得一个参数的类型。...如下例所示,使用 Node-API 提供的 napi_create_int32() 函数转换 C 类型到 Node-API 类型,类似的其它类型也是如此,参考从 C 类型转换为 Node-API 的函数...应用测试 创建 app.js 可以测试下。
之前分享了如何写一个nodejs的c++插件。今天分享一下如何发布一个c++插件。...github:https://github.com/theanarkh/learn-to-write-nodejs-addons 环境 1 ubuntu18.04。...2 安装nodejs v12和npm install node-gyp -g。 写代码 写一个测试的例子。...而是直接提供.node文件,所以这里定义的路径为插件的路径。...c++插件的大致流程。
在上一篇中,讲解了如何使用ref创建基本类型的响应式数据,那么对应的对应对象类型也是有响应的创建方式的,本文要介绍的是reactive 创建,对象类型的响应式数据,以及 reactive 和 ref 的使用方法以及它们之间的区别...1. reactive 创建:对象类型的响应式数据作用reactive 用于定义一个响应式对象。注意,基本类型不要使用 reactive,而应使用 ref,否则会报错。...案例代码引入reactive 用于创建响应式对象数据,包括单个对象数据,多个对象数据以及多层结构。在模板调用的时候。直接使用reactive 对象名.属性名 获取数据,无需.value,直接使用即可。...:对象类型的响应式数据ref 也可以接收基本类型和对象类型的数据。...从宏观角度看:ref 用来定义基本类型数据、对象类型数据;reactive 用来定义对象类型数据。