[WASM&Rust] 세팅 및 시작
먼저 wasm-pack이라는 것을 설치해주자. wasm에 대한 기능은 다 이걸 통해 제공되는 것 같다.
https://rustwasm.github.io/wasm-pack/installer/
들어가서
저거 깔고 실행하면
이래 뜰 것이다. 잘 설치했다고 한다.
그리고 rust 프로젝트를 잘 만든다.
수동으로 터미널에서 만들든, Jetbrain 편집기들을 이용해 만들든.
그러고 나서 종속성 관리 파일인 Cargo.toml을 아래와 같이 설정해둔다.
[package]
name = "wasm_test"
version = "0.1.0"
authors = ["sssan"]
edition = "2018"
[lib]
crate-type = ["cdylib", "rlib"]
[features]
default = ["console_error_panic_hook"]
[dependencies]
wasm-bindgen = "0.2"
# console_error_panic_hook 크레이트는 console.error로 로깅을 해서 더 좋은 패닉 디버깅을 제공함
# 개발에는 좋지만 배포할때는 빼는게 좋음. std::fmt` and `std::panicking를 전부 필요로 하기 때문.
console_error_panic_hook = { version = "0.1.1", optional = true }
# wee_alloc는 wasm을 위한 소형 allocator. 조금 느린 대신,
# 코드 사이즈가 10K까지도 늘 수 있는 디폴트 allocator에 비해 최대 1K까지만 유지함.
# 근데 wee_alloc은 아직 wasm에 대해서는 nightly 버전에서만 동작함
wee_alloc = { version = "0.4.2", optional = true }
[dev-dependencies]
wasm-bindgen-test = "0.2"
[profile.release]
# rustc에게 코드 사이즈를 작게(small) 만들어줄 것을 요구
opt-level = "s"
그리고 main.rs은 지워버리고 lib와 utils라는 파일을 생성해둔다.
그중에서도 lib는 꼭 필요한 요소다. 저 이름의 파일이 없으면 빌드할때 에러를 던질 것이다.

utils 파일엔 대충 아래와 같이 써둔다.
pub fn set_panic_hook()
{
// console_error_panic_hook 기능이 enable된 상태에서,
// 초기화 중에 최소 한번 호출. 패닉이 발생할 경우 더 좋은 메세지를 보여줌
#[cfg(feature = "console_error_panic_hook")]
console_error_panic_hook::set_once();
}
이제 lib에 있는 코드가 본격적으로 다루게 될 부분이다.
mod utils;
use wasm_bindgen::prelude::*;
// wee_alloc 기능이 enable된 상태에서, wee_alloc을 전역 allocator로 사용.
#[cfg(feature = "wee_alloc")]
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
#[wasm_bindgen]
extern
{
fn alert(s: &str);
}
#[wasm_bindgen]
pub fn hello()
{
alert("Hello!!!");
}
#[wasm_bindgen]
pub fn add(l:i32, r:i32)->i32
{
return l+r;
}
여기서 alert를 extern한 것이 바로 자바스크립트의 알림창 함수인 alert를 가져온 것이다.
그리고 아래의 hello 함수와 add 함수가 바로 방출돼서, 자바스크립트에서 쓰이게 될 함수들이다.
hello는 알림창만 띄워주고, add는 정수를 더해준다.
이렇게만 해두고, 프로젝트 폴더에서 wasm-pack build를 쳐주면 자동으로 빌드가 된다.

그럼 이렇게 완성물들이 배출될 것이다.
.wasm파일이 웹어셈블리 바이너리,
위의 .js 파일이 이걸 사용하기 쉽게 해주는 글루(glue:접착제) 코드다.
.ts 파일들은 자바스크립트 대신 타입스크립트로 쓰고싶을때만 쓰면 된다.
이제 테스트를 좀 해보자.
클라이언트에서 쌩으로 돌리는건 좀 어렵다.
브라우저에서 웹어셈블리에 대한 module import를 제대로 지원하지 않기 때문에...
노드를 통해 임시 서버를 만들어 테스트를 해보도록 하겠다.
npm으로 테스트를 위한 프로젝트 템플릿을 만들어준다. 이름은 test.

그럼 이런식으로 생성이 된다.

그리고 package.json을 열어서 아까 빌드한 결과물들의 위치를 종속성으로 추가한다.

index.js를 열어보면 이런식으로 되어있을 것이다.

hello... 어쩌고 대신, wasm으로 빌드된 자바스크립트 glue 코드파일의 이름을 넣자.
그리고 원하는 실행 코드들을 좀 넣었다.
웹어셈의 hello 함수를 한번 호출.
그리고 나서 웹어셈의 add로 더해서 콘솔로 출력한다.
bootstrap.js에선 이걸 import한다.

그리고 index.html에서 이걸 다시 포함시키도록 했다.

그리고 프로젝트 폴더에 node_modules 등의 폴더가 없다면, npm install을 쳐서 이것저것 깔아준다.
서버를 돌리기 위한 밑작업이다.

잘 깔렸다면 npm run start로 서버를 돌린다.

localhost:8080 으로 들어가면
알림창이 뜨고
콘솔에도 뜬다.
클라이언트로 온 소스를 보면 웹어셈도 같이 들어와있다.
이건 아까 Rust로 짰던 hello 함수
이건 add 함수다.
의외로 어셈블리처럼 저급해보이진 않는다.
참조
https://rustwasm.github.io/docs/book/game-of-life/hello-world.html