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
- Perfomance: C++ é uma linguagem compilada, ele geralmente apresenta uma performance superior quando comparado ao JavaScript, que é uma linguagem interpretada. Além de permitir um uso mais controlado sobre a alocação e desalocação de memória.
- Bibliotecas e código legado: Muitos sistemas e bibliotecas legados foram desenvolvidos em C++. Os addons permitem integrar essas bibliotecas de forma eficiente no ambiente, facilitando a reutilização de bases de código já existentes e reduzindo o esforço de reescrita. Além de possuir o acesso a uma gama de bibliotecas que não funcionam diretamente no JavaScript
- Nível de sistema: Certos recursos a nível de sistema, que não são acessíveis pelo JavaScript, podem ser utilizados com a ajuda dos addons, permitindo o uso de funcionalidades específicas sempre que necessário.
Como os C++ Addons funcionam?
- Compilação: Um addon precisa ser compilado antes de ser usado. Para isso, é necessário ter o node-gyp configurado no seu repositório. Essa ferramenta compila o código C++ para um módulo "nativo" que o Node.js consegue executar.
- Bindings: Para a criação de uma "ponte" entre o JavaScript e o C++, você pode usar os pacotes N-API, NAN e/ou diretamente através do V8, libuv, e bibliotecas alternativas do Node.js.
- Carregando as funcionalidades: Assim que o código for compilado e uma "ponte" existir entre os dois mundos, as funções criadas podem ser chamadas através do require(), fazendo com que elas sejam acessíveis para o JavaScript
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