Techioz Blog

Rails 新しい 6.1 アプリがデフォルト画面以外のリクエストを処理できません: Webpacker::Manifest::MissingEntryError

概要

新しい Rails 6.1.7.4 アプリで、デフォルトの「Rails::WelcomeController#index」画面以外のページにリクエストを行うと、次のエラーが発生します。

rails new rails_6-1_app
cd rails_6-1_app
rails g scaffold blog title
rails db:migrate
rails s
# Make request to http://localhost:3000/blogs/

Rails webpacker:compile を試行すると、何が起こっているかに関する詳細情報が得られることに気付きました。

Compiling...
Compilation failed:
node:internal/process/promises:279
            triggerUncaughtException(err, true /* fromPromise */);
            ^

Error: Cannot find package '@babel/plugin-proposal-private-methods' imported from /<Path-TO-MY-APP>/rails_6-1_app/babel-virtual-resolve-base.js

この Rails の問題を通じて、デフォルトで生成された babel.config.js ファイル内の 2 行を変更することが提案されました。

// babel.config.js 
// replace this line 
// '@babel/plugin-proposal-private-methods',
// with this line
'@babel/plugin-transform-private-methods', 

// also replace this line
// '@babel/plugin-proposal-private-property-in-object',
// with this line
'@babel/plugin-transform-private-property-in-object',

ただし、その変更を行ってから Rails webpacker:compile を実行すると、新しいエラーが生成されます。

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:69:19)
    at Object.createHash (node:crypto:133:10)
    at module.exports (/<Path-To-My-App>/rails_6-1_app/node_modules/webpack/lib/util/createHash.js:135:53)

解決策

ここでも同じエラーが発行されます。

https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://github.com/rails/rails/issues/48372

説明:

これは、webpacker が plugin-proposal-private-methods を含む babel.config.js を生成するために発生しているようです。ただし、plugin-proposal-private-methods への依存関係は追加されません。代わりに、plugin-proposal-private-methods に依存するパッケージに依存します。

最近、そのパッケージは plugin-transform-private-methods babel/babel#15614 に名前変更され、おそらく babel/babel@389ecb0 がリリースされました。

したがって、babel が実行しようとすると、babel.config.js ファイルが読み取られ、plugin-proposal-private-methods が必要であることがわかります。これをロードしようとしましたが、plugin-proposal-private-methods がインストールされていないため (依存関係ではなくなったため)、失敗します。

解決:

babel.config.js 内の名前をプロポーザルからトランスフォームに置き換えることができます。

// '@babel/plugin-proposal-private-methods',
'@babel/plugin-transform-private-methods', 

// '@babel/plugin-proposal-private-property-in-object',
'@babel/plugin-transform-private-property-in-object',

// etc.