Skip to content

Commit 2652f5a

Browse files
committed
Add all relevant changes from previous 2020 bundle API
For reference on the previous work in 2020, refer to rescript-lang#4518
1 parent f5a2dfe commit 2652f5a

File tree

4 files changed

+789
-117
lines changed

4 files changed

+789
-117
lines changed

CONTRIBUTING.md

+30-22
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,17 @@ This is usually the file you want to create to test certain compile behavior wit
194194
- Verify the output, check in the `jscomp/test/my_file_test.ml` and `jscomp/test/my_file_test.js` to version control. The checked in `.js` file is essential for verifying regressions later on.
195195
- Eventually check in other relevant files changed during the rebuild (depends on your compiler changes).
196196

197-
## Contribute to the BS Playground Bundle
197+
## Contribute to the ReScript Playground Bundle
198198

199199
> Note: These instructions are designed for building the 4.06 based version of ReScript (ReScript v6).
200200
201201
The "Playground bundle" is the BS compiler compiled to JavaScript, including all necessary dependency files (stdlib / belt etc). It is useful for building tools where you want to compile and execute arbitrary Reason / OCaml in the browser.
202202

203-
The ReScript source code is compiled with a tool called [JSOO (js_of_ocaml)](https://ocsigen.org/js_of_ocaml/3.5.1/manual/overview), which uses OCaml bytecode to compile to JavaScript and is part of the bigger OCaml ecosystem. Before we can compile anything, we need to install the required tools (requires [`opam`](https://opam.ocaml.org/doc/Install.html) to be installed):
203+
The ReScript source code is compiled with a tool called [JSOO (js_of_ocaml)](https://ocsigen.org/js_of_ocaml/3.6.0/manual/overview), which uses OCaml bytecode to compile to JavaScript and is part of the bigger OCaml ecosystem.
204+
205+
We actually ship a bytecode version of `js_of_ocaml`, so you actually don't need to install any third party dependencies. This is usually for basic usage if you don't care about the compilation speed or a fast feedback loop (e.g. CI).
206+
207+
For faster compilation times, we recommend to install a proper `jsoo` executable:
204208

205209
```sh
206210
# Create the right switch, if not created yet (first install)
@@ -210,18 +214,25 @@ opam switch create 4.06.1
210214
opam switch 4.06.1
211215
eval `opam config env`
212216

213-
opam install js_of_ocaml.3.5.1
217+
opam install js_of_ocaml.3.6.0
218+
```
219+
220+
Additionally, make sure to adapt the `scripts/repl.js` file to use the `js_of_ocaml` binary instead (otherwise you'll continue using the slower bytecode version):
221+
222+
```diff
223+
- e(`${OCAMLRUN} ${JSOO} compile jsc.byte ${jsooFlag}-o exports.js`);
224+
+ e(`js_of_ocaml compile jsc.byte ${jsooFlag}-o exports.js`);
214225
```
215226

216-
### Build the Bundle
227+
### Building the Bundle
217228

218-
The entry point of the JSOO bundle is located in `jscomp/main/jsoo_main.ml` and the script for running JSOO can be found in `scripts/repl.js`. A full clean build can be done like this:
229+
The entry point of the JSOO bundle is located in `jscomp/main/jsoo_refmt_main.ml` and the script for running JSOO can be found in `scripts/repl.js`. A full clean build can be done like this:
219230

220231
```
221232
# We create a target directory for storing the bundle / stdlib files
222233
mkdir playground && mkdir playground/stdlib
223234
224-
# We build the ReScript source code and also the bytecode for jsoo_main.ml
235+
# We build the ReScript source code and also the bytecode for jsoo_refmt_main.ml
225236
node scripts/ninja.js config && node scripts/ninja.js build
226237
227238
# Now we run the repl.js script pointing to our playground directory (note how it needs to be relative to the repl.js file)
@@ -230,7 +241,7 @@ BS_PLAYGROUND=../playground node scripts/repl.js
230241

231242
_Troubleshooting: if ninja build step failed with `Error: cannot find file '+runtime.js'`, make sure `ocamlfind` is installed with `opam install ocamlfind`._
232243

233-
**You should now find following files:**
244+
After a successful compilation, you will find following files in your project:
234245

235246
- `playground/exports.js` -> This is the ReScript compiler, which binds the ReScript API to the `window` object.
236247
- `playground/stdlib/*.js` -> All the ReScript runtime files.
@@ -240,31 +251,28 @@ You can now use the `exports.js` file either directly by using a `<script src="/
240251
```
241252
$ node
242253
> require("./exports.js");
243-
undefined
244-
> let compile_result = ocaml.compile(`Js.log Sys.ocaml_version`); // You can change the code here
245-
undefined
246-
> eval(compile_result);
254+
> let compiler = rescript_compiler.make()
255+
> let result = compiler.rescript.compile(`Js.log(Sys.ocaml_version)`);
256+
> eval(result);
247257
4.06.2+BS
248-
undefined
249258
```
250259

251260
### Playground JS bundle API
252261

253-
As soon as the bundle is loaded, you will get access to following functions (as seen in [`jsoo_main.ml`](jscomp/main/jsoo_main.ml)):
262+
As soon as the bundle is loaded, you will get access to the functions exposed in [`jsoo_refmt_main.ml`](jscomp/refmt/jsoo_refmt_main.ml). Best way to check out the API is by inspecting a compiler instance it either in node, or in the browser:
254263

255-
- `window.ocaml`:
256-
- `compile(code: string)`: Compiles given code
257-
- `shake_compile(code: string)`: Compiles given code with tree-shaking
258-
- `compile_super_errors(code: string)`: Compiles given code and outputs `super_errors` related messages on `console.error`
259-
- `compile_super_errors_ppx_v2(code: string)`: Compiles given code with the React v2 syntax
260-
- `compile_super_errors_ppx_v3(code: string)`: Compiles given code with the React v3 syntax
261-
- `load_module(cmi_path: string, cmi_content: string, cmj_name: string, cmj_content: string)`: Loads a module into the compiler (see notes on `cmj` / `cmi` below)
264+
```
265+
$ node
266+
require('./exports.js')
267+
268+
> let compiler = rescript_compiler.make()
269+
> console.log(compiler)
270+
```
262271

263-
For each compile every successful operation will return `{js_code: string}`. On compile errors, the returned object will be `{js_error_msg: string}`.
264272

265273
### Working on the Playground JS API
266274

267-
Whenever you are modifying any files in the ReScript compiler, or in the `jsoo_main.ml` file, you'll need to rebuild the source and recreate the JS bundle.
275+
Whenever you are modifying any files in the ReScript compiler, or in the `jsoo_refmt_main.ml` file, you'll need to rebuild the source and recreate the JS bundle.
268276

269277
```sh
270278
node scripts/ninja.js config && node scripts/ninja.js build

0 commit comments

Comments
 (0)