docs/compiler_directives.md in opal-0.8.0 vs docs/compiler_directives.md in opal-0.8.1.rc1
- old
+ new
@@ -1,11 +1,9 @@
-# @title Compiler Directives
-
# Compiler Directives
The Opal compiler supports some special directives that can optimize or
-enhance the output of compiled ruby code to suit the ruby environment.
+enhance the output of compiled Ruby code to suit the Ruby environment.
## Require Directive
All calls to `require` are captured so that the compiler and build tools
can determine which dependencies a file has. In the case of `Builder`,
@@ -18,38 +16,38 @@
# foo.rb
require 'bar'
require 'baz'
The compiler will collect these two dependencies, and then `Builder`
-will attempt to discover them within the opal load path to also compile
+will attempt to discover them within the Opal load path to also compile
them into the target output. If these dependencies cannot be resolved,
then a compile time error will be thrown.
#### Dynamic Requires
Opal only supports hard-coded requires. This means that any dynamically
-generated require statemnts cannot be discoeverd. Opal may raise an
+generated require statements cannot be discovered. Opal may raise an
error or just produce a warning if a dynamic require is used. A dynamic
require is any require that cannot be resolved using static analysis. A
-common use case of dynamic requires is to include a directory of ruby
+common use case of dynamic requires is to include a directory of Ruby
files. In this case, see `require_tree` below.
### `require_relative`
-`require_relative` is also supported by opals compiler for ahead-of-time
+`require_relative` is also supported by Opal's compiler for ahead-of-time
inclusion.
# foo.rb
require_relative 'bar'
This example will try to resolve `bar.rb` in the same directory.
### `autoload`
`autoload` is used to load a modules and classes within a modules
-namespace. Aslong as the string argument given to `autoload` can be
-resolved in Opals load paths, in the same way as `require`, then these
+namespace. As long as the string argument given to `autoload` can be
+resolved in Opal's load paths, in the same way as `require`, then these
referenced dependencies will also be compiled.
# foo.rb
module Foo
autoload :Bar, 'bar'
@@ -57,71 +55,79 @@
In this example, `bar.rb` will also be required.
### `require_tree`
-`require_tree` can be used as an Opal friendly alternative to globbing
+`require_tree` can be used as an Opal-friendly alternative to globbing
over a directory to require a list of dependencies.
# foo.rb
require_tree './models'
This will, at compile time, resolve all files inside the `models/`
directory and also compile them to the output. At runtime this method
will then loop over all modules defined, and require them if they match
that given module path.
-Note: The given directory **must** be inside Opals load path, otherwise
+Note: The given directory **must** be inside Opal's load path, otherwise
no files will be compiled.
-### Handling non-ruby requirements
+### Handling non-Ruby requirements
-Opal's `require` method is also special as it allows non-ruby source
+Opal's `require` method is also special as it allows non-Ruby source
files to be required and generated in the output. The obvious example of
-this is requiring javascript source files. Javascript sources are
-treated as first class citizens in Opal. The Opal gem also supports
+this is requiring JavaScript source files. JavaScript sources are
+treated as first class citizens in Opal. The Opal gem also supports
compiling `.erb` files using the same process.
## Opal Specific Code Compilation
A special case `if` and `unless` statements can hide or show blocks of
code from the Opal compiler. These check against `RUBY_ENGINE` or
-`RUBY_PLATFORM`. As these are valid ruby statements against constants
-that exist in all ruby runtimes, they will not affect any running code:
+`RUBY_PLATFORM`. As these are valid Ruby statements against constants
+that exist in all Ruby runtimes, they will not affect any running code:
- if RUBY_ENGINE == 'opal'
- # this code compiles
- else
- # this code never compiles
- end
+```ruby
+if RUBY_ENGINE == 'opal'
+ # this code compiles
+else
+ # this code never compiles
+end
+```
Unless statements are also supported:
- unless RUBY_ENGINE == 'opal'
- # this code will not run
- end
+```ruby
+unless RUBY_ENGINE == 'opal'
+ # this code will not run
+end
+```
+
Also `!=` statements work:
- if RUBY_ENGINE != 'opal'
- puts "do not run this code"
- end
+```ruby
+if RUBY_ENGINE != 'opal'
+ puts 'do not run this code'
+end
+```
-These blocks of code dont run at all at runtime, but they also never
-compile so will never be in the output javascript code. This is
-particularly useful for using code in both mri and Opal.
+These blocks of code don't run at all at runtime, but they also never
+compile so will never be in the output JavaScript code. This is
+particularly useful for using code in both MRI and Opal.
+
Some uses are:
* Avoid `require` statements being picked up by Opal compile time
require handling.
- * To stop certain requires taking place for opal (and vice-versa for
+ * To stop certain requires taking place for Opal (and vice-versa for
shared libraries).
- * To wrap x-strings which might break in compiled javascript output.
+ * To wrap x-strings which might break in compiled JavaScript output.
* To simply avoid compiling large blocks of code that are not needed
- in the javascript/opal version of an app.
+ in the JavaScript/Opal version of an app.
In all these examples `RUBY_PLATFORM` can be used instead of
`RUBY_ENGINE`.