Nodejs 第五十七章(addon)

Nodejs在IO方面拥有极强的能力,但是对CPU密集型任务,会有不足,为了填补这方面的缺点,Nodejs支持c/c++为其编写原生nodejs插件,补充这方面的能力。

Nodejs c++扩展

c++编写的代码能够被编译成一个动态链接库(dll),可以被nodejs require引入使用,后缀是.node

.node文件的原理就是(window dll) (Mac dylib) (Linux so)

c++扩展编写语法

  1. NAN(Native Abstractions for Nodejs) 一次编写,到处编译

    • 因为 Nodejs和V8都更新的很快所有每个版本的方法名也不一样,对我们开发造成了很大的问题例如

    • 0.50版本 Echo(const Prototype&proto)

    • 3.00版本 Echo(Object<Prototype>& proto)

      NAN的就是一堆宏判断,判断各种版本的API,用来实现兼容所以他会到处编译

  2. N-API(node-api) 无需重新编译

    • 基于C的API

    • c++ 封装 node-addon-api

      N-API 是一个更现代的选择,它提供了一个稳定的、跨版本的 API,使得你的插件可以在不同版本的 Node.js 上运行,而无需修改代码。这大大简化了编写和维护插件的过程。

      对于 C++,你可以使用 node-addon-api,这是 N-API 的一个封装,提供了一个更易于使用的 C++ API。这将使你的代码更易于阅读和维护。

使用场景

  1. 使用C++编写的Nodejs库如node-sass node-jieba
  2. CPU密集型应用
  3. 代码保护

需要安装的依赖

sh 复制代码
npm install --global --production windows-build-tools #管理员运行
#如果安装过python 以及c++开发软件就不需要装这个了
npm install node-gyp -g #全局安装
npm install node-addon-api -D #装到项目里

小案例获取设备的宽高

index.cpp

cpp 复制代码
#define NAPI_VERSION 3  //指定addon版本
#define NAPI_CPP_EXCEPTIONS //启用 Node.js N-API 中的 C++ 异常支持
#include <napi.h>  //addon API
#include <windows.h> //windwos API

Napi::Value GetScreenSize(const Napi::CallbackInfo& info) {
    Napi::Env env = info.Env(); //指定环境

    int cx = GetSystemMetrics(SM_CXSCREEN); //获取设备宽
    int cy = GetSystemMetrics(SM_CYSCREEN); //获取设备高

    Napi::Object result = Napi::Object::New(env); //创建一个对象
    result.Set("width", cx);
    result.Set("height", cy);

    return result; //返回对象
}

Napi::Object Init(Napi::Env env, Napi::Object exports) {
    //抛出一个函数  getScreenSize 
    exports.Set("getScreenSize", Napi::Function::New(env, GetScreenSize));
    return exports;
}
//addon固定语法 必须抛出这个方法
NODE_API_MODULE(NODE_GYP_MODULE_NAME, Init)

binding.gyp

json 复制代码
{
    "targets":[
        {
            "target_name": "cpu", //名称
            "sources": [ "cpu.cpp" ], //指定文件
            "include_dirs": [
                 "<!@(node -p \"require('node-addon-api').include\")" //引入addon
            ]
        }
    ]
}

index.js

js 复制代码
const addon = require('./build/Release/cpu.node')
console.log(addon.getScreenSize())
sh 复制代码
node-gyp configure #生成配置文件
node-gyp build  #打包addon
相关推荐
Full Stack Developme8 分钟前
跨站请求伪造 (CSRF) 是什么 设计及工作原理
前端·okhttp·csrf
濮水大叔9 分钟前
CabloyJS 强大之处不仅仅是 IoC,而是全栈资源的寻址体系
typescript·node.js·全栈
MoSTChillax16 分钟前
UI规范设计:从视觉到交互的全面指南
前端·ui·产品经理·设计规范·vibecoding
雪碧聊技术39 分钟前
Vue + Element Plus 实现文本溢出显示省略号及悬浮提示
前端·javascript·css·vue.js·文本溢出省略
eric-sjq41 分钟前
0.6B 前端生成模型本地部署实战:消费级显卡跑通 WanlyFrontend 全流程
前端·本地部署
东方小月1 小时前
从零开发一个 Coding Agent(十一):实现 CLI 的 print 模式
node.js·全栈
小妖6662 小时前
设置了 box-sizing: border-box; 不管用,下边框还是被挤压没了
前端·css·html
雪隐2 小时前
个人电脑玩AI-16让5060 Ti给你打工——5060Ti 16G 跑 MiniMax-Music-3:从下载到 60s 出歌的全流程
前端·人工智能·后端
__zRainy__2 小时前
Node系列 · Node基础:ES 模块化
node.js
CAD老兵3 小时前
让 AI Coding Agent 直接访问 CAD 文档:GitMCP 实战指南
前端·人工智能·github