https://zenn.dev/razokulover/articles/fb64150be7a667
先日Scrapbox記法をMarkdownに変換するライブラリをRustで書いたという記事を書いた。
このライブラリは当初CLIとして使うことを想定していた。しかしせっかくRustで書いたのでWASMを生成してフロントエンドから動かせるようにしてみた。できたのは下記のページ。
Scrapboxのテキストを入力して変換するボタンを押すとMarkdownが生成される。
今回はこれを作る過程でNext.jsでWASMを動かすというのができたので大まかなやり方を書き残しておく。ざっくりとした手順としては下記。
next.config.js
の設定実際にやってみるとわかるがとても簡単。
Rustからwasmの生成にはwasm-packを使った。これを使うとbg.wasm
とかbg.wasm.d.ts
などのファイルが生成される。RustからWASMを生成する方法についてはCompiling from Rust to WebAssembly - WebAssembly | MDNあたりの記事を読んでみると良い。
wasm-packでwasm-pack build --target web --release
をして生成したファイル群は下記のようになっているはず。
├── package.json
├── sb2md_converter.d.ts
├── sb2md_converter.js
├── sb2md_converter_bg.wasm
└── sb2md_converter_bg.wasm.d.ts
これら全てをNext.jsのソースコードのルートに配置する。自分の場合はsrc/
の中にresources/wasm/
というディレクトリを作ってファイルを丸ごと入れた。こんな感じ→https://github.com/YuheiNakasaka/personal-site/tree/master/src/resources/wasm
次にwebpackの設定。webpack5から導入された実験的機能の中にWASMファイルを同梱してくれるオプションがあるのでそれを使う。
next.config.jsにはこんな感じで書いておけばOK。
module.exports = {
webpack: (config, { isServer }) => {
config.experiments = {
asyncWebAssembly: true,
layers: true,
};
config.output.webassemblyModuleFilename = (isServer ? "../" : "") + "static/wasm/[modulehash].wasm";
return config;
}
}