node@16 → node@22 へのアップデートで `ERR_OSSL_EVP_UNSUPPORTED` エラー

node@16のプロジェクトをnode@22に更新したところ起動時に以下のエラーになりました。

{
 // ...略 スタックトレース
opensslErrorStack: [
'error:03000086:digital envelope routines::initialization error',
'error:0308010C:digital envelope routines::unsupported'
],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

ググると「環境変数に NODE_OPTIONS=—openssl-legacy-provider を追加する」という解決方法が表示されます。

Node.jsのリリースノート OpenSSL security releases require Node.js security releases によると、セキュリティホールを塞ぐため、利用するOpenSSLのバージョンを変更したとあります。

フロントエンドのビルドをする限りにおいては環境変数を使って回避する方法で良さそうですが、エラーがSSL関連なので、間違ってサーバーサイドにこの設定を入れてしまわないよう、根本的な解決をしておくことにします。

スタックトレースをみると /webpack/lib/util/createHash.js:135:53 と表示されており、Webpackでエラーになっています。

当該プロジェクトはCRAで作成されており、react-scripts@4.0.3 が使われていました。

react-scripts@5.0.1 に更新することでエラーは消え、再度アプリケーションを実行できるようになりました。

もう1つの解決策として、CRAからejectしviteに移行する方法があります。

ビルド環境としてはViteがデファクトスタンダードになっているのと、CRAは公式に非推奨になっているので、こちらの方法のほうが長い目で見て良い選択かと思います。

Reactハンズオン「自動目次作成コンポーネント」を公開しました
AstroでClientRouterを使っていると、ページ遷移後scriptが実行されない