Skip to main content
Compile JavaScript or TypeScript files to standalone WebAssembly binaries.

Usage

porf wasm [flags] input.js output.wasm

Examples

porf wasm script.js output.wasm

Arguments

input.js
string
required
JavaScript or TypeScript source file to compile
output.wasm
string
required
Output WebAssembly binary file path

Compilation Flags

-On
flag
Optimization level (0-3)
  • -O0: No optimizations, fastest compilation
  • -O1: Basic optimizations (default)
  • -O2: Advanced optimizations (partial evaluation)
  • -O3: Maximum optimizations
porf wasm -O3 script.js output.wasm
-d
flag
Include debug information in output
  • Preserves function and variable names
  • Enables debug logs
  • Larger binary size
porf wasm -d script.js debug.wasm
--valtype
string
default:"f64"
Value type for numbers: i32 or f64
porf wasm --valtype=i32 script.js output.wasm

TypeScript Support

-t
flag
Force TypeScript parsing
--parse-types
flag
Enable TypeScript type annotation parsing
--opt-types
flag
Use type annotations for optimization hints
porf wasm --parse-types --opt-types script.ts output.wasm

Advanced Options

--parser
string
default:"acorn"
JavaScript parser: acorn, @babel/parser, meriyah, hermes-parser
--module
flag
Parse input as ES module
--secure
flag
Enable secure mode (disable unsafe features like FFI)
--cyclone
flag
Enable experimental Cyclone optimizer for aggressive constant evaluation
--pgo
flag
Enable profile-guided optimization
--profile-compiler
flag
Log compiler performance metrics (enabled by default when compiling to file)

Output Examples

$ porf wasm script.js output.wasm
compiled in 142.35ms

Wasm Proposals Used

Porffor-generated WebAssembly uses these proposals:
  • Multi-value (required) - Functions returning multiple values
  • Non-trapping float-to-int conversions (required) - Safe number conversions
  • Bulk memory operations (optional) - Efficient memory operations
  • Exception handling (optional) - Error handling support
  • Tail calls (opt-in, off by default) - Tail call optimization

Binary Size Optimization

porf wasm -O3 script.js output.wasm

Using the Output

Porffor does not currently use a standard import format like WASI, so generated Wasm binaries require Porffor’s runtime imports to function.
The generated .wasm file is a spec-compliant WebAssembly module but requires specific imports for I/O operations.

Example: Loading in Node.js

import fs from 'node:fs';

const wasmBuffer = fs.readFileSync('output.wasm');
const wasmModule = await WebAssembly.instantiate(wasmBuffer, {
  // Provide required imports for I/O
});

wasmModule.instance.exports.main();
For standalone executables, use porf native instead to compile to native binaries.

Inspecting Output

# Use -f flag to print disassembled Wasm
porf wasm -f script.js output.wasm

Troubleshooting

Compilation Errors

# Enable debug mode for detailed error messages
porf wasm -d script.js output.wasm

Large Binary Size

# Use maximum optimization
porf wasm -O3 script.js output.wasm

# Remove unused imports (on by default with -O1+)
porf wasm -O2 script.js output.wasm

Runtime Errors

# Create debug build to preserve names
porf wasm -d script.js debug.wasm

# Test execution first
porf script.js  # Run before compiling

Performance Comparison

porf wasm -O0 script.js output.wasm
# Fastest compile time, larger output

Next Steps

Native Compilation

Compile to standalone executables

C Output

Generate C source code

Profile Performance

Analyze compiled code performance

Lambda Deployment

Deploy to AWS Lambda

Build docs developers (and LLMs) love