Ruby 資料一覧

RubyからJavaScriptのコードを実行する方法(ExecJS + mini_racer)

2019/06/26更新

対応バージョン: ruby-2.5.1p57 + execjs-2.7.0 + mini_racer-0.2.6

Rubyスクリプトの中からJavaScriptのコードを実行するにはいくつかの方法があるが、ここではExecJSを使った手順を示す。実行環境のOSはUbuntu 18.04とする。

ExecJSは複数のJavaScriptランタイムを利用できるが、ここではmini_racerを使うものとする。(macOS環境であれば最初からインストールされているJavaScriptCoreが使える)

まず両者をインストールする。

$ sudo gem install execjs
:
Successfully installed execjs-2.7.0
:

$ sudo gem install mini_racer
:
Successfully installed libv8-7.3.492.27.1-x86_64-linux
:
Successfully installed mini_racer-0.2.6
:

使い方としてはexecjsをrequireするだけで、使用するJavaScriptランタイムはExecJSが自動検知(autodetect)する。

require "execjs"

メソッドとしては以下の3種類が用意されている。

exec: コード実行(戻り値なし)
eval: コード実行(戻り値あり)
compile & add: 関数実行(引数渡し)

それぞれ実例を示す。

コード実行(戻り値なし)
puts ExecJS.exec("1 + 1")
=> (nil)
コード実行(戻り値あり)
puts ExecJS.eval("2 + 2")
=> 4
関数実行
js = ExecJS.compile("function add() { return 3 + 3 }")
puts js.call("add")
=> 6
関数実行(引数渡し)
js = ExecJS.compile("function add(a, b) { return a + b }")
puts js.call("add", 4, 4)
=> 8
関数実行(外部ファイル読み込み)

(JavaScript) ... hello.js

function add(a, b) {
  return a + b;
} 

(Ruby)

js = ExecJS.compile(File.read("hello.js"))
puts js.call("add", 5, 5)
=> 10