**Purpose**: Troubleshoot frontend performance, rendering, and user experience issues.
Diagnose frontend performance issues like slow loads, memory leaks, and unresponsive UIs. Use it when users report sluggish behavior or Lighthouse scores are low. Provides specific Chrome DevTools commands and mitigation strategies for bundle size, render performance, and Core Web Vitals optimization.
/plugin marketplace add anton-abyzov/specweave/plugin install sw-infra@specweavePurpose: Troubleshoot frontend performance, rendering, and user experience issues.
Symptoms:
Diagnosis:
# Check JavaScript bundle size
ls -lh dist/*.js
# Analyze bundle composition
npx webpack-bundle-analyzer dist/stats.json
# Check for large dependencies
npm ls --depth=0
Red flags:
Mitigation:
import() for dynamic imports# Chrome DevTools → Network tab
# Look for:
# - Number of requests (>100 = too many)
# - Large assets (images >200KB)
# - Slow API calls (>1s)
Red flags:
Mitigation:
# Chrome DevTools → Performance tab
# Record page load, check:
# - Long tasks (>50ms)
# - Layout thrashing
# - JavaScript execution time
Red flags:
Mitigation:
Symptoms:
Diagnosis:
# Take heap snapshot before/after user interaction
# Compare snapshots
# Look for:
# - Detached DOM nodes
# - Event listeners not removed
# - Growing arrays/objects
Red flags:
Mitigation:
// Clean up event listeners
componentWillUnmount() {
element.removeEventListener('click', handler);
clearInterval(this.intervalId);
clearTimeout(this.timeoutId);
}
// Use WeakMap for DOM references
const cache = new WeakMap();
Symptoms:
Diagnosis:
# Chrome DevTools → Performance
# Look for:
# - Long tasks (>50ms)
# - Blocking JavaScript
# - Forced synchronous layout
Red flags:
Mitigation:
// Break up long tasks
async function processLargeArray(items) {
for (let i = 0; i < items.length; i++) {
await processItem(items[i]);
// Yield to main thread every 100 items
if (i % 100 === 0) {
await new Promise(resolve => setTimeout(resolve, 0));
}
}
}
// Use requestIdleCallback
requestIdleCallback(() => {
// Non-critical work
});
Symptoms:
Diagnosis:
# Chrome DevTools → Console
# Look for:
# - Uncaught exceptions
# - Network errors (failed chunks)
# - CORS errors
Common causes:
Mitigation:
// Error boundary
class ErrorBoundary extends React.Component {
componentDidCatch(error, errorInfo) {
logErrorToService(error, errorInfo);
}
render() {
if (this.state.hasError) {
return <ErrorFallback />;
}
return this.props.children;
}
}
// Retry failed chunk loads
const retryImport = (fn, retriesLeft = 3) => {
return new Promise((resolve, reject) => {
fn()
.then(resolve)
.catch(error => {
if (retriesLeft === 0) {
reject(error);
} else {
setTimeout(() => {
retryImport(fn, retriesLeft - 1).then(resolve, reject);
}, 1000);
}
});
});
};
Core Web Vitals:
Other Metrics:
Measurement:
// Web Vitals library
import {getLCP, getFID, getCLS} from 'web-vitals';
getLCP(console.log);
getFID(console.log);
getCLS(console.log);
Problem: Rendering 10,000 items at once Solution: Virtual scrolling, pagination, infinite scroll
Problem: 5MB JavaScript bundle loaded upfront Solution: Route-based code splitting, lazy loading
Problem: 5MB PNG images Solution: WebP, compression, lazy loading, responsive images
Problem: Heavy computation on main thread Solution: Web Workers, requestIdleCallback, async/await
Problem: Event listeners not removed, timers not cleared Solution: Cleanup in componentWillUnmount, WeakMap
When diagnosing slow UI:
Tools:
Designs feature architectures by analyzing existing codebase patterns and conventions, then providing comprehensive implementation blueprints with specific files to create/modify, component designs, data flows, and build sequences