Introduzione allo sviluppo degli addon C++ per Node.js

Introduzione allo sviluppo degli addon C++ per Node.js

Node.js è una piattaforma runtime JavaScript basata sul motore V8 di Google, progettata per costruire applicazioni di rete ad alte prestazioni. Uno dei punti di forza di Node.js è la sua capacità di estendere la funzionalità tramite addon C++, permettendo agli sviluppatori di creare moduli nativi che possono interagire direttamente con il sistema operativo e altre librerie C/C++.

Gli addon C++ offrono diversi vantaggi:

  1. Prestazioni: Gli addon C++ possono essere molto più veloci rispetto a codice JavaScript puro, specialmente per operazioni computazionalmente intensive.
  2. Accesso a librerie esistenti: Molte librerie di basso livello sono scritte in C o C++, e gli addon permettono di utilizzare queste librerie direttamente in Node.js.
  3. Interazione con l'hardware: Per accedere direttamente all'hardware o ad API di sistema specifiche, l'uso del C++ può essere necessario.

Prima di iniziare con lo sviluppo di addon C++, assicurati di avere installati sul tuo sistema:

  • Node.js
  • Python (per node-gyp)
  • Un compilatore C++ (ad esempio, GCC su Linux, Xcode su macOS, o Visual Studio su Windows)
  • node-gyp, uno strumento per la compilazione di addon nativi

Puoi installare node-gyp globalmente usando npm:


npm install -g node-gyp

Di seguito viene illustrato come creare un semplice addon C++ che espone una funzione per sommare due numeri.

Crea una directory per il tuo progetto e inizializza un nuovo progetto Node.js:


mkdir my-addon
cd my-addon
npm init -y

Crea una cartella src e un file addon.cc al suo interno:


mkdir src
touch src/addon.cc

Scrivi il seguente codice nel file addon.cc:


#include <napi.h>

Napi::Number Add(const Napi::CallbackInfo& info) {
    Napi::Env env = info.Env();
    if (info.Length() < 2 || !info[0].IsNumber() || !info[1].IsNumber()) {
        Napi::TypeError::New(env, "Number expected").ThrowAsJavaScriptException();
        return Napi::Number::New(env, 0);
    }

    double arg0 = info[0].As<Napi::Number>().DoubleValue();
    double arg1 = info[1].As<Napi::Number>().DoubleValue();
    double sum = arg0 + arg1;

    return Napi::Number::New(env, sum);
}

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

NODE_API_MODULE(addon, Init)

Creiamo un file binding.gyp nella root del progetto con il seguente contenuto:


{
  "targets": [
    {
      "target_name": "addon",
      "sources": [ "src/addon.cc" ]
    }
  ]
}

Usiamo quindi node-gyp per compilare il codice C++:


node-gyp configure
node-gyp build

Questo genererà un file binario nella directory build/Release chiamato addon.node.

Per utilizzare l'addon, creiamo un file index.js nella root del progetto e aggiungiamo il seguente codice:


const addon = require('./build/Release/addon');

console.log(addon.add(3, 5)); // Output: 8

Conclusione

Gli addon C++ per Node.js sono potenti strumenti che permettono di estendere le funzionalità delle applicazioni Node.js con prestazioni migliorate e accesso a librerie di basso livello. Sebbene richiedano una comprensione del C++ e della gestione della memoria, gli strumenti come node-gyp e il modulo N-API rendono il processo di sviluppo più accessibile.

Torna su