Warning: Reason support is experimental. We are looking for beta-tester and contributors.

How to build a toplevel

First, initialize the toplevel using Js_of_ocaml_toplevel.JsooTop.initialize.

Then, build your bytecode program with debug enabled (-g) and linkall (-linkall). You should obviously link in all the libraries you want accessible in the final toplevel.

Finaly, compile your toplevel to JavaScript passing the --toplevel flags to the js_of_ocaml compiler.

If you want to limit the set of modules available in the toplevel, you can explicitly pass a list of compilation units that should be accessible using the --export FILE flag. FILE must contain names of compilation unit to export - one per line. The jsoo_listunits tool, provided by the js_of_ocaml-toplevel opam package, can be used to generate this list from a set of findlib libraries.

For example, the following command will create a file FILE containing all compilation unit names provided by the findlib libraries stdlib and str.

  jsoo_listunits -o FILE stdlib str

Note that toplevels currently cannot be built using separate compilation.

How to build a program using the Dynlink library

OCaml supports dynlink of bytecode files using the dynlink library. In order to work when compiled to JavaScript, one need to follow the following steps:

First, make sure to link js_of_ocaml-compiler.dynlink to initialize the support for dynlink (the initialization is done automatically by side-effect).

Then, build your bytecode program with debug enabled (-g) and linkall (-linkall).

Finaly, compile your program to JavaScript passing the --dynlink flags to the js_of_ocaml compiler.

Here is an example showing how to compile and use a program using Dynlink:

  # cat main.ml
  let () = Dynlink.loadfile "./plugin.cmo"

  # Compiling main program
  ocamlfind ocamlc -linkpkg -package dynlink -package js_of_ocaml-compiler.dynlink main.ml -o main.bc
  js_of_ocaml main.bc --dynlink

  # Compiling plugin
  ocamlfind ocamlc -c plugin.ml

  # Test
  node ./main.js