lib | ||
test | ||
.gitignore | ||
.travis.yml | ||
CONTRIBUTING.md | ||
execjs.gemspec | ||
Gemfile | ||
LICENSE | ||
MAINTAINING.md | ||
Rakefile | ||
README.md |
ExecJS
ExecJS lets you run JavaScript code from Ruby. It automatically picks the best runtime available to evaluate your JavaScript program, then returns the result to you as a Ruby object.
ExecJS supports these runtimes:
- therubyracer - Google V8 embedded within Ruby
- therubyrhino - Mozilla Rhino embedded within JRuby
- Node.js
- Apple JavaScriptCore - Included with Mac OS X
- Microsoft Windows Script Host (JScript)
A short example:
require "execjs"
ExecJS.eval "'red yellow blue'.split(' ')"
# => ["red", "yellow", "blue"]
A longer example, demonstrating how to invoke the CoffeeScript compiler:
require "execjs"
require "open-uri"
source = open("http://coffeescript.org/extras/coffee-script.js").read
context = ExecJS.compile(source)
context.call("CoffeeScript.compile", "square = (x) -> x * x", bare: true)
# => "var square;\nsquare = function(x) {\n return x * x;\n};"
Installation
$ gem install execjs
FAQ
Why can't I use CommonJS require()
inside ExecJS?
ExecJS provides a lowest common denominator interface to any JavaScript runtime. Use ExecJS when it doesn't matter which JavaScript interpreter your code runs in. If you want to access the Node API, you should check another library like commonjs.rb designed to provide a consistent interface.
Why can't I use setTimeout
?
For similar reasons as modules, not all runtimes guarantee a full JavaScript
event loop. So setTimeout
, setInterval
and other timers are not defined.
Can I ExecJS be used to sandbox scripts?
No, ExecJS shouldn't be used for any security related sandboxing. Since runtimes
are automatically detected, each runtime has different sandboxing properties.
You shouldn't use ExecJS.eval
on any inputs you wouldn't feel comfortable Ruby
eval()
ing.
License
Copyright (c) 2014 Sam Stephenson and Josh Peek.
Released under the MIT license. See LICENSE
for details.