1
0
Fork 0
mirror of https://github.com/rails/execjs synced 2023-03-27 23:21:20 -04:00
execjs/README.md

86 lines
2.8 KiB
Markdown
Raw Permalink Normal View History

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
embedded within Ruby
2011-02-07 11:07:54 -05:00
* [therubyrhino](https://github.com/cowboyd/therubyrhino) - Mozilla
Rhino embedded within JRuby
2015-04-06 13:04:25 -04:00
* [Duktape.rb](https://github.com/judofyr/duktape.rb) - Duktape JavaScript interpreter
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)
2015-09-08 16:39:06 -04:00
* [Google V8](http://code.google.com/p/v8/)
* [mini_racer](https://github.com/discourse/mini_racer) - Google V8
embedded within Ruby
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
# FAQ
2014-05-19 09:57:51 -04:00
**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](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.
2015-02-28 20:22:44 -05:00
**Can ExecJS be used to sandbox scripts?**
2014-12-23 00:30:32 -05:00
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.
2015-09-01 11:29:15 -04:00
## Contributing to ExecJS
2015-09-01 11:29:15 -04:00
ExecJS is work of hundreds of contributors. You're encouraged to submit pull requests, propose
features and discuss issues.
2011-03-10 18:38:33 -05:00
2015-09-01 11:29:15 -04:00
See [CONTRIBUTING](CONTRIBUTING.md).
2011-03-10 18:38:33 -05:00
2015-09-01 11:29:15 -04:00
## License
ExecJS is released under the [MIT License](MIT-LICENSE).