Skip to content

Latest commit

 

History

History
107 lines (76 loc) · 2.57 KB

File metadata and controls

107 lines (76 loc) · 2.57 KB

JavaScript Interoperability

Data Type Conversions

ElixirScript translates Elixir primitive types to the following:

Elixir JavaScript
Integer Number
Float Number
Binary String
Atom Symbol
List Array
Map Map
Tuple ErlangTypes.Tuple
Bitstring ErlangTypes.Bitstring
PID ErlangTypes.PID
Reference ErlangTypes.Reference

The ErlangTypes library can be found here

ElixirScript Calling JavaScript

ElixirScript.JS module

The ElixirScript.JS module has functions and macros that help with interacting with JavaScript. Most of them correspond to JavaScript keywords that may be useful.

# Calling the JavaScript Debugger
ElixirScript.JS.debugger()

# Getting the type of a value
ElixirScript.JS.typeof(my_value)

Foreign Function Interface

ElixirScript calls JavaScript modules through a Foreign Function Interface (FFI). A foreign module is defined by creating a new Elixir module and adding use ElixirScript.FFI to it.

Here is an example of a foreign module for a JSON module

defmodule MyApp.JSON do
  use ElixirScript.FFI

  defexternal stringify(map)
  defexternal parse(string)
end

Foreign modules map to JavaScript files that export functions defined with the defexternal macro. ElixirScript expects JavaScript modules to be in the priv/elixir_script directory. These modules are copied to the output directory upon compilation.

For our example, a JavaScript file must be placed at priv/elixir_script/my_app/json.js.

It looks like this

export default {
  stringify: JSON.stringify,
  parse: JSON.parse
}

For more information and options. Check the documentation for ElixirScript.FFI

JavaScript Calling ElixirScript

In order to start an ElixirScript application, you must first import it using whichever JavaScript module system you are using and then call Elixir.start

# Our ElixirScript module

defmodule Main do
  def start(:normal, args) do
    args
  end
end
import Main from './Elixir.Main.js'
Main.start(Symbol.for('normal'), [1, 2, 3])

In the above example, we have an ElixirScript module, Main with a start/2 function.

If you want to use an ElixirScript module inside of your JavaScript code, you can do so like below.

# Our ElixirScript module

defmodule MyModule do
  def hi() do
    "hello"
  end
end
import MyModule from './Elixir.MyModule.js'
MyModule.hi()