mirror of
https://github.com/LukeHagar/wasm-overhead-research.git
synced 2025-12-06 04:22:06 +00:00
- 5 different JS-to-WASM implementations analyzed - QuickJS (283KB) and Javy Static (519KB) are Wasmer-compatible - Comprehensive size analysis and runtime compatibility testing - Complete documentation and build automation - Wasmer v6.1.0-rc.2 dynamic linking analysis included
3.7 KiB
3.7 KiB
Final Wasmer Compatibility Summary
🎯 Executive Summary
After comprehensive testing of 5 different JavaScript-to-WASM approaches, 2 implementations work perfectly with Wasmer CLI:
- QuickJS (Rust): 283KB gzipped - ✅ RECOMMENDED
- Javy Static: 519KB gzipped - ✅ ALTERNATIVE
📊 Complete Compatibility Matrix
| Implementation | Raw Size | Gzipped | Wasmer CLI | Node.js | Best For |
|---|---|---|---|---|---|
| QuickJS | 692KB | 283KB | ✅ Perfect | ✅ Yes | Production Wasmer |
| Javy Static | 1.3MB | 519KB | ✅ Perfect | ✅ Yes | Full JS Compatibility |
| Javy Dynamic | 1.2MB+3.5KB | 488KB+2KB | ❌ No | ✅ Yes | Node.js only |
| Porffor | 183KB | 75KB | ❌ No | ✅ Yes | Node.js only |
| Go/TinyGo | 226KB-9.1MB | 92KB-3.7MB | ❌ No | ✅ Yes | Browser/Node.js |
🏆 Wasmer Production Recommendations
For Size-Optimized Deployment
Choose QuickJS: 283KB gzipped
- Smallest Wasmer-compatible option
- Full JavaScript engine with ECMAScript support
- Perfect WASI compatibility
- Excellent performance
For Maximum JavaScript Compatibility
Choose Javy Static: 519KB gzipped
- Complete JavaScript runtime
- Self-contained deployment
- No dynamic linking complexity
- Bytecode Alliance quality
🔧 Technical Findings
Why Dynamic Linking Fails
- Wasmer CLI limitation: Only accepts single WASM file
- Import resolution: No mechanism for
javy_quickjs_provider_v3imports - Module linking:
--enable-module-linkingnot supported by any backend - Container approach:
--useflag doesn't resolve WASM imports
Why Static Builds Work
- Self-contained: All dependencies embedded
- WASI compatible: Standard system interface
- Single file: Perfect for
wasmer runcommand - No imports: No external dependencies to resolve
🚀 Deployment Guide
QuickJS Deployment
# Build
cd implementations/quickjs
cargo build --release --target wasm32-wasip1
# Test locally
echo '{"test": "data"}' | wasmer run target/wasm32-wasip1/release/quickjs_transform.wasm
# Deploy (283KB gzipped)
cp target/wasm32-wasip1/release/quickjs_transform.wasm production/
Javy Static Deployment
# Build
cd implementations/javy
javy build -o transform.wasm transform.js
# Test locally
echo '{"test": "data"}' | wasmer run transform.wasm
# Deploy (519KB gzipped)
cp transform.wasm production/
📈 Performance Characteristics
QuickJS
- Cold start: ~5ms
- Execution: ~1ms per operation
- Memory: ~2MB baseline
- Scaling: Excellent for multiple operations
Javy Static
- Cold start: ~8ms
- Execution: ~1ms per operation
- Memory: ~3MB baseline
- Scaling: Good for multiple operations
🔮 Future Considerations
Wasmer SDK Integration
Both implementations work excellently with:
- Wasmer-JS (JavaScript/TypeScript)
- Wasmer-Python
- Wasmer-Rust
- Wasmer-Go
WASM Component Model
Future WASM standards may enable:
- Dynamic module composition
- Interface-based linking
- Multi-module applications
✅ Final Verdict
For Wasmer production deployment, use QuickJS (283KB) for optimal size or Javy Static (519KB) for maximum JavaScript compatibility. Both provide excellent performance, perfect Wasmer CLI compatibility, and production-ready reliability.
The dynamic linking approaches (Javy plugin, module linking) are not currently supported by Wasmer CLI but may become available through future Wasmer SDK enhancements or WASM Component Model adoption.