Rubyスクリプトの中からJavaScriptのコードを実行するにはいくつかの方法があるが、ここではExecJSを使った手順を示す。実行環境のOSはUbuntu 18.04とする。
ExecJSは複数のJavaScriptランタイムを利用できるが、ここではmini_racerを使うものとする。(macOS環境であれば最初からインストールされているJavaScriptCoreが使える)
- ExecJS (GitHub)
- mini_racer (GitHub)
まず両者をインストールする。
$ 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