温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Node扩展怎么调原生库

发布时间:2026-09-04 04:04:25 来源:亿速云 阅读:92 作者:小樊 栏目:软件技术

在 Node.js 里“调原生库”一般指两种方式:

  1. Node 扩展(Addon):用 C/C++/Rust 写原生代码,编译成 .node 文件,在 JS 里 require 使用
  2. 通过子进程 / FFI 调用已有原生库(.so / .dll / .a)

下面分别说。


一、写 Node 原生扩展(Addon)

1️⃣ 使用 N-API(推荐)

N-API 是 Node 官方稳定 ABI,不随 Node 版本频繁变动。

示例(C + N-API)

addon.c

#include <node_api.h>

napi_value Add(napi_env env, napi_callback_info info) {
  napi_value result;
  int sum = 3 + 4;
  napi_create_int32(env, sum, &result);
  return result;
}

napi_value Init(napi_env env, napi_value exports) {
  napi_value fn;
  napi_create_function(env, NULL, 0, Add, NULL, &fn);
  napi_set_named_property(env, exports, "add", fn);
  return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

binding.gyp

{
  "targets": [{
    "target_name": "addon",
    "sources": ["addon.c"]
  }]
}

构建

npm install -g node-gyp
node-gyp configure
node-gyp build

JS 使用

const addon = require('./build/Release/addon.node');
console.log(addon.add()); // 7

2️⃣ 使用 Node-API / C++(更方便)

#include <napi.h>

Napi::Number Add(const Napi::CallbackInfo& info) {
  return Napi::Number::New(info.Env(), 3 + 4);
}

Napi::Object Init(Napi::Env env, Napi::Object exports) {
  exports.Set("add", Napi::Function::New(env, Add));
  return exports;
}

NODE_API_MODULE(addon, Init)

3️⃣ Rust 写 Node 扩展(现代方案)

使用 napi-rsneon

napi-rs 示例

#[napi]
pub fn add(a: i32, b: i32) -> i32 {
  a + b
}

构建:

npm run build

JS:

import { add } from './index.js'
add(1, 2)

✅ 优点:内存安全、跨平台、易维护


二、直接调用已有原生库(不写 Addon)

1️⃣ FFI(Foreign Function Interface)

使用 ffi-napi

const ffi = require('ffi-napi');

const lib = ffi.Library('./libfoo.so', {
  foo: ['int', ['int', 'int']]
});

console.log(lib.foo(1, 2));

⚠️ 注意:

  • ffi-napi 只支持 N-API 的旧版本
  • 性能一般,不适合高频调用

2️⃣ 子进程调用(最稳)

const { execFileSync } = require('child_process');

const out = execFileSync('./mylib_cli', ['arg1', 'arg2']);

适合:

  • 计算密集
  • 不频繁调用
  • 库已有 CLI

三、选型建议

场景 推荐
新写高性能模块 N-API / Rust
已有 C/C++ 库 Addon 封装
快速调用 FFI
不稳定 / 隔离 子进程
跨语言 Rust + napi-rs

如果你说的是:

  • Electron 调原生库
  • Node 调 CUDA / OpenCV
  • Windows DLL
  • macOS Framework

告诉我具体场景,我可以直接给你可跑的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI