yak shaving life

遠回りこそが最短の道

nuxt-create-appしてnpm run devしたらerror:0308010Cになる件

タイトルのまんまですが、nuxt-create-appで適当にプロジェクトを作ってnpm run devしたらいきなり下記のエラーになった。Nodeのバージョンは 17.5.0。

Error: error:0308010C:digital envelope routines::unsupported
...(中略)

  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

なんだかOpenSSL関連っぽい感じ。とりあえずエラーメッセージでググって上から10個くらい記事を読んでみると、Node 17 からOpenSSL 3 が使われるようになり、Webpack 4 内部で使ってるハッシュアルゴリズム (md4?) がサポートされなくなったのが原因らしい。package-lock.jsonを見ると"webpack": "^4.46.0"だったのでなるほどという感じ。ちなみにWebpack 5 でもダメだとか。

ちゃんと調べてないけど、下記のコメントを見る限り Webpack 6 ではハッシュアルゴリズムを変えてくれるらしい。

github.com

Webpack 6 が出てNuxtのdependencyが更新されるまでの間どうすりゃいいのよ?というと、

  • node起動時に --openssl-legacy-provider をつけるか、export NODE_OPTIONS=--openssl-legacy-provider環境変数にセットしておく
  • webpackの設定に output.hashFunction: "xxhash64" を追記する
  • LTS version のNodeを使う (現時点だと 16.14.2)

のどれかでいけるらしい。とりあえずNodeのバージョンを 16.14.2 に下げたら動きました。なかなか難儀な話だなぁ。

教訓としては、特にこだわりがなければ日頃からLTS使っとけってところでしょうか。

参考

itsmycode.com

stackoverflow.com

github.com

github.com