node 18 upgrade error

Node.js

Node.js v16からNode.js v18にアップグレードしたらエラーが出ました。

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

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:71:19)
    at Object.createHash (node:crypto:133:10)
    at module.exports (/app/node_modules/webpack/lib/util/createHash.js:135:53)
    at NormalModule._initBuildHash (/app/node_modules/webpack/lib/NormalModule.js:417:16)
    at /app/node_modules/webpack/lib/NormalModule.js:452:10
    at /app/node_modules/webpack/lib/NormalModule.js:323:13
    at /app/node_modules/loader-runner/lib/LoaderRunner.js:367:11
    at /app/node_modules/loader-runner/lib/LoaderRunner.js:233:18
    at context.callback (/app/node_modules/loader-runner/lib/LoaderRunner.js:111:13)
    at /app/node_modules/babel-loader/lib/index.js:59:103 {
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

Node.js v18.12.1

Node.js v17に入った問題ようです。以下の環境変数をセットすれば回避できます。

NODE_OPTIONS=--openssl-legacy-provider

docker-composeでnodeやwebpackを使っている場合は以下の設定をdocker-compose.ymlへ追加すれば回避できます。

    environment:
      NODE_OPTIONS: --openssl-legacy-provider

原因

webpackがbabelを使っていて、babelが参照しているライブラリ内でOpenSSL 3.0の今はサポートされていないアルゴリズムかキーサイズのオプションを利用しようとした場合に出るようです。

考察

はやく、webpackerとbabelから脱却しないとですな。。。

Webpacker has been retired

https://github.com/rails/webpacker

コメント