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 したときに、二度実行するのは、ユーザーの意図した動作ではないと考えます。