Opal
by Hubert Łępicki
Opal.rb ? Opal.js ?
- Opal is Ruby to JavaScript compiler
- Opal is written in Ruby
- Opal is dialect of Ruby itself
- Files writtein in Opal have extension .rb or .opal
- Files written in Opal are compiled server-side
- On the client-side pure JavaScript is executed
Why?
- JavaScript sucks big time
- No, seriously
- It was written in 10 days
- The author is homophobic (related?)
- "JavaScript - The good parts" has ~115 pages
- It is a fucking joke NaNNaNNaNNaNNaN
- People do not want to deal with it anymore
Seriously it's bad
- Google started Dart
- Google has Java to JavaScript compiler
- JavaScript has been generated by many frameworks just that the developers do not need to touch it
- Coffeescript is popular
- Over 50 other languages that compile to JavaScript were developed
https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS
Opal + Rails
# Gemfile
gem 'opal-rails'
# app/assets/javascripts/application.js
//= require opal
//= require opal_ujs
//= require_tree .
# app/asset/javascripts/my_app.js.opal
puts "Hello, good sirs!" # check the console!
require 'opal-jquery'
Document.ready? do
Element.find('h1').html = 'Manipulating DOM like a sir!'
end
Wat?
- In your template you include application.js
- Request goest to Sprockets
- Sprockets processes application.js and includes Opal-to-JavaScript DOM bindings
- Sprockets processes my_app.js.opal and compiles it's contents to JavaScript
- Pure JavaScript is served to the client
Browser API and Bindings
- Opal comes with DOM API built-in, classes as Document, Element are pre-defined
- Opal wraps standard JavaScript classes into more Ruby-esque API, i.e. Array implements Enumerable
- opal-jquery provides simple jQuery bindings
- It is possible to call other JavaScript in-line with something like `window.alert('foo');`
What works
- a lot!
- classes, inheritance, modules
- instance/class variables, attr_accessor, super
- method_missing
- reflection - is_a? kind_of? etc.
- basic Ruby interfaces are implemented (i.e. Enumerable, Hash, Array, Proc)
- procs and lambdas
- self and method execution context is fixed
- blocks
In Action
class User
attr_accessor :name
def initialize(name)
@name = name
end
def admin?
@name == 'Admin'
end
end
user = User.new('Bob')
m = user.method(:admin?)
puts m
puts m.call
puts m.is_a?(Array)
The Cool Stuff
- Opal is best used with Rails
- Support for ERB and Haml on client-side (one-way bindings only)
- Some client-side MVC frameworks start to emerge (Vienna)
- Some client-and-frontend side frameworks start to appear (https://github.com/voltrb/volt)
- Bi-directional calls: Opal to JavaScript (``) and JavaScript to Opal (Opal.Foo.$new().$bar() etc.)
- RSpec implementation in browser
- It works!
What Is missing
- Thread and stuff
- File/IO
- rubygems
- DRB
- Major parts of Ruby STD lib
What I THink of it
- cool
- useful already for small projects
- needs better client-side MVC framework
- would be much cooler if was compiled on client-side (like Amber Smalltalk)
- could be compiled to asm.js instead of JavaScript
Try iT
http://opalrb.org/try/
Thanks!
Opal
By Hubert Łępicki
Opal
- 1,679