Ryan Vieira's Blog

[BR] C++ Addons no Node.js

Created at: 2024-12-02 18:00:00

Reading time: 2 minutes

O que são C++ Addons?

São uma maneira de aumentar o desempenho e a funcionalidade do seu código em Node.js, estendendo um código C++ diretamente no ambiente de JavaScript. Em outras palavras, um addon em C++ é um módulo que você cria para o Node.js que permite que você escreva funções e bibliotecas em C++ e as use no seu código JavaScript.

São basicamente uma ponte entre o JavaScript e o C++, o que faz com que o Node.js possa executar códigos mais pesados sem perder a flexibilidade e a acima de tudo, sua simplicidade.

Razões para usar C++ Addons no Node.js

Como os C++ Addons funcionam?

Exemplo Prático

Primeiramente, vamos criar um diretório para nosso código

1 mkdir addon
2 cd addon

Em seguida, vamos criar inicializar nosso package.json e baixar a lib node-gyp (certifique-se de instalar corretamente as dependências no seu SO)

1npm init -y
2npm i node-gyp

Dentro do nosso package.json, vamos criar um script de build para nossa addon.

1 "scripts": {
2    "build": "node-gyp configure build"
3  }

Agora, iremos criar nossa addon em C++ e vamos configurar nossa binding.

 1// array_sum.cpp
 2#include <node.h>
 3namespace demo
 4{
 5
 6  using v8::Array;
 7  using v8::Context;
 8  using v8::Exception;
 9  using v8::FunctionCallbackInfo;
10  using v8::Isolate;
11  using v8::Local;
12  using v8::Number;
13  using v8::Object;
14  using v8::Value;
15
16  void SumArray(const FunctionCallbackInfo<Value> &args)
17  {
18    Isolate *isolate = args.GetIsolate();
19    Local<Context> context = isolate->GetCurrentContext();
20
21    Local<Array> array = Local<Array>::Cast(args[0]);
22    uint32_t length = array->Length();
23    double sum = 0;
24
25    for (uint32_t i = 0; i < length; ++i)
26    {
27      Local<Value> element = array->Get(context, i).ToLocalChecked();
28      if (element->IsNumber())
29      {
30        sum += element->NumberValue(context).FromJust();
31      }
32    }
33
34    args.GetReturnValue().Set(Number::New(isolate, sum));
35  }
36
37  void Initialize(Local<Object> exports)
38  {
39    NODE_SET_METHOD(exports, "sum", SumArray);
40  }
41
42  NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)
43}
44
1// binding.gyp
2{
3  "targets": [{
4    "target_name": "array_sum",
5    "sources": [ "array_sum.cpp" ],
6  }]
7}

Pronto, assim que criado esses dois arquivos, podemos rodar nosso script de build (npm run build) e aguardar todo o processo para podermos desfrutar da nossa addon. Em seguida, iremos criar um novo arquivo e executar no terminal o comando node index.js

1//index.js
2const addon = require('./build/Release/array_sum');
3
4const big = [45, 'teste', 5]
5const sum = addon.sum(big);
6console.log('Resultado:', sum);
7// Resultado: 50

Considerações finais

Os addons são recursos poderosos quando o objetivo é otimizar o desempenho em operações críticas ou realizar integração com código nativo. Embora demandem conhecimento em C++ e aumentem a complexidade do projeto, eles podem ser a solução perfeita para situações em que o JavaScript puro não oferece a solução ideal. Graças a ferramentas como a N-API, o desenvolvimento de addons se tornou mais acessível e estável, permitindo que seus projetos combinem a praticidade do JavaScript com a eficiência do C++.

Link do Repositório: cpp-addon-nodejs Referências: Node.js