親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

node.jsのバージョンアップによりerror:0308010Cエラーの発生

エラーの発生契機

エラーの種類は以下

error:0308010C:digital envelope routines::unsupported

  at new Hash (node:internal/crypto/hash:71:19)
  at Proxy.createHash (node:crypto:133:10)
  at module.exports (node_modules/webpack/lib/util/createHash.js:135:53)
  at NormalModule._initBuildHash (node_modules/webpack/lib/NormalModule.js:417:16)
  at node_modules/webpack/lib/NormalModule.js:452:10
  at node_modules/webpack/lib/NormalModule.js:323:13
  at node_modules/loader-runner/lib/LoaderRunner.js:367:11
  at node_modules/loader-runner/lib/LoaderRunner.js:233:18
  at context.callback (node_modules/loader-runner/lib/LoaderRunner.js:111:13)
  at node_modules/babel-loader/lib/index.js:55:103

node:internal/crypto/hash:71
  this[kHandle] = new _Hash(algorithm, xofLen);

ほとんどの方はnode.jsのバージョンアップで発生するエラーになると思います。
私の場合はnode.jsを2023年7月時点の最新である18.7.0にバージョンアップした時に発生しました。

解消方法1

解消方法としては様々ですが、とりあえずNODE_OPTIONSという変数に--openssl-legacy-providerという値を設定すればよさそう。
私は以下のようにpackage.jsonのscriptsに以下のようにNODE_OPTIONS='--openssl-legacy-provider'を入れれば解決しました。

"scripts": {
  "dev": "cross-env NODE_SERVER=\"localhost\" NODE_OPTIONS='--openssl-legacy-provider' nuxt",
  "build": "cross-env NODE_SERVER=\"localhost\" NODE_OPTIONS='--openssl-legacy-provider' nuxt build"
}

解消方法2

ちなみに以下の設定を.bashrcや.zshrcに環境変数として設定する方法もあります。

export NODE_OPTIONS=--openssl-legacy-provider

しかしこの方法は欠点があり、同一PCで旧バージョンのnode.jsを使用する可能性がある場合に以下のようなエラーが出てしまい、

node: --openssl-legacy-provider is not allowed in NODE_OPTIONS
unset NODE_OPTIONS

などしなければいけなくなり、少々面倒です。