@ledsun blog

無味の味は佳境に入らざればすなわち知れず

require_relativeの相対参照の起点となるもの

の続きです。前回fetchで実装してみたところ、非同期APIではrequire_relativeの同期性*1を保証できないことに気が付きました。

ブラウザから同期でHTTPリクエストを飛ばすのであればXMLHttpRequestを使えばよいはずです。 つまり、こうです。

    var request = new XMLHttpRequest();
    request.open("GET", url, false);
    request.send(null);

    if (request.status === 200 && request.responseText) {
      vm.eval(request.responseText);
      return true;
    }

順序の制御がうまくいきました。 いろいろ試しています。 例えば・・

require_relative "lib/a-1"

で読み込んだa-1.rbから

require_relative "../b"

してみます。 http://localhost:8080/ruby-wasm-wasi/example/lib/a-1.rb から ../bを参照しています。 http://localhost:8080/ruby-wasm-wasi/example/b.rb にリクエストを飛ばしたいです。 実際に動かしてみると、次のようにエラーが起きます。

404エラーが起きます。

http://localhost:8080/ruby-wasm-wasi/b.rb へリクエストを飛ばしています。

これは 相対パスの起点につねに browser.script.iife.js を使っているからです。 require_relativeの参照先を得るためには、require_relativeを実行するRubyスクリプトのURLを知っておく必要があります。

*1:そんな言葉があるかは知りません