# Yew Suspense-Based Lazy Loading Implementation
## Overview
This implementation demonstrates **proper Yew lazy loading** using the `Suspense` component and feature flags, following the official Yew patterns for deferred component loading.
## How It Works
### 1. Feature Flags for Conditional Compilation
```toml
# Cargo.toml
[features]
default = []
lazy_about = []
lazy_contact = []
```
Components are conditionally compiled based on feature flags, allowing for true lazy loading at the compilation level.
### 2. Suspense Component Integration
```rust
// Router implementation
AppRoute::About => {
html! {
{
#[cfg(feature = "lazy_about")]
{
use lazy_about::LazyAbout;
html!{}
}
#[cfg(not(feature = "lazy_about"))]
{
html! { }
}
}
}
}
```
### 3. Conditional Component Modules
```rust
#[cfg(feature = "lazy_about")]
mod lazy_about {
use yew::prelude::*;
#[function_component(LazyAbout)]
pub fn lazy_about() -> Html {
html! {
{"I am a lazy loaded component!"}
}
}
}
```
## Build Commands
### Development (All Features Enabled)
```bash
# Build with all lazy loading features
cargo build --features "lazy_about,lazy_contact"
trunk serve --features "lazy_about,lazy_contact"
```
### Production Builds
**Minimal Build (No Lazy Loading)**:
```bash
trunk build --release
# Only home page and fallback components included
```
**Selective Lazy Loading**:
```bash
# Include only About page lazy loading
trunk build --release --features "lazy_about"
# Include only Contact page lazy loading
trunk build --release --features "lazy_contact"
# Include both lazy components
trunk build --release --features "lazy_about,lazy_contact"
```
## Benefits of This Approach
### 1. **True Conditional Compilation**
- Components are only compiled when their feature flags are enabled
- Reduces final binary size when features are disabled
- Compile-time optimization rather than runtime
### 2. **Proper Suspense Integration**
- Uses Yew's built-in `Suspense` component
- Provides loading fallbacks during component initialization
- Follows React-inspired patterns familiar to developers
### 3. **Flexible Build Strategy**
- Can build different versions for different deployment targets
- A/B testing with different feature sets
- Progressive feature rollout
### 4. **Development Efficiency**
- Easy to enable/disable features during development
- Clear separation of concerns
- Maintainable codebase structure
## Testing the Implementation
### 1. **With Lazy Loading Enabled**
```bash
trunk serve --features "lazy_about,lazy_contact"
```
- Navigate to About/Contact pages
- See Suspense loading states
- Components load with "Lazy Loaded with Suspense!" alerts
### 2. **Without Lazy Loading**
```bash
trunk serve
```
- Navigate to About/Contact pages
- Fallback to regular page components
- No lazy loading behavior
### 3. **Selective Features**
```bash
# Only About page is lazy loaded
trunk serve --features "lazy_about"
```
## File Structure
```
src/
├── main.rs # Main app with Suspense routing
├── pages/
│ ├── home.rs # Always loaded (eager)
│ ├── about.rs # Fallback component
│ ├── contact.rs # Fallback component
│ └── not_found.rs # Always loaded
└── lazy components defined inline in main.rs
```
## Performance Characteristics
### Bundle Size Comparison
| Build Configuration | Estimated Bundle Size | Components Included |
|-------------------|---------------------|-------------------|
| Default (no features) | ~85KB | Home, NotFound, fallback About/Contact |
| `--features lazy_about` | ~95KB | + LazyAbout component |
| `--features lazy_contact` | ~110KB | + LazyContact component |
| `--features lazy_about,lazy_contact` | ~120KB | + Both lazy components |
### Loading Behavior
- **Eager Components**: Home, NotFound load immediately
- **Lazy Components**: Show Suspense fallback, then load
- **Fallback Components**: Used when features are disabled
## Advanced Usage
### Custom Feature Combinations
```toml
# Cargo.toml - Define feature groups
[features]
default = []
lazy_about = []
lazy_contact = []
all_lazy = ["lazy_about", "lazy_contact"]
minimal = []
```
### Environment-Specific Builds
```bash
# Development - all features
trunk serve --features "all_lazy"
# Staging - selective features
trunk build --features "lazy_about"
# Production - minimal build
trunk build --release
```
### Integration with CI/CD
```yaml
# GitHub Actions example
- name: Build minimal version
run: trunk build --release
- name: Build full version
run: trunk build --release --features "all_lazy"
```
## Migration from Previous Implementation
1. **Remove simulation code**: No more `gloo::timers` delays
2. **Add feature flags**: Define in Cargo.toml
3. **Wrap in Suspense**: Use proper Yew Suspense components
4. **Conditional compilation**: Use `#[cfg(feature = "...")]`
5. **Update build commands**: Include feature flags
## Best Practices
1. **Feature Naming**: Use descriptive feature names (`lazy_about` vs `about`)
2. **Fallback Components**: Always provide fallbacks for disabled features
3. **Loading States**: Design meaningful loading components
4. **Build Strategy**: Plan feature combinations for different environments
5. **Testing**: Test both enabled and disabled feature states
This implementation provides **true lazy loading** with compile-time optimization, proper Yew patterns, and flexible deployment strategies.