ExecJSはRubyからJavaScriptのプログラムを実行できるようにしてくれますが、プログラムを実行するランタイムは以下のようにベストなものを自動で選択してくれるようです。
It automatically picks the best runtime available to evaluate your JavaScript program
逆に自分が意図したランタイムを設定したいときにはどうしたらいいのか、どう自動で選択してくれているのかが気になったので確認してみました。
version
execjs v2.8.1
結論
意図したものを選択させるには以下のどちらかを行う
- 環境変数 (
EXECJS_RUNTIME
) を設定する - 自動読み込みの優先順位を確認し、他に優先度が高いランタイムが存在しないか確認する
ランタイムの読み込み部分のコードを読んでいく
ExecJSのコードはとてもシンプルなので、コードを読むのが早いです。
module ExecJS
self.runtime ||= Runtimes.autodetect
end
まずlib/execjs.rb
を見て、Runtimes.autodetect で自動検出していそうなので、lib/execjs/runtimes.rb#L56を見てみます。
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が優先されるようです。