@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

Node.js 17でRails 6.1 の bin/webpackを実行するとエラーが起きる

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はリタイア済み・・・つまり