2011-02-06 15:22:40 -05:00
|
|
|
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](https://github.com/cowboyd/therubyracer) - Google V8
|
2011-06-18 13:59:08 -04:00
|
|
|
embedded within Ruby
|
2011-02-07 11:07:54 -05:00
|
|
|
* [therubyrhino](https://github.com/cowboyd/therubyrhino) - Mozilla
|
|
|
|
Rhino embedded within JRuby
|
2011-02-06 20:39:30 -05:00
|
|
|
* [Node.js](http://nodejs.org/)
|
2011-02-07 11:07:54 -05:00
|
|
|
* Apple JavaScriptCore - Included with Mac OS X
|
2011-02-07 18:04:05 -05:00
|
|
|
* [Microsoft Windows Script Host](http://msdn.microsoft.com/en-us/library/9bbdkx3k.aspx) (JScript)
|
2011-02-06 15:22:40 -05:00
|
|
|
|
|
|
|
A short example:
|
|
|
|
|
2014-05-19 09:56:17 -04:00
|
|
|
``` ruby
|
|
|
|
require "execjs"
|
|
|
|
ExecJS.eval "'red yellow blue'.split(' ')"
|
|
|
|
# => ["red", "yellow", "blue"]
|
|
|
|
```
|
2011-03-10 18:21:55 -05:00
|
|
|
|
|
|
|
A longer example, demonstrating how to invoke the CoffeeScript compiler:
|
|
|
|
|
2014-05-19 09:56:17 -04:00
|
|
|
``` ruby
|
|
|
|
require "execjs"
|
|
|
|
require "open-uri"
|
2014-05-19 09:57:06 -04:00
|
|
|
source = open("http://coffeescript.org/extras/coffee-script.js").read
|
2011-03-10 18:21:55 -05:00
|
|
|
|
2014-05-19 09:56:17 -04:00
|
|
|
context = ExecJS.compile(source)
|
2014-05-19 18:03:58 -04:00
|
|
|
context.call("CoffeeScript.compile", "square = (x) -> x * x", bare: true)
|
2014-05-19 09:56:17 -04:00
|
|
|
# => "var square;\nsquare = function(x) {\n return x * x;\n};"
|
|
|
|
```
|
2011-03-10 18:38:33 -05:00
|
|
|
|
|
|
|
# Installation
|
|
|
|
|
2014-05-19 09:56:17 -04:00
|
|
|
```
|
|
|
|
$ gem install execjs
|
|
|
|
```
|
2011-03-10 18:38:33 -05:00
|
|
|
|
2014-05-19 09:55:24 -04:00
|
|
|
|
|
|
|
# FAQ
|
|
|
|
|
2014-05-19 09:57:51 -04:00
|
|
|
**Why can't I use CommonJS `require()` inside ExecJS?**
|
2014-05-19 09:55:24 -04:00
|
|
|
|
|
|
|
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](https://github.com/cowboyd/commonjs.rb) designed to provide a
|
|
|
|
consistent interface.
|
|
|
|
|
2014-12-23 00:30:32 -05:00
|
|
|
**Why can't I use `setTimeout`?**
|
2014-12-22 21:39:14 -05:00
|
|
|
|
|
|
|
For similar reasons as modules, not all runtimes guarantee a full JavaScript
|
|
|
|
event loop. So `setTimeout`, `setInterval` and other timers are not defined.
|
|
|
|
|
2015-01-20 19:24:58 -05:00
|
|
|
**Why can't I use ES5 features?**
|
|
|
|
|
|
|
|
Some runtimes like Node will implement many of the latest ES5 features. However
|
|
|
|
older stock runtimes like JSC on OSX and JScript on Windows may not. You should
|
|
|
|
only count on ES3 features being available. Prefer feature checking these APIs
|
|
|
|
rather than hard coding support for specific runtimes.
|
|
|
|
|
2014-12-23 00:30:32 -05:00
|
|
|
**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.
|
|
|
|
|
2014-05-19 09:55:24 -04:00
|
|
|
|
2011-03-10 18:38:33 -05:00
|
|
|
# License
|
|
|
|
|
2014-05-19 09:56:39 -04:00
|
|
|
Copyright (c) 2014 Sam Stephenson and Josh Peek.
|
2011-03-10 18:38:33 -05:00
|
|
|
|
|
|
|
Released under the MIT license. See `LICENSE` for details.
|