Atualize o Appmetrics para executar no Node 12

3 min de leitura
Patrocinado
Imagem de: Atualize o Appmetrics para executar no Node 12
Avatar do autor

Equipe TecMundo

Recentemente, eu atualizei um add-on Node.js escrito em C++ para executar no Node.js 12. Quando comecei, eu tinha pouco conhecimento de C++ ou de como desenvolver add-ons Node.js, então estou compartilhando o que aprendi para deixar o processo mais fácil para outros que enfrentem desafios similares.

Antes da atualização, tentar compilar a V4 do Appmetrics (Node Application Metrics) no Node.js 12 implicava muitos erros de compilação. Os erros ocorriam porque o Node.js 12 é executado em uma versão mais nova do Google V8 engine (versão 7.4), que descontinuou diversas funções. Apesar de o Google V8 listar suas descontinuações, eles não explicam como consertar o código desatualizado!

Neste post, eu compartilho com você os passos que segui para fazer meu código ser executado sem erros e como você pode executar seus próprios add-ons Node.js C++ no Node.js 12.

Para ver um resumo das mudanças de códigos diretamente, confira as sugestões de melhoria no Github (mas observe também o aviso abaixo)

Aprendendo com o exemplo

Eu não tinha um histórico grande de trabalho com Appmetrics, C++ ou add-ons do Node.js, então aprendi tentando aplicar os exemplos de outras pessoas e descobrindo o que funcionava e por quê.

Para começar, atualizei a sintaxe do meu código C++ nativo e deixei o Appmetrics rodando no Node.js. No entanto, agora o meu C++ já não rodava mais no Node.js 8, porque meus arranjos usaram uma sintaxe que foi introduzida após o Node.js 8. Para contornar essa situação, eu poderia ter recorrido a blocos if-else pré-compilados para executar o código correto para as versões 8, 10 e 12 do Node.js, respectivamente, mas isso seria grosseiro e provavelmente demandaria extensões para rodar em versões futuras do Node.js.

Usando o NAN para o resgate

Então eu descobri o NAN (Native Abstractions for Node.js) — Abstrações Nativas para Node.js. A API do NAN fica mais ou menos da mesma forma na maioria das versões do Node.js, não importa qual versão do Google V8 engine estiver rodando. Então eu converti vários tipos e funções nativos C++ para tipos e funções NAN, delegando efetivamente ao NAN a tarefa de manter a compatibilidade ao longo das versões mais importantes do Node.js.

Existe uma alternativa mais moderna ao NAN, chamada N-API. Ela também tem o objetivo de proporcionar uma API simples que se mantém compatível com a maioria das versões do Node.js. Enquanto o NAN isola você da maioria das atualizações do API do Google V8 (mas não todas), a N-API o isola de todas elas.

Usei o NAN em vez da N-API porque ele já estava parcialmente na base do código. Eu precisava executar o Appmetrics no Node 12 rapidamente, então implementei o ajuste mais rápido primeiro: estendendo nosso uso do NAN. Mas se você está desenvolvendo um add-on do Node.js desde o início, tente usar a N-API.

Conclusão

Depois de realizar várias pesquisas no Google, experimentar e conversar com colegas, consegui fazer com que o Appmetrics compilasse no Node.js as versões 8, 10 e 12 ao converter um pouco da sintaxe nativa do C++ para tipos e funções NAN. A maior parte do nosso código ainda está em C++ nativo, cujas partes provavelmente ainda serão descontinuadas em futuras versões do Node.js. Para ficar à frente das próximas descontinuações, devemos resolver os avisos de desatualização antes que se tornem erros, usando o NAN ou a N-API.

Aviso

Se você olhar minhas mudanças de código nessa sugestão de melhoria, verá que estou usando tipos Local em vez dos novos tipos MaybeLocal apresentados na versão 7.4 do Google V8 engine (no qual o Node.js roda).

Usar demais os tipos Local não é uma das melhores práticas, mas foi necessário para que o Appmetrics rodasse no Node 12 o mais rápido possível. No entanto, voltar aos tipos MaybeLocal seria mais seguro.

O risco é que as chamadas C++ que podem retornar internamente ao Javascript fornecido pelo usuário falhem. O MaybeLocal<> é uma classe empacotadora para a classe Local<> que impõe que se verifique se Local<> está vazia antes de ser usada. Isso faz com que possamos colocar uma exceção na falha em vez de abortar. 

Para mais informações relacionadas a esse aviso, confira:

...

Quer ler mais conteúdo especializado de programação? Conheça a IBM Blue Profile e tenha acesso a matérias exclusivas, novas jornadas de conhecimento e testes personalizados. Confira agora mesmo, consiga as badges e dê um upgrade na sua carreira!

Você sabia que o TecMundo está no Facebook, Instagram, Telegram, TikTok, Twitter e no Whatsapp? Siga-nos por lá.