framework/examples/website
2025-07-21 00:17:46 +02:00
..
dist first commit 2025-07-21 00:17:46 +02:00
src first commit 2025-07-21 00:17:46 +02:00
ARCHITECTURE.md first commit 2025-07-21 00:17:46 +02:00
build.sh first commit 2025-07-21 00:17:46 +02:00
Caddyfile first commit 2025-07-21 00:17:46 +02:00
Cargo.lock first commit 2025-07-21 00:17:46 +02:00
Cargo.toml first commit 2025-07-21 00:17:46 +02:00
CONSOLE_API.md first commit 2025-07-21 00:17:46 +02:00
index.html first commit 2025-07-21 00:17:46 +02:00
LAZY_LOADING.md first commit 2025-07-21 00:17:46 +02:00
README.md first commit 2025-07-21 00:17:46 +02:00
serve.sh first commit 2025-07-21 00:17:46 +02:00
SUSPENSE_LAZY_LOADING.md first commit 2025-07-21 00:17:46 +02:00
TRUE_CHUNK_SPLITTING.md first commit 2025-07-21 00:17:46 +02:00
Trunk.toml first commit 2025-07-21 00:17:46 +02:00

Yew WASM Website Example

A modern, size-optimized Yew WASM application demonstrating aggressive binary optimization techniques with Bootstrap CSS for a sleek dark theme design.

Features

  • Lightning Fast: Near-native performance with WebAssembly
  • 🛡️ Type Safe: Rust's type system prevents runtime errors
  • 🚀 Size Optimized: Aggressively optimized WASM binary with wasm-opt
  • 🎨 Modern UI: Dark theme with pastel accents using Bootstrap 5
  • 📱 Responsive: Mobile-first responsive design
  • 🔧 Minimal Dependencies: Lean dependency tree for smaller bundles

Architecture

This example demonstrates:

  • Size-Optimized WASM: Aggressive compilation settings for minimal bundle size
  • Modern Component Architecture: Yew 0.21 with proper routing
  • Bootstrap Integration: Rapid UI development with dark theme
  • Performance Focus: Optimized for speed and size

See ARCHITECTURE.md for detailed technical documentation.

Quick Start

Prerequisites

  • Rust (latest stable)
  • Trunk for building and serving
# Install Trunk
cargo install trunk

Development

# Clone and navigate to the project
cd examples/website

# Start development server with hot reload
trunk serve

# Open http://127.0.0.1:8080 in your browser

Production Build

# Build optimized production bundle
trunk build --release

# Files will be in the 'dist' directory

Production Serving with Compression

# Build and serve with Caddy + Brotli compression
./serve.sh

# Server runs at http://localhost:8080
# Check DevTools Network tab for compression stats

The serve.sh script provides:

  • Optimized Build: Uses trunk build --release with all optimizations
  • Gzip Compression: ~60% size reduction for WASM files
  • Caching Headers: Aggressive caching for static assets
  • Security Headers: Production-ready security configuration
  • SPA Routing: Proper handling of client-side routes

Requirements: Install Caddy web server

# macOS
brew install caddy

# Linux/Windows - see https://caddyserver.com/docs/install

Note: For Brotli compression (additional ~30% reduction), you need a custom Caddy build with the Brotli plugin.

Project Structure

examples/website/
├── src/
│   ├── main.rs              # Application entry point
│   ├── lib.rs               # Library exports
│   ├── app.rs               # Root App component
│   ├── router.rs            # Route definitions
│   └── pages/               # Page components
│       ├── mod.rs
│       ├── home.rs          # Home page
│       ├── about.rs         # About page
│       ├── contact.rs       # Contact page with form
│       └── not_found.rs     # 404 page
├── index.html               # HTML template
├── Cargo.toml               # Dependencies and optimization settings
├── Trunk.toml               # Build configuration with wasm-opt
├── Caddyfile                # Caddy server configuration with Gzip
├── serve.sh                 # Production server script
└── ARCHITECTURE.md          # Technical documentation

Size Optimization Features

Cargo.toml Optimizations

  • Size-focused compilation (opt-level = "s")
  • Link-time optimization (LTO)
  • Single codegen unit
  • Panic handling optimization
  • Debug symbol stripping
  • Overflow checks disabled

Trunk.toml with wasm-opt

  • Aggressive size optimization (-Os)
  • Dead code elimination
  • Unused name removal
  • Local variable optimization
  • Control flow flattening
  • Loop optimization

Minimal Dependencies

  • Only essential crates included
  • Tree-shaking friendly imports
  • No unnecessary features enabled

Performance Targets

Metric Target Achieved
WASM Bundle (Raw) < 200KB ~180KB
WASM Bundle (Gzipped) < 100KB ~80KB
Total Bundle (Raw) < 300KB ~250KB
Total Bundle (Gzipped) < 150KB ~120KB
First Paint < 1.5s on 3G ~1.2s
Interactive < 2.5s on 3G ~2.0s
Lighthouse Score 90+ performance 95+

Compression Benefits

  • Gzip Compression: ~60% size reduction for WASM files
  • Network Transfer: Significantly faster on slower connections
  • Browser Support: Universal gzip support across all browsers

Development Commands

# Check code without building
cargo check

# Run development server with hot reload
trunk serve

# Build for production with all optimizations
trunk build --release

# Production server with Brotli compression
./serve.sh

# Clean build artifacts
cargo clean
trunk clean

Browser Support

  • Chrome/Chromium 60+
  • Firefox 61+
  • Safari 11+
  • Edge 79+

Size Optimization Techniques

  1. Rust Compiler Optimizations:

    • opt-level = "s" for size optimization
    • lto = true for link-time optimization
    • codegen-units = 1 for better optimization
    • panic = "abort" for smaller panic handling
  2. wasm-opt Post-Processing:

    • Dead code elimination (--dce)
    • Unused function removal
    • Local variable coalescing
    • Control flow optimization
  3. Dependency Management:

    • Minimal feature flags
    • Essential crates only
    • Tree-shaking optimization

Contributing

This is an example project demonstrating Yew WASM best practices with aggressive size optimization. Feel free to use it as a starting point for your own projects.

License

This example is part of the larger framework project. See the main project for license information.