Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

A framework for building compiled Node.js add-ons in Rust via Node-API

License

NotificationsYou must be signed in to change notification settings

napi-rs/napi-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

This project was initialized fromxray

A framework for building compiledNode.js add-ons inRust via Node-API. Website:https://napi.rs

chat

Sponsors

Platform Support

Test & ReleaseAddress SanitizerMemory Leak Detect

MSRV

Rust1.88.0

node12node14node16node18node20node22
Windows x64
Windows x86
Windows arm64
macOS x64
macOS aarch64
Linux x64 gnu
Linux x64 musl
Linux aarch64 gnu
Linux aarch64 musl
Linux arm gnueabihf
Linux arm muslebihf
Linux powerpc64le gnu
Linux s390x gnu
Linux loong64 gnuN/AN/AN/A
Linux riscv64 gnuN/AN/A
Linux aarch64 android
Linux armv7 android
FreeBSD x64

This library depends on Node-API and requiresNode@10.0.0 or later.

We already have some packages written bynapi-rs:node-rs

One nice feature is that this crate allows you to build add-ons purely with theRust/JavaScript toolchain and without involvingnode-gyp.

Taste

You can start frompackage-template to play withnapi-rs

Define JavaScript functions

use napi::bindgen_prelude::*;use napi_derive::napi;/// module registration is done by the runtime, no need to explicitly do it now.#[napi]pubfnfibonacci(n:u32) ->u32{match n{1 |2 =>1,    _ =>fibonacci(n -1) +fibonacci(n -2),}}/// use `Fn`, `FnMut` or `FnOnce` traits to defined JavaScript callbacks/// the return type of callbacks can only be `Result`.#[napi]pubfnget_cwd<T:Fn(String) ->Result<()>>(callback:T){callback(    std::env::current_dir().unwrap().to_string_lossy().to_string(),).unwrap();}/// or, define the callback signature in where clause#[napi]pubfntest_callback<T>(callback:T) ->Result<()>whereT:Fn(String) ->Result<()>,{callback(std::env::current_dir()?.to_string_lossy().to_string())}/// async fn, require `async` feature enabled./// [dependencies]/// napi = {version="2", features=["async"]}#[napi]pubasyncfnread_file_async(path:String) ->Result<Buffer>{Ok(tokio::fs::read(path).await?.into())}

more examples atexamples

Building

This repository is aCargo crate. Any napi-based add-on should containCargo.toml to make it a Cargo crate.

In yourCargo.toml you need to set thecrate-type to"cdylib" so that cargo builds a C-style shared library that can be dynamically loaded by the Node executable. You'll also need to add this crate as a dependency.

[package]name ="awesome"[lib]crate-type = ["cdylib"][dependencies]napi ="3"napi-derive ="3"[build-dependencies]napi-build ="1"

And createbuild.rs in your own project:

// build.rsexterncrate napi_build;fnmain(){  napi_build::setup();}

So far, thenapi build script has only been tested onmacOSLinuxWindows x64 MSVC andFreeBSD.

Install the@napi-rs/cli to help you build yourRust codes and copyDynamic lib file to.node file in case you canrequire it in your program.

{"package":"awesome-package","devDependencies":{"@napi-rs/cli":"^1.0.0"},"napi":{"name":"jarvis"// <----------- Config the name of native addon, or the napi command will use the name of `Cargo.toml` for the binary file name.},"scripts":{"build":"napi build --release","build:debug":"napi build"}}

Then you can require your native binding:

require('./jarvis.node')

Themodule_name would be yourpackage name in yourCargo.toml.

xxx => ./xxx.node

xxx-yyy => ./xxx_yyy.node

You can also copyDynamic lib file to an appointed location:

napi build [--release] ./dllnapi build [--release] ./artifacts

There aredocuments which contains more details about the@napi-rs/cli usage.

Testing

Because libraries that depend on this crate must be loaded into a Node executable in order to resolve symbols, all tests are written in JavaScript in thetest_module subdirectory.

To run tests:

yarn build:testyarntest

Related projects

Features table

Rust TypeNode TypeNAPI VersionMinimal Node versionEnable bynapi feature
u32Number1v8.0.0
i32/i64Number1v8.0.0
f64Number1v8.0.0
boolBoolean1v8.0.0
String/&'a strString1v8.0.0
Latin1StringString1v8.0.0latin1
UTF16StringString1v8.0.0
ObjectObject1v8.0.0
serde_json::MapObject1v8.0.0serde-json
serde_json::Valueany1v8.0.0serde-json
ArrayArray1v8.0.0
VecArray1v8.0.0
BufferBuffer1v8.0.0
ExternalExternal1v8.0.0
Nullnull1v8.0.0
Undefined/()undefined1v8.0.0
Result<()>Error1v8.0.0
T: Fn(...) -> ResultFunction1v8.0.0
Async/FuturePromise4v10.6.0async
AsyncTaskPromise1v8.5.0
JsGlobalglobal1v8.0.0
JsSymbolSymbol1v8.0.0
Int8Array/Uint8Array ...TypedArray1v8.0.0
JsFunctionthreadsafe function4v10.6.0napi4
BigIntBigInt6v10.7.0napi6

[8]ページ先頭

©2009-2025 Movatter.jp