## Choosing a mode

| Whole program | Separate
Build speed | Slower (recompiles everything) | Faster (incremental builds)
Output size | Smaller (dead code elimination) | Larger
Runtime speed | Faster (cross-module optimizations) | Slower

Recommendation: Use separate compilation during development for fast iteration, and whole program compilation for production releases.

## Whole program compilation

This is the simplest mode. Compile your bytecode executable directly:

    js_of_ocaml program.byte -o program.js

Some libraries require additional runtime files. See JavaScript primitives for how to discover them.

The compiler performs global dead-code elimination and cross-module optimizations, producing smaller and faster output.

## Separate compilation

Separate compilation involves three steps: build the runtime, compile units, and link.

### 1. Build the runtime

    js_of_ocaml build-runtime -o runtime.js

Some libraries require additional runtime files. See JavaScript primitives for how to discover them.

### 2. Compile units and libraries

    js_of_ocaml mymodule.cmo           # generates mymodule.js
    js_of_ocaml mylib.cma              # generates mylib.js
    js_of_ocaml mylib.cma -o lib.js    # generates lib.js

### 3. Link

Concatenate all JavaScript files in dependency order:

    js_of_ocaml link runtime.js stdlib.js mylib.js mymodule.js std_exit.js -o program.js

Note: Unlike OCaml linking, you must explicitly include `stdlib.js` and `std_exit.js`.

## Dune integration

Dune handles compilation mode automatically based on the build profile:

Profile | Mode
`dev` (default) | Separate compilation
`release` | Whole program compilation

To build with a specific profile:

    dune build --profile release

Or configure the default in `dune-project` or `dune-workspace`.

See dune documentation for details.

## Source maps with separate compilation

For source maps in separate compilation mode, use inline source maps:

    js_of_ocaml --source-map-inline mymodule.cmo

The `link` command will merge source maps automatically.

## See also

- Command-line options — Full list of compiler flags
- JavaScript primitives — Runtime files and custom primitives