Neon library + Rust em aplicativos Node.js

Neon é uma biblioteca e conjunto de ferramentas que torna possível criar módulos Node nativos utilizando Rust. Isso é semelhante ao que é possível com C e C++, mas com os benefícios adicionais trazidos pelas garantias de segurança do Rust.

A Neon se esforça para tornar a criação do módulo Node.js simples. Depois de instalar o pacote Neon através do npm e o conjunto de ferramentas Rust, você pode usar neon new <project-name> para criar uma estrutura de módulo Node que incorpora um arquivo Cargo.toml e um arquivo de origem Rust incluindo uma função hello.

<project-name>/
├── .git ignore
├── README.md
├── lib/
│   └── index.js
├── native/
│   ├── Cargo.toml
│   └── src/
│       └── lib.rs
└── package.json

Dessa forma você pode adicionar quaisquer dependências Rust de que precisar ao arquivo Cargo.toml e fazer o layout de seu código como preferir. Você pode exportar uma função Rust para que ela possa ser usada em um programa Node em duas etapas. Primeiro, você registra a função usando:

register_module!(mut m, {
    m.export_function("myFunction", thread_count)
});

Em seguida, você o exporta de lib/index.js:

const addon = require('../native');
module.exports = addon.myFunction;

Quando seu código estiver pronto, você pode construir o módulo Node com:

neon build --release

Por mais simples que pareça, você deve, de qualquer maneira, prestar atenção especial em se comportar como um bom cidadão no ambiente do Node. Em particular, qualquer função Rust que você exportar deve ser de um tipo específico:

fn add1(mut cx: FunctionContext) -> JsResult<JsNumber> {
}

Aqui, FunctionContext fornece acesso ao ambiente do chamador do Node, incluindo sua lista arguments. Da mesma forma, uma função exportada deve retornar um JsResult, um tipo de opção que especifica que a função retorna um determinado tipo ou lança uma exceção JavaScript. Por exemplo, você pode acessar um argumento específico usando a sintaxe:

let x = cx.argument::<JsNumber>(0)?.value();

Para retornar um valor de uma função exportada, você deve convertê-lo corretamente no valor esperado. Por exemplo, se sua função retornar um número, você usaria o f64 como operador de conversão Rust ao retorná-lo:

Ok(cx.number(num_cpus::get() as f64))

Entre as vantagens de construir um módulo Native Node tem a possibilidade de executar tarefas assíncronas em segundo plano. Neon usa a API de microtarefas da N-API para esse objetivo e depende de retornos de chamada e promessas do lado do JavaScript para controlar a execução de tarefas assíncronas.

Como uma última observação, o Neon pode ser usado também com aplicativos Electron. No momento, isso requer o uso de uma ferramenta intermediária, electron-build-env para construir qualquer dependência Neon usada em um aplicativo Electron. A equipe de dev do Neon está trabalhando no suporte para electron-rebuild, o que irá agilizar este processo e permitir o uso das dependências do Neon como quaisquer outras dependências em um projeto Electron.

Deixe uma resposta
You May Also Like