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:
- Prestazioni: Gli addon C++ possono essere molto più veloci rispetto a codice JavaScript puro, specialmente per operazioni computazionalmente intensive.
- 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.
- 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.