require_relativeでリダイレクトレスポンスをサポートしたいと思っています。 たとえば次のようなシナリオです。
require_relative "a"
を実行するfetch('a.rb')
を実行する- a.rb にGETリクエストを送る
- サーバーから302レスポンスでb.rbが返ってくる
- b.rb にGETリクエストを送る
- Rubyスクリプトの取得する
Kernel.eval
でRubyスクリプトを実行する
シーケンス図で次のようになります。
sequenceDiagram participant Client participant Server Client->>Client: require_relative "a" Client->>Client: fetch('a.rb') Client->>Server: GET request './a.rb' Server->>Client: 302 Response with './b.rb' Client->>Server: GET request for './b.rb' Server->>Client: Ruby script transfer Client->>Client: Kernel.eval Ruby script
4~5のリダイレクトレスポンスに追随してGETリクエストを送る動作はfetch APIがサポートしています。 特に追加で何かする必要はありません。
気にするのは'a.rb'をロードしたつもりが、実際は'b.rb'を読み込んだシチュエーションです。
このあと require_relative "b"
を実行したときにRubyスクリプト b.rb
を再び実行するかどうかです。
結論としては b.rb
を読込済みとし、再び実行しません。
二重読込を防止したいのは、Rubyスクリプトの実体だと考えています。
同じRubyスクリプトを別の名前で require_relaitve
したときに、二度実行するのは、ユーザーの意図した動作ではないと考えます。