背景
RustでWebAssemblyをやってみたいと思い、こちらを参考に進めていました。
特にバージョンなど明記がないのですが、2022.0801現在の環境で進めた時にエラーが発生したため、備忘録として残しておきます。
環境
node: v17.0.1
npm: 8.15.1
詰まったところ
npm install
まで終えて、npm run start
を実行したところ、エラーが出てWebサーバが起動できませんでした。
エラーの内容は下記の通りです。
(node:58651) [DEP0111] DeprecationWarning: Access to process.binding('http_parser') is deprecated.
(Use `node --trace-deprecation ...` to show where the warning was created)
ℹ 「wds」: Project is running at http://localhost:8080/
ℹ 「wds」: webpack output is served from /
ℹ 「wds」: Content not from webpack is served from /Users/*/workspace/wasm-tutprial/wasm-game-of-life/www
node:internal/crypto/hash:67
this[kHandle] = new _Hash(algorithm, xofLen);
^
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:67:19)
at Object.createHash (node:crypto:130:10)
(中略)
at FSReqCallback.readFileAfterClose [as oncomplete] (node:internal/fs/read_file_context:68:3) {
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
}
原因
簡単に言うと、Node.js v17 以降で OpenSSL 3.0 まわりでハッシュ関数の設定が変わったらしいです。よくわかりませんが……
使ってるモジュールが OpenSSL 3.0 に対応してないために弾かれているようです。
解決法
主に下記の方法で対応できます。
- オプションで
--openssl-legacy-provider
をつけて実行する -
export NODE_OPTIONS=--openssl-legacy-provider
として環境変数を設定しておく -
webpack.config.js
にoutput.hashFunction: "xxhash64"
を追加する