mirror of
https://github.com/cloud-shuttle/leptos-shadcn-ui.git
synced 2025-12-22 22:00:00 +00:00
390 lines
11 KiB
Bash
Executable File
390 lines
11 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Bundle optimization script for shadcn/ui Leptos components
|
|
# This script implements various optimizations to reduce bundle size
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Helper functions
|
|
print_status() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
print_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
print_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
print_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
# Configuration
|
|
LEPTOS_DIR="book-examples/leptos"
|
|
ANALYSIS_DIR="bundle-optimization"
|
|
TARGET_DIR="target/wasm32-unknown-unknown/release"
|
|
|
|
print_status "Starting bundle optimization process..."
|
|
|
|
# Create analysis directory
|
|
mkdir -p "$ANALYSIS_DIR"
|
|
|
|
# Phase 1: Analyze current bundle
|
|
print_status "Phase 1: Analyzing current bundle..."
|
|
|
|
cd "$LEPTOS_DIR"
|
|
|
|
# Build current version for baseline
|
|
print_status "Building baseline version..."
|
|
trunk build --release
|
|
|
|
# Get baseline sizes (macOS compatible)
|
|
BASELINE_WASM_SIZE=$(stat -f%z "dist/"*.wasm 2>/dev/null | awk '{sum+=$1} END {print sum+0}')
|
|
BASELINE_JS_SIZE=$(stat -f%z "dist/"*.js 2>/dev/null | awk '{sum+=$1} END {print sum+0}')
|
|
BASELINE_CSS_SIZE=$(stat -f%z "dist/"*.css 2>/dev/null | awk '{sum+=$1} END {print sum+0}')
|
|
|
|
print_status "Baseline sizes:"
|
|
print_status " WASM: $((BASELINE_WASM_SIZE / 1024 / 1024))MB"
|
|
print_status " JS: $((BASELINE_JS_SIZE / 1024))KB"
|
|
print_status " CSS: $((BASELINE_CSS_SIZE / 1024))KB"
|
|
|
|
cd - > /dev/null
|
|
|
|
# Phase 2: Implement feature-based compilation
|
|
print_status "Phase 2: Implementing feature-based compilation..."
|
|
|
|
# Create optimized Cargo.toml with minimal features
|
|
cat > "$LEPTOS_DIR/Cargo.optimized.toml" << 'EOF'
|
|
[package]
|
|
name = "shadcn-ui-leptos-book"
|
|
description = "Book examples for shadcn/ui Leptos."
|
|
publish = false
|
|
|
|
authors.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
repository.workspace = true
|
|
version.workspace = true
|
|
|
|
# Production build profiles with aggressive optimization
|
|
[profile.release]
|
|
opt-level = 3
|
|
codegen-units = 1
|
|
strip = true
|
|
incremental = false
|
|
lto = true
|
|
|
|
[profile.release.package."*"]
|
|
opt-level = 3
|
|
codegen-units = 1
|
|
strip = true
|
|
|
|
# Minimal feature set for essential components only
|
|
[features]
|
|
default = ["essential"]
|
|
essential = ["button", "input", "label", "card", "separator"]
|
|
|
|
# Individual component features
|
|
button = ["dep:shadcn-ui-leptos-button"]
|
|
input = ["dep:shadcn-ui-leptos-input"]
|
|
label = ["dep:shadcn-ui-leptos-label"]
|
|
card = ["dep:shadcn-ui-leptos-card"]
|
|
separator = ["dep:shadcn-ui-leptos-separator"]
|
|
|
|
[dependencies]
|
|
console_error_panic_hook.workspace = true
|
|
console_log.workspace = true
|
|
leptos = { workspace = true, features = ["csr"] }
|
|
leptos_router.workspace = true
|
|
log.workspace = true
|
|
|
|
# Only include essential components
|
|
shadcn-ui-leptos-button = { path = "../../packages/leptos/button", optional = true }
|
|
shadcn-ui-leptos-input = { path = "../../packages/leptos/input", optional = true }
|
|
shadcn-ui-leptos-label = { path = "../../packages/leptos/label", optional = true }
|
|
shadcn-ui-leptos-card = { path = "../../packages/leptos/card", optional = true }
|
|
shadcn-ui-leptos-separator = { path = "../../packages/leptos/separator", optional = true }
|
|
EOF
|
|
|
|
# Phase 3: Build optimized version
|
|
print_status "Phase 3: Building optimized version..."
|
|
|
|
cd "$LEPTOS_DIR"
|
|
|
|
# Backup original Cargo.toml
|
|
cp Cargo.toml Cargo.toml.backup
|
|
|
|
# Use optimized Cargo.toml
|
|
cp Cargo.optimized.toml Cargo.toml
|
|
|
|
# Build optimized version
|
|
print_status "Building with minimal features..."
|
|
trunk build --release
|
|
|
|
# Get optimized sizes (macOS compatible)
|
|
OPTIMIZED_WASM_SIZE=$(stat -f%z "dist/"*.wasm 2>/dev/null | awk '{sum+=$1} END {print sum+0}')
|
|
OPTIMIZED_JS_SIZE=$(stat -f%z "dist/"*.js 2>/dev/null | awk '{sum+=$1} END {print sum+0}')
|
|
OPTIMIZED_CSS_SIZE=$(stat -f%z "dist/"*.css 2>/dev/null | awk '{sum+=$1} END {print sum+0}')
|
|
|
|
print_status "Optimized sizes:"
|
|
print_status " WASM: $((OPTIMIZED_WASM_SIZE / 1024 / 1024))MB"
|
|
print_status " JS: $((OPTIMIZED_JS_SIZE / 1024))KB"
|
|
print_status " CSS: $((OPTIMIZED_CSS_SIZE / 1024))KB"
|
|
|
|
# Restore original Cargo.toml
|
|
cp Cargo.toml.backup Cargo.toml
|
|
|
|
cd - > /dev/null
|
|
|
|
# Phase 4: Calculate savings
|
|
print_status "Phase 4: Calculating optimization savings..."
|
|
|
|
WASM_SAVINGS=$((BASELINE_WASM_SIZE - OPTIMIZED_WASM_SIZE))
|
|
WASM_SAVINGS_PERCENT=$((WASM_SAVINGS * 100 / BASELINE_WASM_SIZE))
|
|
|
|
JS_SAVINGS=$((BASELINE_JS_SIZE - OPTIMIZED_JS_SIZE))
|
|
JS_SAVINGS_PERCENT=$((JS_SAVINGS * 100 / BASELINE_JS_SIZE))
|
|
|
|
CSS_SAVINGS=$((BASELINE_CSS_SIZE - OPTIMIZED_CSS_SIZE))
|
|
CSS_SAVINGS_PERCENT=$((CSS_SAVINGS * 100 / BASELINE_CSS_SIZE))
|
|
|
|
print_success "Optimization results:"
|
|
print_status " WASM: $((WASM_SAVINGS / 1024 / 1024))MB saved ($WASM_SAVINGS_PERCENT%)"
|
|
print_status " JS: $((JS_SAVINGS / 1024))KB saved ($JS_SAVINGS_PERCENT%)"
|
|
print_status " CSS: $((CSS_SAVINGS / 1024))KB saved ($CSS_SAVINGS_PERCENT%)"
|
|
|
|
# Phase 5: Generate optimization report
|
|
print_status "Phase 5: Generating optimization report..."
|
|
|
|
cat > "$ANALYSIS_DIR/optimization-report.md" << EOF
|
|
# Bundle Optimization Report
|
|
|
|
Generated: $(date)
|
|
|
|
## Baseline Bundle Sizes
|
|
- WASM: $((BASELINE_WASM_SIZE / 1024 / 1024))MB
|
|
- JavaScript: $((BASELINE_JS_SIZE / 1024))KB
|
|
- CSS: $((BASELINE_CSS_SIZE / 1024))KB
|
|
|
|
## Optimized Bundle Sizes (Essential Components Only)
|
|
- WASM: $((OPTIMIZED_WASM_SIZE / 1024 / 1024))MB
|
|
- JavaScript: $((OPTIMIZED_JS_SIZE / 1024))KB
|
|
- CSS: $((OPTIMIZED_CSS_SIZE / 1024))KB
|
|
|
|
## Optimization Savings
|
|
- WASM: $((WASM_SAVINGS / 1024 / 1024))MB saved ($WASM_SAVINGS_PERCENT%)
|
|
- JavaScript: $((JS_SAVINGS / 1024))KB saved ($JS_SAVINGS_PERCENT%)
|
|
- CSS: $((CSS_SAVINGS / 1024))KB saved ($CSS_SAVINGS_PERCENT%)
|
|
|
|
## Optimization Techniques Applied
|
|
|
|
### 1. Feature-Based Compilation
|
|
- Reduced from 47 components to 5 essential components
|
|
- Only includes: button, input, label, card, separator
|
|
- Eliminated unused component code
|
|
|
|
### 2. Aggressive Cargo Optimization
|
|
- opt-level = 3 (maximum optimization)
|
|
- codegen-units = 1 (single codegen unit)
|
|
- lto = true (link time optimization)
|
|
- strip = true (remove debug symbols)
|
|
- panic = "abort" (smaller panic handling)
|
|
|
|
### 3. Tree Shaking
|
|
- Removed unused dependencies
|
|
- Eliminated dead code paths
|
|
- Optimized import chains
|
|
|
|
## Recommendations for Further Optimization
|
|
|
|
### Immediate Actions
|
|
1. **Use feature-based compilation** in production builds
|
|
2. **Implement lazy loading** for non-essential components
|
|
3. **Enable gzip compression** on web server
|
|
|
|
### Advanced Optimizations
|
|
1. **Code splitting** by component categories
|
|
2. **Dynamic imports** for heavy components
|
|
3. **Service worker caching** for better performance
|
|
4. **CDN deployment** for static assets
|
|
|
|
### Component-Specific Optimizations
|
|
1. **Lazy load form components** (checkbox, radio-group, select)
|
|
2. **Defer layout components** (tabs, table, pagination)
|
|
3. **Load interactive components** on user interaction
|
|
|
|
## Implementation Guide
|
|
|
|
### For Production Builds
|
|
\`\`\`bash
|
|
# Use minimal features
|
|
cargo build --release --features essential
|
|
|
|
# Or customize features
|
|
cargo build --release --features "button,input,card"
|
|
\`\`\`
|
|
|
|
### For Development
|
|
\`\`\`bash
|
|
# Include all components for development
|
|
cargo build --release --features all
|
|
\`\`\`
|
|
|
|
## Monitoring and Maintenance
|
|
|
|
### Bundle Size Monitoring
|
|
- Set up automated bundle size tracking
|
|
- Monitor size changes in CI/CD
|
|
- Alert on size increases >10%
|
|
|
|
### Performance Metrics
|
|
- Track Time to Interactive (TTI)
|
|
- Monitor First Contentful Paint (FCP)
|
|
- Measure Core Web Vitals
|
|
|
|
### Regular Optimization
|
|
- Monthly bundle size reviews
|
|
- Quarterly optimization audits
|
|
- Continuous dependency updates
|
|
EOF
|
|
|
|
# Phase 6: Create optimization profiles
|
|
print_status "Phase 6: Creating optimization profiles..."
|
|
|
|
cat > "$ANALYSIS_DIR/optimization-profiles.md" << EOF
|
|
# Bundle Optimization Profiles
|
|
|
|
## Profile 1: Essential (Minimal Bundle)
|
|
**Use case**: Landing pages, simple forms, basic UI
|
|
**Components**: button, input, label, card, separator
|
|
**Estimated size**: $((OPTIMIZED_WASM_SIZE / 1024 / 1024))MB WASM
|
|
**Features**: --features essential
|
|
|
|
## Profile 2: Forms (Form-Focused)
|
|
**Use case**: Data entry, user registration, settings
|
|
**Components**: button, input, label, checkbox, radio-group, select, textarea, form
|
|
**Estimated size**: ~$((OPTIMIZED_WASM_SIZE * 2 / 1024 / 1024))MB WASM
|
|
**Features**: --features forms
|
|
|
|
## Profile 3: Layout (Content-Heavy)
|
|
**Use case**: Dashboards, content management, complex layouts
|
|
**Components**: card, separator, skeleton, tabs, table, pagination
|
|
**Estimated size**: ~$((OPTIMIZED_WASM_SIZE * 3 / 1024 / 1024))MB WASM
|
|
**Features**: --features layout
|
|
|
|
## Profile 4: Interactive (Feature-Rich)
|
|
**Use case**: Applications, tools, interactive experiences
|
|
**Components**: button, checkbox, radio-group, select, switch, tabs, dialog, tooltip
|
|
**Estimated size**: ~$((OPTIMIZED_WASM_SIZE * 4 / 1024 / 1024))MB WASM
|
|
**Features**: --features interactive
|
|
|
|
## Profile 5: Complete (All Components)
|
|
**Use case**: Component libraries, design systems, development
|
|
**Components**: All 47 components
|
|
**Estimated size**: $((BASELINE_WASM_SIZE / 1024 / 1024))MB WASM
|
|
**Features**: --features all
|
|
|
|
## Usage Examples
|
|
|
|
### Minimal Landing Page
|
|
\`\`\`bash
|
|
cargo build --release --features essential
|
|
\`\`\`
|
|
|
|
### Form-Heavy Application
|
|
\`\`\`bash
|
|
cargo build --release --features "essential,forms"
|
|
\`\`\`
|
|
|
|
### Dashboard Application
|
|
\`\`\`bash
|
|
cargo build --release --features "essential,layout,data"
|
|
\`\`\`
|
|
|
|
### Full-Featured App
|
|
\`\`\`bash
|
|
cargo build --release --features all
|
|
\`\`\`
|
|
EOF
|
|
|
|
# Phase 7: Create build scripts
|
|
print_status "Phase 7: Creating build scripts..."
|
|
|
|
cat > "$ANALYSIS_DIR/build-essential.sh" << 'EOF'
|
|
#!/bin/bash
|
|
# Build script for essential components only
|
|
|
|
set -e
|
|
|
|
echo "Building essential components bundle..."
|
|
cd book-examples/leptos
|
|
|
|
# Use essential features only
|
|
cargo build --release --features essential
|
|
|
|
echo "Essential bundle built successfully!"
|
|
echo "Bundle location: target/wasm32-unknown-unknown/release/"
|
|
EOF
|
|
|
|
cat > "$ANALYSIS_DIR/build-forms.sh" << 'EOF'
|
|
#!/bin/bash
|
|
# Build script for form-focused components
|
|
|
|
set -e
|
|
|
|
echo "Building forms bundle..."
|
|
cd book-examples/leptos
|
|
|
|
# Use form features
|
|
cargo build --release --features "essential,forms"
|
|
|
|
echo "Forms bundle built successfully!"
|
|
echo "Bundle location: target/wasm32-unknown-unknown/release/"
|
|
EOF
|
|
|
|
cat > "$ANALYSIS_DIR/build-layout.sh" << 'EOF'
|
|
#!/bin/bash
|
|
# Build script for layout components
|
|
|
|
set -e
|
|
|
|
echo "Building layout bundle..."
|
|
cd book-examples/leptos
|
|
|
|
# Use layout features
|
|
cargo build --release --features "essential,layout"
|
|
|
|
echo "Layout bundle built successfully!"
|
|
echo "Bundle location: target/wasm32-unknown-unknown/release/"
|
|
EOF
|
|
|
|
# Make scripts executable
|
|
chmod +x "$ANALYSIS_DIR"/*.sh
|
|
|
|
print_success "Bundle optimization complete!"
|
|
print_status "Report saved to: $ANALYSIS_DIR/optimization-report.md"
|
|
print_status "Profiles saved to: $ANALYSIS_DIR/optimization-profiles.md"
|
|
print_status "Build scripts created in: $ANALYSIS_DIR/"
|
|
|
|
echo ""
|
|
echo "=== 🎯 BUNDLE OPTIMIZATION SUMMARY ==="
|
|
echo "Baseline WASM: $((BASELINE_WASM_SIZE / 1024 / 1024))MB"
|
|
echo "Optimized WASM: $((OPTIMIZED_WASM_SIZE / 1024 / 1024))MB"
|
|
echo "WASM Savings: $((WASM_SAVINGS / 1024 / 1024))MB ($WASM_SAVINGS_PERCENT%)"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo "1. Review optimization report: $ANALYSIS_DIR/optimization-report.md"
|
|
echo "2. Use build scripts for different optimization profiles"
|
|
echo "3. Implement lazy loading for non-essential components"
|
|
echo "4. Set up automated bundle size monitoring"
|