Node.js 17がインストールされた環境でbin/webpack
コマンドを実行すると次のエラーが起きます。
~ bin/webpack 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 module.exports (/home/ledsun/books-manager/node_modules/webpack/lib/util/createHash.js:135:53) at NormalModule._initBuildHash (/home/ledsun/books-manager/node_modules/webpack/lib/NormalModule.js:417:16) at handleParseError (/home/ledsun/books-manager/node_modules/webpack/lib/NormalModule.js:471:10) at /home/ledsun/books-manager/node_modules/webpack/lib/NormalModule.js:503:5 at /home/ledsun/books-manager/node_modules/webpack/lib/NormalModule.js:358:12 at /home/ledsun/books-manager/node_modules/loader-runner/lib/LoaderRunner.js:373:3 at iterateNormalLoaders (/home/ledsun/books-manager/node_modules/loader-runner/lib/LoaderRunner.js:214:10) at iterateNormalLoaders (/home/ledsun/books-manager/node_modules/loader-runner/lib/LoaderRunner.js:221:10) at /home/ledsun/books-manager/node_modules/loader-runner/lib/LoaderRunner.js:236:3 at context.callback (/home/ledsun/books-manager/node_modules/loader-runner/lib/LoaderRunner.js:111:13) at /home/ledsun/books-manager/node_modules/babel-loader/lib/index.js:59:71 { opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ], library: 'digital envelope routines', reason: 'unsupported', code: 'ERR_OSSL_EVP_UNSUPPORTED' } Node.js v17.0.1
NODE_OPTIONSを設定すると回避できます。
~ NODE_OPTIONS=--openssl-legacy-provider bin/webpack Hash: 2034dd941d5476d8645c Version: webpack 4.46.0 Time: 345ms Built at: 02/01/2022 4:26:56 PM Asset Size Chunks Chunk Names js/application-3dd0dc24d9c39bc09227.js 125 KiB application [emitted] [immutable] application js/application-3dd0dc24d9c39bc09227.js.map 139 KiB application [emitted] [dev] application manifest.json 364 bytes [emitted] Entrypoint application = js/application-3dd0dc24d9c39bc09227.js js/application-3dd0dc24d9c39bc09227.js.map [./app/javascript/channels sync recursive _channel\.js$] ./app/javascript/channels sync _channel\.js$ 160 bytes {application} [built] [./app/javascript/channels/index.js] 211 bytes {application} [built] [./app/javascript/packs/application.js] 492 bytes {application} [built] [./node_modules/webpack/buildin/module.js] (webpack)/buildin/module.js 552 bytes {application} [built] + 3 hidden modules
余談ですがこのオプションをつけると失敗するコマンドもあります。
~ NODE_OPTIONS=--openssl-legacy-provider code . /home/ledsun/.vscode-server/bin/899d46d82c4c95423fb7e10e68eba52050e30ba3/node: --openssl-legacy-provider is not allowed in NODE_OPTIONS
原因?
node.js - Error message "error:0308010C:digital envelope routines::unsupported" - Stack Overflow から、次のWebpackのissueが見つかります。
nodejs 17: digital envelope routines::unsupported · Issue #14532 · webpack/webpack · GitHub
クローズ済みです。 最新のWebpackではこのエラーは起きません。 ということは、Webpackerに含まれるWebpackのバージョンが古いから、このエラーが起きるのでしょうか? Webpackerのソースを見ると、新しそうです。
https://github.com/rails/webpacker/blob/master/package.json#L26
"webpack": "^5.53.0",
しかし、よく見ると、このソースコードはリリースされていません。 リリースされている最新版5.4.3が指定するwebpackのバージョンは低いです。
https://github.com/rails/webpacker/blob/v5.4.3/package.json#L49
"webpack": "^4.46.0",
そしてWebpackerはリタイア済み・・・つまり