We are proud to announce an immediate availability of Opal 1.4!
Opal is a Ruby to JavaScript (ES5) compiler allowing you to write frontend code in pure Ruby (and a lot more!).
This version of Opal is about compatibility with Ruby 3.1 and lots of internal improvement around performance, code size, and readability of the generated code. Opal 1.3 was released just about 2 months ago, but we really wanted to get 3.1-level compatibility out around the time Ruby 3.1 is released this Christmas.
As always, you don't need to run Opal with Ruby 3.1 to benefit from the 3.1-level features, Ruby 2.6 will do just fine :)
New Ruby 3.1 features
Class#subclasses
, Class#descendants
, syntax like h = {a:}
is all supported, along with a lot of other Ruby 3.1 features. You can take a look at our changelog or Ruby 3.1 release notes to read about all the new features we have. Big thanks to the people working on whitequark/parser - their hard work made this possible - it didn't require from us any effort to support the new syntax features!
We also added some features from older versions of Ruby that we missed. For example: Kernel#local_variables
and Enumerator::ArithmeticSequence
.
Generated size optimization
Despite the fact, that we added a lot of features, Opal 1.4 is 20% smaller than Opal 1.3 (minified) and just a little bit larger than Opal 1.0.0. Your web applications should be about 10% - 20% smaller uncompressed, which should directly translate to better performance and load times. Please take a look at our blog post if you are interested in how we achieved this. In addition to that the produced code is way more readable than before.
Jan Biedermann who develops isomorfeus, a Preact-based framework using Opal reported the following numbers:
1.3.2 1.4.0.alpha1
Max asset sizes: minified: 600kb 502kb
gzip: 150kb 132kb
isomorfeus-redux require time: 19ms 19ms
isomorfeus-preact require time: 52ms 46ms
isomorfeus-preact start_app! time: 6ms 7ms
application load_time: 78ms 73ms
10000 Native DIV Elements took: 10ms 8ms
10000 DIV Elements (S p) took: 78ms 77ms
10000 DIV Elements (S b) took: 95ms 78ms
10000 Native Components took: 115ms 95ms
10000 Function Components took: 203ms 192ms
10000 Preact Components took: 181ms 160ms
10000 Lucid Funcs took: 318ms 306ms
10000 Lucid Components took: 367ms 339ms
10000 Styled Lucid Comp took: 469ms 433ms
10000 Themed and Styled LC took: 505ms 473ms
PromiseV2
is now declared stable!
From my personal experience, it's very simple to replace the old Promise
with the new PromiseV2
and I didn't have any issues. While in Opal 1.2 and 1.3 it was a developer preview, we now declare it as stable and a recommended way to do Promise
s.
Conclusion
Merry Christmas everyone and we hope that Opal 1.4 will be a present you will all enjoy!