Best Practices

This guide provides recommendations and best practices for compiling C and C++ to the modern web using WebAssembly and Emscripten.

Following this guide when reporting bugs can also help speed up diagnosing and fixing issues since you will be on the well-trodden path.

In some cases, Emscripten will guide you towards these best practices by emitting warnings, but that is not always possible.

General Recommendations

  • Avoid high-frequency calls between WebAssembly and JavaScript; for example, avoid per-pixel or per-sample calls in favor of operations that process entire memory regions or buffers.

  • Avoid shipping debug information in production; see below for recommended release build flags.

Command-Line Style

Keeping the command line flag usage minimal and consistent helps with codebase understanding and avoids deviating from the well-lit path.

  • Don’t pass settings that are enabled by default. To keep command lines clean and concise, omit redundant options that are already default in modern Emscripten (such as -sWASM=1).

  • Prefer standard compiler flags over Emscripten-specific ones where possible (for example, prefer -pthread over -sUSE_PTHREADS and -m64 over -sMEMORY64).

  • Use simple comma-separated lists for list-based settings (for example, -sEXPORTED_FUNCTIONS=_main,_malloc rather than JSON arrays like -sEXPORTED_FUNCTIONS=['_main','_malloc']).

  • Avoid long lists on the command line; use a response file (@filename) instead (for example, -sEXPORTED_FUNCTIONS=@exported_funcs.txt).

  • Don’t include the “=1” suffix for boolean flags. For example, write -sSTRICT and -sALLOW_MEMORY_GROWTH rather than -sSTRICT=1 or -sALLOW_MEMORY_GROWTH=1.

  • Use separate compilation by compiling .cpp sources to .o object files before linking rather than combining everything into a single monolithic compiler invocation.

Common Pitfalls

Asynchronous Code Execution and Main Thread Blocking

Don’t run long synchronous loops on the browser main thread. The browser uses cooperative multitasking; blocking the main UI thread prevents rendering and freezes the web page.