14
5

More than 1 year has passed since last update.

ExecJSが自動で選択するランタイムはどのように決まるのか

Last updated at Posted at 2021-11-05

ExecJSはRubyからJavaScriptのプログラムを実行できるようにしてくれますが、プログラムを実行するランタイムは以下のようにベストなものを自動で選択してくれるようです。

It automatically picks the best runtime available to evaluate your JavaScript program

逆に自分が意図したランタイムを設定したいときにはどうしたらいいのか、どう自動で選択してくれているのかが気になったので確認してみました。

version

execjs v2.8.1

結論

意図したものを選択させるには以下のどちらかを行う

  • 環境変数 (EXECJS_RUNTIME) を設定する
  • 自動読み込みの優先順位を確認し、他に優先度が高いランタイムが存在しないか確認する

ランタイムの読み込み部分のコードを読んでいく

ExecJSのコードはとてもシンプルなので、コードを読むのが早いです。

lib/execjs.rb
module ExecJS
  self.runtime ||= Runtimes.autodetect
end

まずlib/execjs.rbを見て、Runtimes.autodetect で自動検出していそうなので、lib/execjs/runtimes.rb#L56を見てみます。

lib/execjs/runtimes.rb
  from_environment || best_available ||

するとfrom_environmentで環境変数(ENV["EXECJS_RUNTIME"])が設定されていたらそれを参照し、適切なランタイムが見つからなかったらその後有効なもの見ているようです。

    def self.best_available
      runtimes.reject(&:deprecated?).find(&:available?)
    end

    def self.runtimes
      @runtimes ||= [
        RubyRhino,
        Duktape,
        MiniRacer,
        Node,
        JavaScriptCore,
        SpiderMonkey,
        JScript,
        V8
      ]
    end

best_availableはシンプルにランタイムが配列で一覧化されていて、順に有効なものを探しているようです。
そのため、例えばNodeのランタイムが有効だったとしても、MiniRacerが有効であれば、MiniRacerが優先されるようです。

14
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
5