Suporte e compatibilidade
“Suportado” pode significar várias coisas diferentes para um addon nativo. O napi-rs mantém esses limites separados:
| Pergunta | Fonte da verdade |
|---|---|
| Um addon compilado pode carregar em uma versão do Node.js? | O nível de Node-API compilado nesse addon e as versões de Node-API fornecidas pelo runtime. |
@napi-rs/cli pode ser executado? |
O requisito de engine Node.js do próprio pacote da CLI. |
| Uma combinação de Node/runtime é testada continuamente? | O workflow de CI atual do código-fonte do napi-rs. |
napi new gera um caminho de build e publicação para um target? |
A matriz versionada do template Yarn ou pnpm selecionado e napi.targets. |
| O Rust consegue compilar o target triple? | O suporte do target no Rust mais o linker, SDK, dependências nativas e mecanismo de compilação cruzada exigidos. |
| O Node.js upstream publica um binário para o target? | Os artefatos de release do Node.js, que são mais limitados do que os triples que a CLI do napi-rs consegue interpretar. |
Um target triple aceito ou um nível de Node-API ABI-compatível, por si só, não é uma promessa de que todas as combinações acima sejam testadas.
Compatibilidade ABI do Node-API
O Node-API fornece estabilidade de ABI entre versões do Node.js. Um binário
nativo compilado contra o nível N de Node-API em geral consegue carregar em
versões posteriores do Node.js que ainda ofereçam o nível N, sem precisar
recompilar para cada major do Node.
Essa garantia não cobre:
- APIs introduzidas depois do nível de Node-API selecionado.
- Compatibilidade de sistema operacional, CPU, libc, runtime C++ ou target mínimo de deployment.
- Bugs na implementação de Node-API de um runtime alternativo.
- Bibliotecas nativas vinculadas pelas suas próprias dependências.
napi new pergunta o nível mínimo de Node-API e grava tanto a feature Cargo
napiN correspondente quanto a faixa de engines.node no projeto gerado. O
scaffold atualmente oferece níveis de Node-API de 1 a 9 e usa o nível 4 por
padrão. Escolha o menor nível que forneça as APIs que você usa e então teste no
runtime Node.js mais antigo que você afirma suportar. Features como suporte
assíncrono ainda podem elevar o piso efetivo de Node-API.
Requisitos de CLI e Rust
@napi-rs/clideclara>=23.5.0 || ^22.13.0 || ^20.17.0, em conformidade com sua dependência de prompts interativos. Use uma release Node.js 22 LTS atualizada (22.13+) ou Node.js 24+ nas builds atuais da CLI. Um addon ainda pode ter como alvo um runtime Node.js compatível mais antigo, mesmo que a CLI que o compila não consiga rodar nele.- O workspace atual do napi-rs v3 declara Rust 1.88 como sua versão mínima de Rust.
- O
engines.nodedo template gerado descreve o pacote do addon, não a CLI de build.
O que o repositório-fonte do napi-rs testa
A matriz principal de CI do código-fonte do napi-rs atualmente exercita Node.js 22, 24 e 26 em seus principais jobs de Linux, macOS e Windows. Testes adicionais de targets Docker atualmente usam Node.js 22 e 24.
Esta é a cobertura atual de regressão do projeto, não o intervalo completo de compatibilidade do Node-API. Uma versão do Node fora dessa matriz pode ser ABI-compatível, mas não é correto dizer que ela é continuamente testada pelo workflow-fonte atual.
Os templates de pacote gerados mantêm suas próprias matrizes de teste menores. Leia o workflow copiado para o seu projeto e trate esse arquivo versionado como o contrato de suporte do seu pacote.
Runtimes JavaScript
| Runtime | Status |
|---|---|
| Addons nativos no Node.js | Runtime principal. Ainda assim, as afirmações de release devem se limitar às versões de Node e plataformas que seu pacote efetivamente testa. |
| Addons nativos no Bun | Melhor esforço. O repositório-fonte executa um job com a versão mais recente do Bun, mas a etapa de teste usa continue-on-error, então falhas no Bun não bloqueiam releases do napi-rs. Teste seu addon real antes de afirmar suporte. |
| Addons nativos no Deno | Não faz parte da matriz atual de CI do repositório-fonte do napi-rs. Não deduza suporte a Deno apenas da compatibilidade do Node-API. |
| Fallback WASI no Node.js | Exercitado pelos workflows do código-fonte e dos templates gerados para as versões de Node selecionadas. Trata-se de um artefato e loader diferentes de um addon nativo .node. |
| WASI no navegador | Disponível por meio de bindings gerados para browser/worker. Exige threads em WebAssembly, workers e os cabeçalhos corretos de isolamento cross-origin. Teste explicitamente os navegadores alvo. |
| Fallback WASI em Bun/Deno | Ainda há lacunas conhecidas de compatibilidade; veja napi-rs issue #2965. Não apresente esse caminho como geralmente suportado. |
INFO
Um pacote pode oferecer suporte a um runtime de forma mais forte do que o próprio napi-rs, desde que adicione seus próprios testes de runtime bloqueantes. Registre esses testes na política de suporte do pacote em vez de depender da homepage do framework.
Targets aceitos pela CLI
A CLI atual reconhece famílias de targets que incluem:
- macOS x64, arm64 e binários universais.
- Windows MSVC x64, x86 e arm64, além de Windows GNU x64.
- Linux glibc x64, arm64, armv7, loongarch64, riscv64gc, ppc64le e s390x.
- Linux musl x64, arm64 e armv7.
- Android arm64 e armv7.
- FreeBSD x64.
- OpenHarmony x64 e arm64.
- targets WASI preview-1 com threads.
Esta lista descreve o vocabulário de parsing e empacotamento. Alguns targets exigem um linker ou SDK instalado manualmente, alguns só podem ser compilados a partir de hosts específicos, e alguns não têm binários oficiais de runtime do Node.js.
Targets gerados por napi new
napi new copia um de dois repositórios mantidos:
O scaffold filtra linhas já existentes do template; ele não sintetiza uma nova receita de CI para cada triple aceito. Os templates atuais fornecem caminhos de build/pacote para a matriz comum:
| Plataforma | Targets cobertos pelo template |
|---|---|
| macOS | x64, arm64 |
| Windows MSVC | x64, x86, arm64 |
| Linux glibc | x64, arm64, armv7 |
| Linux musl | x64, arm64 |
| Android | arm64, armv7 |
| FreeBSD | x64 |
| WASI | target preview-1 com threads |
Os dois templates mantidos atualmente implementam essa matriz. Como napi new
filtra a configuração versionada neles em vez de sintetizar receitas por
target, trate package.json e .github/workflows/CI.yml gerados como a base de
suporte do novo pacote.
Targets como OpenHarmony, Windows GNU, armv7 musl, macOS universal, loongarch64, riscv64gc, ppc64le e s390x podem ser aceitos pela CLI sem ter um caminho completo de build e publicação no scaffold. Selecionar todos os targets não muda isso.
Adicionando ou declarando suporte a um target
Antes de listar um target como suportado:
- Adicione o triple a
napi.targets. - Execute
napi create-npm-dirse inspecione as restrições dos pacotes gerados. - Adicione uma build de CI com o host, linker/SDK e modo de compilação cruzada corretos.
- Envie e colete o artefato com
napi artifacts. - Execute o binário no ambiente-alvo real ou fielmente emulado.
- Teste o SO, libc, target de deployment e versão do Node.js mais antigos que você afirma suportar.
- Verifique que uma instalação limpa do pacote raiz seleciona e carrega o pacote opcional esperado.
Use Compilação cruzada para a árvore de decisão entre host e target e Adicionar um target a um projeto existente para o fluxo completo de empacotamento.
Como declarar suporte com precisão
Prefira uma afirmação como:
Um binário por plataforma listada, compilado contra Node-API 8. A CI testa Node.js 22 e 24 em macOS arm64/x64, Windows x64 e Linux x64 glibc/musl. Espera-se que outras versões do Node.js compatíveis com Node-API funcionem, mas elas não fazem parte da matriz bloqueante.
Evite “todas as versões do Node” ou “todas as plataformas”. Inclua o nível de Node-API, as versões de Node testadas, a matriz SO/CPU/libc, o piso mínimo de SO ou glibc, e se runtimes alternativos são bloqueantes, de melhor esforço ou não testados.