Help us understand the problem. What is going on with this article?

RubyからJavaScriptを呼び出す〜ExecJS〜

More than 3 years have passed since last update.

Rubyから他言語を呼び出す記事が話題となっていますが、今回は「速さ」目的ではなくJavaScriptを呼び出す、ExecJS gemについて取り上げてみます。

RubyからJavaScriptを呼ぶ場面

Webのフロントエンド側で使える唯一の言語ということで、JavaScriptのポジションに代わるような言語は存在しないのですが、さらにはNode.jsのようなローカル側で実行する環境が整ったこともあって、Web向けのビルドプロセスも多くがJavaScriptで構成されるようになっています。

Railsを使っていても、CoffeeScriptやLESSのコンパイルなど、JavaScriptを使った処理が必要になる場面がちょくちょく発生します。

ExecJSとは?

以上のように、RubyからJavaScriptを実行する必要が生じる場面がいくつかありますが、Ruby自体にJavaScriptの実行機能はもちろんありません。そして、JavaScript環境を作る方法も複数あって、それぞれを組み合わせていては組み合わせ爆発を起こしてしまいます。

ということで、各種のJavaScript環境を抽象化して、同じインターフェースで扱えるようにしているのがExecJSです。他にも、MultiJSONのように、「ランタイム抽象化」のためのGemはいろいろ存在しています。

使えるランタイム

ExecJSで使えるランタイムは、以下のようになっています。

  • therubyracer
    • GoogleのV8をラッピングしたGemです。別プロセスを呼ぶ必要がないので高速で動きます。ただ、JavaScriptの処理系ごと含まれたGemなので、Windowsに入れることが極めて困難なほか、Linux系でもインストールに手間取ることがよくあります。なお、CRubyでLESSを使う場合、依存関係上therubyracerが必要となります(LESSではExecJSを経由しません)。
  • therubyrhino
    • Javaで書かれたRhinoをラップするGemです。JRuby専用です(逆に、JRubyの場合はほぼこれ一択でいいでしょう)。
  • Node.js
    • コンピューターにインストールされたNode.jsを呼び出します。
  • JavaScriptCore
    • Mac OS Xに標準で含まれるJavaScriptCoreを呼び出します。
  • WSH
    • Windows Scripting Host経由でJScriptを実行します。

問題点

上に書いたように、ExecJSは各種の環境からJavaScriptの実行環境を選ぶので、どんな環境で実行されるかは状況依存となります。とりわけ、WSHのJScriptについてはES5相当の機能すらないために、CoffeeScriptコンパイラが動かないということになっています。

WindowsでもNode.jsを入れてあればそっちが使われるのでこの問題は回避できますが、「Nodeを入れたらRailsのトラブルが解消する」というのも妙なことに思えました。

外部リンク

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away