[Rust] napi-rs로 Node.js와 연결하기
napi-rs는 Rust 코드를 Node.js에서 사용할 수 있게 해주는 FFI용 라이브러리다.
보니까 지원 수준도 나쁘지 않다.

기본 구성
Cargo.toml에는 이런식으로 디펜던시를 추가해준다.
[lib]
crate-type = ["cdylib"]
[dependencies]
napi = {version="2", features=["async"]}
napi-derive = "2"
tokio = {version="1", features=["fs"]}
[build-dependencies]
napi-build = "1"
tokio나 async features는 필요없으면 빼도 된다.
그리고 build.rs 스크립트를 루트 경로에 작성한다.
extern crate napi_build;
fn main() {
napi_build::setup();
}
이걸 통해서 Node.js와의 연동을 위한 밑작업을 좀 돌리는 구조다.
저건 바꿀일이 거의 없다.
그리고 lib.rs에 필요한 함수들을 구현해서, napi 매크로만 붙여주면 끝이다.
위는 피보나치 함수를 구현한 예다.
snake 케이스는 export될때 camel 케이스로 mangling된다는 점에 유의한다.
저거고 빌드하면
dll이나 so 등의 동적 라이브러리가 나올 것이다.
저걸 확장자를 node로 바꿔서 node.js 프로젝트 내에 포함시키고
requires만 해서 갖다쓰면 된다.
어렵지 않다.
async/await 사용
Rust async Future도 Node.js의 Promise로 자동변환이 된다.
features에 async만 추가하고, async 함수로 작성해주면 끝이다.
아래는 tokio async로 파일을 읽어오는 함수를 추가했다.
저러고 빌드해서 다시 requires를 하면
이렇게 자유롭게 쓸 수 있다.
쉽다.
Rust->Node.js 타입 변환은 이런식으로 된다.
