NodeJS Addon开发

本文档介绍了NodeJSAddon的开发流程,包括环境搭建、编写HelloWorld示例,以及相关参考资料。首先,在package.json中配置并创建binding.gyp,接着在cppsrc目录下编写C++代码。然后,使用node-gyp编译addon,注意旧版本的node_gyp与Python版本兼容问题。成功编译后,可以在Node.js环境中调用addon。文章提供了进一步学习node-addon-api的资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.环境搭建

npm init
npm i --save --dev node-gyp node-addon-api

在package.json中加入如下配置:
在这里插入图片描述
在package.json同级目录下创建配置文件binding.gyp:

{
    "targets": [{
        "target_name": "helloworld",
        "cflags!": [ "-fno-exceptions" ],
        "cflags_cc!": [ "-fno-exceptions" ],
        "sources": [
            "cppsrc/helloworld.cpp"
        ],
        "include_dirs": [
            "<!@(node -p \"require('node-addon-api').include\")"
        ],
        "libraries": [],
        "dependencies": [
            "<!(node -p \"require('node-addon-api').gyp\")"
        ],
        "defines": [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ]
    }]
}

在package.json同级目录下创建文件夹cppsrc,接下来就可以开始开发了

2.Hello World

helloworld.cpp

#include <string>
#include <stdio.h>
#include <napi.h>

using namespace Napi;

void HelloWorld(const CallbackInfo& info) {
    Env env = info.Env();
    // 检查参数
    if (info.Length() < 1 || !info[0].IsString()) {
        TypeError::New(env, "Invalid parameter, helloWorld(name: string).")
            .ThrowAsJavaScriptException();
    }
    std::string name = info[0].As<String>().Utf8Value();
    printf("%s says: Hello, World!\n", (char*)name.c_str());
    return;
}

Object Initialize(Env env, Object exports) {
    exports.Set("MOD_ID", Number::New(env, 1399));
    exports.Set("helloWorld", Function::New(env, HelloWorld));

    return exports;
}

NODE_API_MODULE(NODE_GYP_MODULE_NAME, Initialize)

接下来进行编译,需要注意,旧版本node包括v10.x.x的node_gyp是py2版本、不兼容py3的,你可能需要用Anaconda创建一个虚拟环境:

npm run build

如果编译通过,那我们可以在nodejs调用这个addon了:

const lib = require('./build/Release/helloworld.node')
lib.helloWorld('Mr Li')
console.log(lib.MOD_ID)

运行结果:
在这里插入图片描述

3.参考资料

这篇文章只能帮助你完成node addon开发环境的搭建以及基本了解node addon的结构。
在实际开发过程中,你可能需要深入学习node-addon-api的API:Github: node-addon-api
这里有一篇文章更详细的介绍了如何使用node-addon-api,但需要翻墙:🤖 Beginners guide to writing NodeJS Addons using C++ and N-API (node-addon-api)

### 在HarmonyOS开发中引入Node.js环境或模块的方法 要在HarmonyOS开发环境中集成Node.js,可以通过以下方式实现: #### 1. 使用`debug`模块作为起点 可以先从简单的JavaScript调试工具入手,比如`debug`模块。该模块是一个轻量级的调试工具,适用于Node.js和浏览器环境[^1]。通过研究其源码并尝试将其移植到HarmonyOS平台上,能够初步了解如何在HarmonyOS上运行基于Node.js的代码。 对于具体的移植过程,可以根据已有的经验进行调整。例如,在HarmonyOS开发过程中可能需要用到`.d.ts`类型的声明文件来支持TypeScript功能[^2]。这些文件可以帮助开发者更好地理解库的功能接口以及数据结构定义。 #### 2. 利用Node-API实现跨语言交互 为了更深入地将Node.js的核心能力带入HarmonyOS项目中,可以考虑采用Node-API技术来进行跨语言交互开发[^3]。这种方法允许应用程序利用C/C++扩展编写高性能原生插件,并且兼容多种编程语言环境下的调用需求。 具体来说,这涉及以下几个方面的工作: - **模块注册与加载**:遵循Node-API的标准流程完成自定义模块的设计; - **API封装**:针对目标平台特性重新设计对外暴露的服务端口; 下面展示了一个简单示例程序片段用于说明如何创建一个基本的加法操作函数并通过Node-API导出给JS层使用: ```c #include <napi.h> Napi::Number Add(const Napi::CallbackInfo& info) { double lhs = info[0].As<Napi::Number>().DoubleValue(); double rhs = info[1].As<Napi::Number>().DoubleValue(); return Napi::Number::New(info.Env(), lhs + rhs); } Napi::Object Init(Napi::Env env, Napi::Object exports) { exports.Set("add", Napi::Function::New(env, Add)); return exports; } NODE_API_MODULE(addon, Init) ``` 此代码展示了如何构建一个基础算术运算方法并将它绑定至外部可用的形式下供其他部分引用执行计算逻辑等功能。 #### 总结 综上所述,虽然直接嵌套整个Node.js运行时并非易事,但借助某些特定技术和策略(如上述提到的内容),确实可以在一定程度上达成类似效果。重要的是要清楚所选路径是否满足实际应用场景的要求,并持续关注官方文档和技术社区动态获取最新进展信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值