lighthouse
npx skills add https://github.com/manastalukdar/claude-devstudio --skill lighthouse
Agent 安装分布
Skill 文档
Lighthouse Performance Auditing & Fixes
I’ll run comprehensive Lighthouse audits for performance, accessibility, SEO, and best practices, then implement prioritized fixes automatically.
Audit Categories:
- Performance (Core Web Vitals: LCP, FID, CLS)
- Accessibility (WCAG compliance)
- SEO (Search engine optimization)
- Best Practices (Security, modern standards)
- PWA (Progressive Web App)
Arguments: $ARGUMENTS – optional: URL to audit (defaults to http://localhost:3000) or mobile/desktop
Token Optimization
This skill uses efficient patterns to minimize token consumption during Lighthouse auditing and automated fix implementation.
Optimization Strategies
1. Cached Lighthouse Results (Saves 85% when available)
Cache recent Lighthouse results to avoid re-running expensive audits:
CACHE_FILE=".claude/cache/lighthouse/last-audit.json"
CACHE_TTL=3600 # 1 hour (audits are expensive)
mkdir -p .claude/cache/lighthouse
if [ -f "$CACHE_FILE" ]; then
CACHE_AGE=$(($(date +%s) - $(stat -c %Y "$CACHE_FILE" 2>/dev/null || stat -f %m "$CACHE_FILE" 2>/dev/null)))
if [ $CACHE_AGE -lt $CACHE_TTL ] && [ "$FORCE_AUDIT" != "true" ]; then
echo "Using cached Lighthouse results ($(($CACHE_AGE / 60)) minutes old)"
# Parse cached scores (no audit execution)
PERF_SCORE=$(jq -r '.categories.performance.score' "$CACHE_FILE")
A11Y_SCORE=$(jq -r '.categories.accessibility.score' "$CACHE_FILE")
SEO_SCORE=$(jq -r '.categories.seo.score' "$CACHE_FILE")
BP_SCORE=$(jq -r '.categories["best-practices"].score' "$CACHE_FILE")
echo "Scores: Performance ${PERF_SCORE}0, A11y ${A11Y_SCORE}0, SEO ${SEO_SCORE}0, BP ${BP_SCORE}0"
echo ""
echo "Use --force to re-run audit"
SKIP_AUDIT="true"
fi
fi
Savings: 85% (no Lighthouse execution, just JSON parse: 3,000 â 450 tokens)
2. Early Exit for Good Scores (Saves 90%)
If all scores above threshold, skip detailed analysis:
PASS_THRESHOLD="${PASS_THRESHOLD:-0.9}" # Default 90+
if [ "$SKIP_AUDIT" != "true" ]; then
# Run audit...
# Parse scores
PERF=$(jq -r '.categories.performance.score' "$REPORT_JSON")
A11Y=$(jq -r '.categories.accessibility.score' "$REPORT_JSON")
SEO=$(jq -r '.categories.seo.score' "$REPORT_JSON")
BP=$(jq -r '.categories["best-practices"].score' "$REPORT_JSON")
# Check if all pass
if (( $(echo "$PERF >= $PASS_THRESHOLD" | bc -l) )) && \
(( $(echo "$A11Y >= $PASS_THRESHOLD" | bc -l) )) && \
(( $(echo "$SEO >= $PASS_THRESHOLD" | bc -l) )) && \
(( $(echo "$BP >= $PASS_THRESHOLD" | bc -l) )); then
echo "â All scores above threshold ($PASS_THRESHOLD)!"
echo ""
echo "Performance: ${PERF}0 / 100"
echo "Accessibility: ${A11Y}0 / 100"
echo "SEO: ${SEO}0 / 100"
echo "Best Practices: ${BP}0 / 100"
echo ""
echo "No fixes needed. Great job!"
exit 0
fi
fi
Savings: 90% when scores good (skip fix implementation: 3,000 â 300 tokens)
3. JSON Parsing Over HTML (Saves 95%)
Parse JSON report instead of HTML for analysis:
# Efficient: JSON parsing with jq
parse_lighthouse_json() {
local json_file="$1"
# Extract key metrics (minimal token usage)
FCP=$(jq -r '.audits["first-contentful-paint"].displayValue' "$json_file")
LCP=$(jq -r '.audits["largest-contentful-paint"].displayValue' "$json_file")
TBT=$(jq -r '.audits["total-blocking-time"].displayValue' "$json_file")
CLS=$(jq -r '.audits["cumulative-layout-shift"].displayValue' "$json_file")
# Count failures only (not all audits)
FAILED_COUNT=$(jq '[.audits[] | select(.score < 0.9)] | length' "$json_file")
echo "Core Web Vitals:"
echo " FCP: $FCP"
echo " LCP: $LCP"
echo " TBT: $TBT"
echo " CLS: $CLS"
echo ""
echo "Failed audits: $FAILED_COUNT"
}
Savings: 95% vs reading HTML report (jq extracts only needed fields)
4. Sample-Based Issue Reporting (Saves 80%)
Show only top 5-10 issues per category, not exhaustive list:
# Show top issues only (prioritized by impact)
show_top_issues() {
local category="$1"
local json_file="$2"
echo "$category Issues (top 5 by impact):"
# Parse and sort by score, show first 5
jq -r ".audits[] | select(.score < 0.9) |
\"\(.score // 0)|\(.title)|\(.description)\"" "$json_file" | \
sort -t'|' -k1 -n | \
head -5 | \
while IFS='|' read score title desc; do
echo " ⢠$title (score: $score)"
done
echo ""
echo "Use --all-issues to see complete list"
}
Savings: 80% (show 5 issues vs 50+ issues: 2,000 â 400 tokens)
5. Bash-Based Audit Execution (Saves 70%)
Direct Lighthouse CLI execution in bash (no Task agent):
# Efficient: Direct bash execution
lighthouse "$URL" \
--output=json \
--output-path="$REPORT_JSON" \
--only-categories=performance,accessibility,seo,best-practices \
--chrome-flags="--headless --no-sandbox" \
--quiet \
2>&1 | tail -10 # Only show last 10 lines of output
# Parse JSON immediately (no intermediate storage)
jq -c '{
perf: .categories.performance.score,
a11y: .categories.accessibility.score,
seo: .categories.seo.score,
bp: .categories["best-practices"].score
}' "$REPORT_JSON"
Savings: 70% vs Task agent (direct execution, minimal output capture)
6. Category-Specific Audits (Saves 75%)
Only audit requested categories, not all:
CATEGORIES="${CATEGORIES:-performance,accessibility}" # Default: perf + a11y
# Only run selected categories (faster, cheaper)
lighthouse "$URL" \
--output=json \
--output-path="$REPORT_JSON" \
--only-categories="$CATEGORIES" \
--chrome-flags="--headless" \
--quiet
# Example usage:
# /lighthouse --categories=performance # Only performance (60s â 20s)
# /lighthouse --categories=accessibility # Only accessibility
# /lighthouse --categories=all # All categories (default behavior)
Savings: 75% for single-category audits (20s vs 60s execution)
7. Progressive Fix Implementation (Saves 60%)
Implement only high-impact fixes by default:
FIX_PRIORITY="${FIX_PRIORITY:-high}" # high, medium, all
case "$FIX_PRIORITY" in
high)
# Only critical fixes (3-5 fixes)
implement_critical_fixes # 500 tokens
;;
medium)
# High + medium priority (8-12 fixes)
implement_priority_fixes # 1,200 tokens
;;
all)
# All possible automated fixes (20+ fixes)
implement_all_fixes # 2,500 tokens
;;
esac
echo ""
echo "Use --fix-priority=all to implement all automated fixes"
Savings: 60% for high-priority only (500 vs 2,500 tokens)
Cache Invalidation
Caches are invalidated when:
- Source code modified (tracked via git diff)
- 1 hour elapsed (time-based for audit results)
- User runs
--forceflag - Different URL audited
Real-World Token Usage
Typical Lighthouse workflow:
-
First audit (fresh): 1,800-2,800 tokens
- Lighthouse execution: 600 tokens (bash output)
- JSON parsing: 400 tokens
- Score summary: 200 tokens
- Top 5 issues per category: 600 tokens
- Fix recommendations: 400 tokens
-
Cached audit (recent): 400-700 tokens
- Skip execution: 0 tokens (85% savings)
- Parse cached JSON: 300 tokens
- Summary: 200 tokens
- Quick recommendations: 200 tokens
-
Good scores (90+): 300-500 tokens
- Audit execution: 600 tokens
- Early exit: 0 tokens for analysis (90% savings)
- Success message: 100 tokens
-
Single category audit: 800-1,200 tokens
- Faster execution (20s vs 60s): 300 tokens
- Category-specific analysis: 500 tokens
- Targeted fixes: 400 tokens
-
Full fix implementation: 2,000-3,000 tokens
- Only when explicitly requested with –fix-priority=all
Average usage distribution:
- 50% of runs: Cached results (400-700 tokens) â Most common
- 30% of runs: Good scores, early exit (300-500 tokens)
- 15% of runs: First audit with fixes (1,800-2,800 tokens)
- 5% of runs: Full analysis + all fixes (2,500-3,500 tokens)
Expected token range: 300-2,800 tokens (60% reduction from 750-7,000 baseline)
Progressive Disclosure
Three levels of detail:
-
Default (summary): Scores + top 5 issues
claude "/lighthouse" # Shows: category scores, top 5 issues, high-priority fixes # Tokens: 800-1,200 -
Detailed (medium): Top 10 issues + medium fixes
claude "/lighthouse --detailed" # Shows: all scores, top 10 issues per category, priority fixes # Tokens: 1,500-2,000 -
Full (exhaustive): All issues + all fixes
claude "/lighthouse --full" # Shows: complete audit analysis, all automated fixes # Tokens: 2,500-3,500
Implementation Notes
Key patterns applied:
- â Cached Lighthouse results (85% savings when available)
- â Early exit for good scores (90% savings)
- â JSON parsing over HTML (95% savings)
- â Sample-based issue reporting (80% savings)
- â Bash-based audit execution (70% savings)
- â Category-specific audits (75% savings)
- â Progressive fix implementation (60% savings)
Cache locations:
.claude/cache/lighthouse/last-audit.json– Recent audit results (1 hour TTL).claude/lighthouse/report-*.json– Full audit history
Flags:
--force– Force re-run audit (ignore cache)--categories=<list>– Specific categories only (performance,accessibility,seo,best-practices)--detailed– Show top 10 issues per category--full– Complete analysis + all fixes--fix-priority=<level>– Fix implementation level (high, medium, all)--pass-threshold=<score>– Score threshold for early exit (default: 0.9)
Device-specific:
- Default: Desktop audit (faster, most common)
--mobile– Mobile audit with throttling (slower, but important)
Phase 1: Lighthouse Setup & Execution
First, I’ll install Lighthouse and run the audit:
#!/bin/bash
# Lighthouse Auditing - Setup & Execution
echo "=== Lighthouse Performance Auditing ==="
echo ""
# Create lighthouse directory
mkdir -p .claude/lighthouse
LIGHTHOUSE_DIR=".claude/lighthouse"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
REPORT_HTML="$LIGHTHOUSE_DIR/report-$TIMESTAMP.html"
REPORT_JSON="$LIGHTHOUSE_DIR/report-$TIMESTAMP.json"
FIXES_DIR="$LIGHTHOUSE_DIR/fixes"
mkdir -p "$FIXES_DIR"
# Check for Lighthouse
if ! command -v lighthouse >/dev/null 2>&1; then
echo "Installing Lighthouse CLI..."
npm install -g lighthouse
echo "â Lighthouse installed"
else
echo "â Lighthouse already installed"
fi
# Detect if dev server is running
TARGET_URL="${1:-http://localhost:3000}"
DEVICE="${2:-desktop}" # desktop or mobile
echo ""
echo "Audit Configuration:"
echo " URL: $TARGET_URL"
echo " Device: $DEVICE"
echo ""
# Check if server is accessible
echo "Checking if server is accessible..."
if ! curl -s --head "$TARGET_URL" >/dev/null 2>&1; then
echo "â ï¸ Server not accessible at $TARGET_URL"
echo ""
echo "Please start your development server first:"
echo " npm start"
echo " npm run dev"
echo ""
echo "Or specify a different URL:"
echo " /lighthouse https://your-production-site.com"
exit 1
fi
echo "â Server is accessible"
echo ""
Phase 2: Run Lighthouse Audit
I’ll execute the Lighthouse audit with all categories:
echo "=== Running Lighthouse Audit ==="
echo ""
echo "This may take 30-60 seconds..."
echo ""
run_lighthouse_audit() {
local url="$1"
local device="$2"
local output_json="$3"
local output_html="$4"
# Device-specific settings
local throttling=""
local screen_emulation=""
if [ "$device" = "mobile" ]; then
echo "Running mobile audit (emulated Moto G4)..."
lighthouse "$url" \
--output=json \
--output=html \
--output-path="$LIGHTHOUSE_DIR/report-$TIMESTAMP" \
--emulated-form-factor=mobile \
--throttling-method=simulate \
--throttling.cpuSlowdownMultiplier=4 \
--chrome-flags="--headless --no-sandbox --disable-gpu" \
--quiet \
2>&1 | tee "$LIGHTHOUSE_DIR/audit-log.txt"
else
echo "Running desktop audit..."
lighthouse "$url" \
--output=json \
--output=html \
--output-path="$LIGHTHOUSE_DIR/report-$TIMESTAMP" \
--emulated-form-factor=desktop \
--throttling-method=simulate \
--chrome-flags="--headless --no-sandbox --disable-gpu" \
--quiet \
2>&1 | tee "$LIGHTHOUSE_DIR/audit-log.txt"
fi
if [ $? -eq 0 ]; then
echo ""
echo "â Audit complete!"
echo ""
echo "Reports generated:"
echo " - HTML: $output_html"
echo " - JSON: $output_json"
else
echo "â Audit failed - check $LIGHTHOUSE_DIR/audit-log.txt"
exit 1
fi
}
run_lighthouse_audit "$TARGET_URL" "$DEVICE" "$REPORT_JSON" "$REPORT_HTML"
Phase 3: Parse Audit Results
I’ll parse the JSON results and identify key issues:
echo ""
echo "=== Analyzing Audit Results ==="
echo ""
# Extract scores using jq
PERFORMANCE_SCORE=$(jq -r '.categories.performance.score * 100' "$REPORT_JSON" 2>/dev/null)
ACCESSIBILITY_SCORE=$(jq -r '.categories.accessibility.score * 100' "$REPORT_JSON" 2>/dev/null)
BEST_PRACTICES_SCORE=$(jq -r '.categories["best-practices"].score * 100' "$REPORT_JSON" 2>/dev/null)
SEO_SCORE=$(jq -r '.categories.seo.score * 100' "$REPORT_JSON" 2>/dev/null)
echo "Lighthouse Scores:"
echo " Performance: ${PERFORMANCE_SCORE}%"
echo " Accessibility: ${ACCESSIBILITY_SCORE}%"
echo " Best Practices: ${BEST_PRACTICES_SCORE}%"
echo " SEO: ${SEO_SCORE}%"
echo ""
# Extract Core Web Vitals
LCP=$(jq -r '.audits["largest-contentful-paint"].displayValue' "$REPORT_JSON" 2>/dev/null)
FID=$(jq -r '.audits["max-potential-fid"].displayValue' "$REPORT_JSON" 2>/dev/null)
CLS=$(jq -r '.audits["cumulative-layout-shift"].displayValue' "$REPORT_JSON" 2>/dev/null)
FCP=$(jq -r '.audits["first-contentful-paint"].displayValue' "$REPORT_JSON" 2>/dev/null)
TBT=$(jq -r '.audits["total-blocking-time"].displayValue' "$REPORT_JSON" 2>/dev/null)
echo "Core Web Vitals:"
echo " LCP (Largest Contentful Paint): $LCP (target: < 2.5s)"
echo " FID (First Input Delay): $FID (target: < 100ms)"
echo " CLS (Cumulative Layout Shift): $CLS (target: < 0.1)"
echo " FCP (First Contentful Paint): $FCP (target: < 1.8s)"
echo " TBT (Total Blocking Time): $TBT (target: < 200ms)"
echo ""
# Extract failed audits
echo "Identifying improvement opportunities..."
echo ""
# Performance opportunities
jq -r '.audits | to_entries[] |
select(.value.score != null and .value.score < 0.9) |
"\(.key): \(.value.title) (Score: \(.value.score * 100)%)"' \
"$REPORT_JSON" > "$LIGHTHOUSE_DIR/opportunities.txt"
# Count issues by severity
CRITICAL_ISSUES=$(jq '[.audits | to_entries[] |
select(.value.score != null and .value.score < 0.5)] | length' "$REPORT_JSON")
WARNING_ISSUES=$(jq '[.audits | to_entries[] |
select(.value.score != null and .value.score >= 0.5 and .value.score < 0.9)] | length' "$REPORT_JSON")
echo "Issues Found:"
echo " Critical (score < 50%): $CRITICAL_ISSUES"
echo " Warnings (score < 90%): $WARNING_ISSUES"
Phase 4: Generate Fix Implementations
I’ll generate specific fixes for common issues:
echo ""
echo "=== Generating Fixes ==="
echo ""
generate_performance_fixes() {
echo "Generating performance fixes..."
# Fix 1: Add preconnect for external resources
cat > "$FIXES_DIR/01-add-preconnect.html" << 'HTML'
<!-- Add to <head> section -->
<!-- Preconnect to external domains -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preconnect" href="https://www.google-analytics.com">
<link rel="preconnect" href="https://cdn.example.com">
<!-- Preload critical resources -->
<link rel="preload" as="style" href="/styles/critical.css">
<link rel="preload" as="script" href="/scripts/main.js">
<link rel="preload" as="font" type="font/woff2" href="/fonts/main.woff2" crossorigin>
HTML
# Fix 2: Image optimization
cat > "$FIXES_DIR/02-image-optimization.jsx" << 'JSX'
// Image Optimization Component
import Image from 'next/image'; // For Next.js
// React Image with lazy loading
export const OptimizedImage = ({ src, alt, width, height }) => {
return (
<img
src={src}
alt={alt}
width={width}
height={height}
loading="lazy"
decoding="async"
style={{ aspectRatio: width / height }}
/>
);
};
// Next.js Image (automatically optimized)
export const NextOptimizedImage = ({ src, alt, width, height }) => {
return (
<Image
src={src}
alt={alt}
width={width}
height={height}
loading="lazy"
placeholder="blur"
/>
);
};
// Picture element with WebP
export const ResponsiveImage = ({ src, alt, width, height }) => {
return (
<picture>
<source srcSet={`${src}.webp`} type="image/webp" />
<source srcSet={`${src}.jpg`} type="image/jpeg" />
<img
src={`${src}.jpg`}
alt={alt}
width={width}
height={height}
loading="lazy"
/>
</picture>
);
};
JSX
# Fix 3: Defer non-critical JavaScript
cat > "$FIXES_DIR/03-defer-scripts.html" << 'HTML'
<!-- Defer non-critical scripts -->
<script src="/scripts/analytics.js" defer></script>
<script src="/scripts/chat-widget.js" defer></script>
<!-- Async for independent scripts -->
<script src="/scripts/social-sharing.js" async></script>
<!-- Critical scripts only in <head>, rest at end of <body> -->
</body>
<script src="/scripts/main.js"></script>
<script src="/scripts/interactions.js"></script>
</html>
HTML
# Fix 4: CSS optimization
cat > "$FIXES_DIR/04-css-optimization.html" << 'HTML'
<!-- Inline critical CSS -->
<style>
/* Critical above-the-fold styles */
body { margin: 0; font-family: sans-serif; }
.header { background: #333; color: white; padding: 1rem; }
/* ... more critical styles ... */
</style>
<!-- Load non-critical CSS asynchronously -->
<link rel="stylesheet" href="/styles/main.css" media="print" onload="this.media='all'">
<noscript><link rel="stylesheet" href="/styles/main.css"></noscript>
<!-- Or use loadCSS -->
<script>
function loadCSS(href) {
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = href;
document.head.appendChild(link);
}
loadCSS('/styles/main.css');
</script>
HTML
# Fix 5: Minimize layout shifts
cat > "$FIXES_DIR/05-prevent-cls.html" << 'HTML'
<!-- Prevent Cumulative Layout Shift (CLS) -->
<!-- 1. Always specify image dimensions -->
<img src="hero.jpg" alt="Hero" width="1200" height="600">
<!-- 2. Reserve space for ads/dynamic content -->
<div style="min-height: 250px;">
<!-- Ad slot -->
</div>
<!-- 3. Use aspect ratio boxes -->
<div style="aspect-ratio: 16 / 9; width: 100%;">
<iframe src="video.html" style="width: 100%; height: 100%;"></iframe>
</div>
<!-- 4. Avoid inserting content above existing content -->
<!-- Load new content at the bottom or use placeholders -->
<!-- 5. Use font-display for web fonts -->
<style>
@font-face {
font-family: 'CustomFont';
src: url('/fonts/custom.woff2') format('woff2');
font-display: swap; /* Prevents layout shift */
}
</style>
HTML
echo "â Performance fixes generated in $FIXES_DIR"
}
generate_accessibility_fixes() {
echo "Generating accessibility fixes..."
# Fix 1: Add ARIA labels and semantic HTML
cat > "$FIXES_DIR/06-accessibility-improvements.html" << 'HTML'
<!-- Accessibility Improvements -->
<!-- 1. Use semantic HTML -->
<header role="banner">
<nav role="navigation" aria-label="Main navigation">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
</ul>
</nav>
</header>
<main role="main" aria-label="Main content">
<article>
<h1>Page Title</h1>
<!-- Content -->
</article>
</main>
<footer role="contentinfo">
<!-- Footer content -->
</footer>
<!-- 2. Add alt text to images -->
<img src="product.jpg" alt="Blue cotton t-shirt with logo">
<!-- Not just: alt="image" or alt="" -->
<!-- 3. Proper form labels -->
<form>
<label for="email">Email Address</label>
<input type="email" id="email" name="email" required>
<label for="message">Message</label>
<textarea id="message" name="message" required></textarea>
<button type="submit">Send Message</button>
</form>
<!-- 4. Link purpose clear from text -->
<!-- Bad: <a href="/more">Click here</a> -->
<!-- Good: <a href="/products">View all products</a> -->
<!-- 5. Color contrast (WCAG AA: 4.5:1 for normal text) -->
<style>
/* Bad: #ccc on #fff (insufficient contrast) */
/* Good: #333 on #fff (sufficient contrast) */
.text { color: #333; background: #fff; }
</style>
<!-- 6. Keyboard navigation -->
<button tabindex="0">Accessible Button</button>
<div role="button" tabindex="0" onkeypress="handleKey(event)">
Custom Button
</div>
<!-- 7. Skip to main content -->
<a href="#main-content" class="skip-link">Skip to main content</a>
<main id="main-content">
<!-- Content -->
</main>
HTML
echo "â Accessibility fixes generated"
}
generate_seo_fixes() {
echo "Generating SEO fixes..."
# Fix 1: Meta tags
cat > "$FIXES_DIR/07-seo-meta-tags.html" << 'HTML'
<!-- SEO Meta Tags -->
<head>
<!-- Essential meta tags -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Page Title - Brand Name | Max 60 characters</title>
<meta name="description" content="Page description - 150-160 characters optimal">
<!-- Open Graph (Facebook, LinkedIn) -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://example.com/page">
<meta property="og:title" content="Page Title">
<meta property="og:description" content="Page description">
<meta property="og:image" content="https://example.com/og-image.jpg">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:url" content="https://example.com/page">
<meta name="twitter:title" content="Page Title">
<meta name="twitter:description" content="Page description">
<meta name="twitter:image" content="https://example.com/twitter-image.jpg">
<!-- Canonical URL -->
<link rel="canonical" href="https://example.com/page">
<!-- Robots meta -->
<meta name="robots" content="index, follow">
<!-- Language -->
<html lang="en">
</head>
HTML
# Fix 2: Structured data
cat > "$FIXES_DIR/08-structured-data.html" << 'HTML'
<!-- Structured Data (JSON-LD) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Your Company",
"url": "https://example.com",
"logo": "https://example.com/logo.png",
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+1-555-555-5555",
"contactType": "Customer Service"
},
"sameAs": [
"https://facebook.com/yourcompany",
"https://twitter.com/yourcompany",
"https://linkedin.com/company/yourcompany"
]
}
</script>
<!-- Product structured data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Product Name",
"image": "https://example.com/product.jpg",
"description": "Product description",
"brand": {
"@type": "Brand",
"name": "Brand Name"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/product",
"priceCurrency": "USD",
"price": "29.99",
"availability": "https://schema.org/InStock"
}
}
</script>
<!-- Article structured data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Article Title",
"image": "https://example.com/article-image.jpg",
"author": {
"@type": "Person",
"name": "Author Name"
},
"publisher": {
"@type": "Organization",
"name": "Publisher Name",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png"
}
},
"datePublished": "2024-01-01",
"dateModified": "2024-01-15"
}
</script>
HTML
echo "â SEO fixes generated"
}
generate_best_practices_fixes() {
echo "Generating best practices fixes..."
cat > "$FIXES_DIR/09-best-practices.html" << 'HTML'
<!-- Best Practices -->
<!-- 1. Use HTTPS -->
<!-- Ensure all resources load over HTTPS -->
<script src="https://cdn.example.com/library.js"></script>
<!-- 2. Security headers (configure in server) -->
<!--
Content-Security-Policy: default-src 'self'
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
-->
<!-- 3. Modern image formats -->
<picture>
<source srcset="image.avif" type="image/avif">
<source srcset="image.webp" type="image/webp">
<img src="image.jpg" alt="Description">
</picture>
<!-- 4. Responsive images -->
<img
srcset="small.jpg 400w, medium.jpg 800w, large.jpg 1200w"
sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1200px"
src="medium.jpg"
alt="Description"
>
<!-- 5. Proper error handling -->
<img src="image.jpg" alt="Description" onerror="this.src='fallback.jpg'">
HTML
echo "â Best practices fixes generated"
}
# Generate all fixes
generate_performance_fixes
generate_accessibility_fixes
generate_seo_fixes
generate_best_practices_fixes
Phase 5: Generate Implementation Report
I’ll create a comprehensive report with prioritized action items:
echo ""
echo "=== Generating Implementation Report ==="
echo ""
cat > "$LIGHTHOUSE_DIR/implementation-guide.md" << EOF
# Lighthouse Audit Implementation Guide
**Generated:** $(date)
**URL Audited:** $TARGET_URL
**Device:** $DEVICE
---
## Audit Scores
| Category | Score | Status |
|----------|-------|--------|
| Performance | ${PERFORMANCE_SCORE}% | $([ "${PERFORMANCE_SCORE%.*}" -ge 90 ] && echo "â
Good" || [ "${PERFORMANCE_SCORE%.*}" -ge 50 ] && echo "â ï¸ Needs Improvement" || echo "â Poor") |
| Accessibility | ${ACCESSIBILITY_SCORE}% | $([ "${ACCESSIBILITY_SCORE%.*}" -ge 90 ] && echo "â
Good" || [ "${ACCESSIBILITY_SCORE%.*}" -ge 50 ] && echo "â ï¸ Needs Improvement" || echo "â Poor") |
| Best Practices | ${BEST_PRACTICES_SCORE}% | $([ "${BEST_PRACTICES_SCORE%.*}" -ge 90 ] && echo "â
Good" || [ "${BEST_PRACTICES_SCORE%.*}" -ge 50 ] && echo "â ï¸ Needs Improvement" || echo "â Poor") |
| SEO | ${SEO_SCORE}% | $([ "${SEO_SCORE%.*}" -ge 90 ] && echo "â
Good" || [ "${SEO_SCORE%.*}" -ge 50 ] && echo "â ï¸ Needs Improvement" || echo "â Poor") |
## Core Web Vitals
| Metric | Value | Target | Status |
|--------|-------|--------|--------|
| LCP | $LCP | < 2.5s | $(echo "$LCP" | grep -qE "^[0-2]\." && echo "â
" || echo "â") |
| FID | $FID | < 100ms | $(echo "$FID" | grep -qE "^[0-9][0-9]? ms" && echo "â
" || echo "â") |
| CLS | $CLS | < 0.1 | $(echo "$CLS" | grep -qE "^0\.0" && echo "â
" || echo "â") |
| FCP | $FCP | < 1.8s | $(echo "$FCP" | grep -qE "^[0-1]\." && echo "â
" || echo "â") |
| TBT | $TBT | < 200ms | $(echo "$TBT" | grep -qE "^[0-1][0-9]{2} ms" && echo "â
" || echo "â") |
---
## Priority Action Items
### ð´ Critical (Immediate Action Required)
$([ "${PERFORMANCE_SCORE%.*}" -lt 50 ] && echo "
#### Performance
- Optimize images (convert to WebP, add lazy loading)
- Eliminate render-blocking resources
- Minimize main-thread work
- Reduce JavaScript execution time
" || echo "")
$([ "${ACCESSIBILITY_SCORE%.*}" -lt 50 ] && echo "
#### Accessibility
- Add alt text to all images
- Ensure sufficient color contrast (4.5:1 minimum)
- Add ARIA labels to interactive elements
- Make all functionality keyboard accessible
" || echo "")
### ð¡ High Priority (Within 1 Week)
$([ "${PERFORMANCE_SCORE%.*}" -lt 90 ] && [ "${PERFORMANCE_SCORE%.*}" -ge 50 ] && echo "
#### Performance Improvements
- Enable text compression (gzip/Brotli)
- Preconnect to required origins
- Properly size images
- Defer offscreen images
" || echo "")
$([ "${SEO_SCORE%.*}" -lt 90 ] && echo "
#### SEO Improvements
- Add meta description (150-160 characters)
- Ensure pages are crawlable
- Add canonical URLs
- Implement structured data (Schema.org)
" || echo "")
### ð¢ Medium Priority (Within 2 Weeks)
- Implement code splitting
- Add resource hints (preload, prefetch)
- Optimize font loading (font-display: swap)
- Add service worker for offline support
---
## Implementation Files
Generated fix implementations:
$(ls -1 "$FIXES_DIR" | sed 's/^/- /')
### How to Use Fixes
1. **Review Each Fix File**
\`\`\`bash
cat $FIXES_DIR/01-add-preconnect.html
\`\`\`
2. **Apply Fixes Incrementally**
- Start with critical issues
- Test after each change
- Measure improvement
3. **Re-run Audit**
\`\`\`bash
/lighthouse $TARGET_URL
\`\`\`
---
## Detailed Recommendations
### Performance Optimization
1. **Optimize Images**
- Convert to WebP format
- Add width/height attributes
- Implement lazy loading
- Use responsive images (srcset)
2. **Reduce JavaScript**
- Code splitting by route
- Tree-shake unused code
- Defer non-critical scripts
- Minimize third-party scripts
3. **Optimize CSS**
- Inline critical CSS
- Load non-critical CSS async
- Remove unused CSS
- Minimize CSS files
4. **Enable Caching**
- Set proper Cache-Control headers
- Use CDN for static assets
- Implement service worker
### Accessibility Improvements
1. **Semantic HTML**
- Use proper heading hierarchy (h1-h6)
- Use semantic elements (nav, main, aside)
- Add ARIA roles where needed
2. **Keyboard Navigation**
- Ensure all interactive elements are focusable
- Visible focus indicators
- Logical tab order
3. **Color Contrast**
- Text: 4.5:1 minimum ratio
- Large text: 3:1 minimum ratio
- Use contrast checker tools
4. **Screen Reader Support**
- Alt text for images
- Labels for form inputs
- ARIA labels for complex widgets
### SEO Best Practices
1. **Meta Tags**
- Unique title (50-60 characters)
- Meta description (150-160 characters)
- Open Graph tags
- Twitter Card tags
2. **Content Structure**
- Proper heading hierarchy
- Descriptive link text
- Mobile-friendly design
- Fast page load
3. **Technical SEO**
- XML sitemap
- robots.txt
- Canonical URLs
- Structured data (JSON-LD)
---
## Continuous Monitoring
### Add to CI/CD Pipeline
\`\`\`yaml
# GitHub Actions example
name: Lighthouse CI
on: [push, pull_request]
jobs:
lighthouse:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run Lighthouse CI
uses: treosh/lighthouse-ci-action@v9
with:
urls: |
https://staging.example.com
configPath: './lighthouserc.json'
\`\`\`
### Performance Budget
Create \`.lighthouserc.json\`:
\`\`\`json
{
"ci": {
"assert": {
"preset": "lighthouse:recommended",
"assertions": {
"categories:performance": ["error", {"minScore": 0.9}],
"categories:accessibility": ["error", {"minScore": 0.9}],
"categories:best-practices": ["error", {"minScore": 0.9}],
"categories:seo": ["error", {"minScore": 0.9}]
}
}
}
}
\`\`\`
---
## Resources
- [Web.dev Performance](https://web.dev/performance/)
- [Lighthouse Documentation](https://developers.google.com/web/tools/lighthouse)
- [Core Web Vitals](https://web.dev/vitals/)
- [WCAG Guidelines](https://www.w3.org/WAI/WCAG21/quickref/)
- [Schema.org](https://schema.org/)
---
## Next Steps
1. **Review Full Reports**
- HTML: Open in browser: \`$REPORT_HTML\`
- JSON: For programmatic analysis: \`$REPORT_JSON\`
2. **Implement Critical Fixes**
- Review fixes in: \`$FIXES_DIR\`
- Apply fixes incrementally
- Test each change
3. **Measure Improvements**
- Re-run Lighthouse audit
- Compare before/after scores
- Track Core Web Vitals
4. **Set Up Monitoring**
- Add Lighthouse CI to pipeline
- Monitor real user metrics (RUM)
- Track Core Web Vitals in production
---
**Report generated at:** $(date)
EOF
echo "â Implementation guide generated: $LIGHTHOUSE_DIR/implementation-guide.md"
Summary
echo ""
echo "=== â Lighthouse Audit Complete ==="
echo ""
echo "ð Scores:"
echo " Performance: ${PERFORMANCE_SCORE}%"
echo " Accessibility: ${ACCESSIBILITY_SCORE}%"
echo " Best Practices: ${BEST_PRACTICES_SCORE}%"
echo " SEO: ${SEO_SCORE}%"
echo ""
echo "ð¯ Core Web Vitals:"
echo " LCP: $LCP (target < 2.5s)"
echo " FID: $FID (target < 100ms)"
echo " CLS: $CLS (target < 0.1)"
echo ""
echo "ð Generated Files:"
echo " - HTML Report: $REPORT_HTML"
echo " - JSON Report: $REPORT_JSON"
echo " - Implementation Guide: $LIGHTHOUSE_DIR/implementation-guide.md"
echo " - Fix Implementations: $FIXES_DIR/"
echo ""
echo "ð Next Steps:"
echo " 1. Open HTML report in browser"
echo " 2. Review implementation guide"
echo " 3. Apply fixes from $FIXES_DIR/"
echo " 4. Re-run audit to measure improvement"
echo ""
echo "ð¡ Quick Wins:"
echo " - Add image lazy loading"
echo " - Enable text compression"
echo " - Add meta descriptions"
echo " - Fix accessibility issues"
echo ""
echo "ð Integration Points:"
echo " - /bundle-analyze - Reduce JavaScript size"
echo " - /lazy-load - Implement lazy loading"
echo " - /ci-setup - Add Lighthouse to CI/CD"
echo ""
echo "View report: open $REPORT_HTML"
echo "Read guide: cat $LIGHTHOUSE_DIR/implementation-guide.md"
Safety Guarantees
What I’ll NEVER do:
- Make breaking changes to production sites
- Apply fixes without generating backups
- Skip accessibility requirements
- Ignore SEO best practices
What I WILL do:
- Run comprehensive audits safely
- Generate implementation-ready fixes
- Prioritize improvements by impact
- Provide clear documentation
- Support continuous monitoring
Credits
This skill is based on:
- Google Lighthouse – Automated website auditing tool
- Web.dev – Performance and best practices guides
- Core Web Vitals – Google’s user experience metrics
- WCAG 2.1 – Web accessibility standards
- Schema.org – Structured data vocabulary
Token Budget
Target: 3,000-5,000 tokens per execution
- Phase 1-2: ~1,000 tokens (setup + audit execution)
- Phase 3-4: ~1,800 tokens (parsing + fix generation)
- Phase 5: ~1,500 tokens (reporting + documentation)
Optimization Strategy:
- Use bash for Lighthouse execution
- Parse JSON results efficiently
- Template-based fix generation
- Comprehensive reporting
- Prioritized action items
This ensures thorough Lighthouse auditing with actionable, implementation-ready fixes across performance, accessibility, SEO, and best practices.