web-performance-optimization by sickn33/antigravity-awesome-skills
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill web-performance-optimization帮助开发者优化网站和 Web 应用程序性能,以提升用户体验、SEO 排名和转化率。此技能提供了系统性的方法来测量、分析和改进加载速度、运行时性能以及核心 Web 指标。
我将帮助您建立基准指标:
分析性能问题:
专注于高影响力的改进:
应用性能改进:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
测量更改的影响:
## 性能审计结果
### 当前指标(优化前)
- **LCP (最大内容绘制):** 4.2s ❌ (应 < 2.5s)
- **FID (首次输入延迟):** 180ms ❌ (应 < 100ms)
- **CLS (累积布局偏移):** 0.25 ❌ (应 < 0.1)
- **Lighthouse 分数:** 62/100
### 已识别的问题
1. **LCP 问题:** 首屏图片 (2.5MB) 加载缓慢
2. **FID 问题:** 大型 JavaScript 包 (850KB) 阻塞主线程
3. **CLS 问题:** 未指定尺寸的图片导致布局偏移
### 优化计划
#### 修复 LCP (最大内容绘制)
**问题:** 首屏图片为 2.5MB,加载缓慢
**解决方案:**
```html
<!-- 优化前: 未优化的图片 -->
<img src="/hero.jpg" alt="Hero">
<!-- 优化后: 使用现代格式优化 -->
<picture>
<source srcset="/hero.avif" type="image/avif">
<source srcset="/hero.webp" type="image/webp">
<img
src="/hero.jpg"
alt="Hero"
width="1200"
height="600"
loading="eager"
fetchpriority="high"
>
</picture>
其他优化:
<link rel="preload" as="image" href="/hero.avif">问题: 850KB 的 JavaScript 包阻塞主线程
解决方案:
// 优化前: 所有内容在一个包中
import { HeavyComponent } from './HeavyComponent';
import { Analytics } from './analytics';
import { ChatWidget } from './chat';
// 优化后: 懒加载非关键代码
const HeavyComponent = lazy(() => import('./HeavyComponent'));
const ChatWidget = lazy(() => import('./chat'));
// 在页面可交互后加载分析脚本
if (typeof window !== 'undefined') {
window.addEventListener('load', () => {
import('./analytics').then(({ Analytics }) => {
Analytics.init();
});
});
}
# 分析包
npx webpack-bundle-analyzer
# 移除未使用的包
npm uninstall moment # 使用 date-fns 替代 (更小)
npm install date-fns
<!-- 优化前: 阻塞渲染 -->
<script src="/analytics.js"></script>
<!-- 优化后: 延迟加载 -->
<script src="/analytics.js" defer></script>
问题: 未指定尺寸的图片导致布局偏移
解决方案:
<!-- 优化前: 无尺寸 -->
<img src="/product.jpg" alt="Product">
<!-- 优化后: 指定尺寸 -->
<img
src="/product.jpg"
alt="Product"
width="400"
height="300"
style="aspect-ratio: 4/3;"
>
对于动态内容:
/* 为稍后加载的内容预留空间 */
.skeleton-loader {
min-height: 200px;
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: loading 1.5s infinite;
}
@keyframes loading {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
### 示例 2:减少 JavaScript 包大小
# 分析包构成
npx webpack-bundle-analyzer dist/stats.json
发现:
# 移除 moment.js (67KB) → 使用 date-fns (12KB)
npm uninstall moment
npm install date-fns
# 优化前
import moment from 'moment';
const formatted = moment(date).format('YYYY-MM-DD');
# 优化后
import { format } from 'date-fns';
const formatted = format(date, 'yyyy-MM-dd');
节省: 55KB
// 优化前: 导入整个库 (72KB)
import _ from 'lodash';
const unique = _.uniq(array);
// 优化后: 仅导入所需部分 (5KB)
import uniq from 'lodash/uniq';
const unique = uniq(array);
// 或使用原生方法
const unique = [...new Set(array)];
节省: 67KB
// Next.js 示例
import dynamic from 'next/dynamic';
// 懒加载重型组件
const Chart = dynamic(() => import('./Chart'), {
loading: () => <div>Loading chart...</div>,
ssr: false
});
const AdminPanel = dynamic(() => import('./AdminPanel'), {
loading: () => <div>Loading...</div>
});
// 基于路由的代码分割 (在 Next.js 中自动实现)
// pages/admin.js - 仅在访问 /admin 时加载
// pages/dashboard.js - 仅在访问 /dashboard 时加载
// 在 webpack.config.js 中启用 tree shaking
module.exports = {
mode: 'production',
optimization: {
usedExports: true,
sideEffects: false
}
};
// 在 package.json 中
{
"sideEffects": false
}
<!-- 优化前: 立即加载 -->
<script src="https://analytics.com/script.js"></script>
<!-- 优化后: 页面可交互后加载 -->
<script>
window.addEventListener('load', () => {
const script = document.createElement('script');
script.src = 'https://analytics.com/script.js';
script.async = true;
document.body.appendChild(script);
});
</script>
### 示例 3:图片优化策略
# 安装图片优化工具
npm install sharp
# 转换脚本 (optimize-images.js)
const sharp = require('sharp');
const fs = require('fs');
const path = require('path');
async function optimizeImage(inputPath, outputDir) {
const filename = path.basename(inputPath, path.extname(inputPath));
// 生成 WebP
await sharp(inputPath)
.webp({ quality: 80 })
.toFile(path.join(outputDir, `${filename}.webp`));
// 生成 AVIF (最佳压缩)
await sharp(inputPath)
.avif({ quality: 70 })
.toFile(path.join(outputDir, `${filename}.avif`));
// 生成优化的 JPEG 回退版本
await sharp(inputPath)
.jpeg({ quality: 80, progressive: true })
.toFile(path.join(outputDir, `${filename}.jpg`));
}
// 处理所有图片
const images = fs.readdirSync('./images');
images.forEach(img => {
optimizeImage(`./images/${img}`, './images/optimized');
});
<!-- 使用现代格式的响应式图片 -->
<picture>
<!-- AVIF 格式,适用于支持的浏览器 (最佳压缩) -->
<source
srcset="
/images/hero-400.avif 400w,
/images/hero-800.avif 800w,
/images/hero-1200.avif 1200w
"
type="image/avif"
sizes="(max-width: 768px) 100vw, 50vw"
>
<!-- WebP 格式,适用于支持的浏览器 -->
<source
srcset="
/images/hero-400.webp 400w,
/images/hero-800.webp 800w,
/images/hero-1200.webp 1200w
"
type="image/webp"
sizes="(max-width: 768px) 100vw, 50vw"
>
<!-- JPEG 回退版本 -->
<img
src="/images/hero-800.jpg"
srcset="
/images/hero-400.jpg 400w,
/images/hero-800.jpg 800w,
/images/hero-1200.jpg 1200w
"
sizes="(max-width: 768px) 100vw, 50vw"
alt="Hero image"
width="1200"
height="600"
loading="lazy"
>
</picture>
<!-- 原生懒加载 -->
<img
src="/image.jpg"
alt="Description"
loading="lazy"
width="800"
height="600"
>
<!-- 首屏图片使用立即加载 -->
<img
src="/hero.jpg"
alt="Hero"
loading="eager"
fetchpriority="high"
>
import Image from 'next/image';
// 自动优化
<Image
src="/hero.jpg"
alt="Hero"
width={1200}
height={600}
priority // 用于首屏图片
quality={80}
/>
// 懒加载
<Image
src="/product.jpg"
alt="Product"
width={400}
height={300}
loading="lazy"
/>
| 指标 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| 图片总大小 | 12MB | 1.8MB | 减少 85% |
| LCP | 4.5s | 1.6s | 加快 64% |
| 页面加载 (3G) | 18s | 4.2s | 加快 77% |
## 最佳实践
### ✅ 应该做的
* **先测量** - 在优化前始终建立基准指标
* **使用 Lighthouse** - 定期运行审计以跟踪进展
* **优化图片** - 使用现代格式和响应式图片
* **代码分割** - 将大包拆分成更小的块
* **懒加载** - 延迟非关键资源
* **积极缓存** - 为静态资源设置正确的缓存头
* **最小化主线程工作** - 将 JavaScript 执行保持在 50ms 以内
* **预加载关键资源** - 使用 `<link rel="preload">` 预加载关键资源
* **使用 CDN** - 通过 CDN 提供静态资源以加速交付
* **监控真实用户** - 跟踪真实用户的核心 Web 指标
### ❌ 不应该做的
* **不要盲目优化** - 先测量,再优化
* **不要忽视移动端** - 在真实移动设备和慢速网络上测试
* **不要阻塞渲染** - 避免阻塞渲染的 CSS 和 JavaScript
* **不要一次性加载所有内容** - 懒加载非关键资源
* **不要忘记指定尺寸** - 始终指定图片的宽度和高度
* **不要使用同步脚本** - 使用 async 或 defer 属性
* **不要忽视第三方脚本** - 它们常常导致性能问题
* **不要跳过压缩** - 始终压缩和最小化资源
## 常见陷阱
### 问题:桌面端优化良好但移动端缓慢
**症状:** 桌面端 Lighthouse 分数良好,移动端分数差 **解决方案:**
* 在真实移动设备上测试
* 使用 Chrome DevTools 移动端节流功能
* 针对 3G/4G 网络进行优化
* 减少 JavaScript 执行时间
lighthouse https://yoursite.com --throttling.cpuSlowdownMultiplier=4
### 问题:JavaScript 包过大
**症状:** 可交互时间长,FID 高 **解决方案:**
* 使用 webpack-bundle-analyzer 分析包
* 移除未使用的依赖
* 实施代码分割
* 懒加载非关键代码
npx webpack-bundle-analyzer dist/stats.json
### 问题:图片导致布局偏移
**症状:** CLS 分数高,内容跳动 **解决方案:**
* 始终指定宽度和高度
* 使用 aspect-ratio CSS 属性
* 使用骨架屏预留空间
img { aspect-ratio: 16 / 9; width: 100%; height: auto; }
### 问题:服务器响应时间慢
**症状:** TTFB 高 **解决方案:**
* 实施服务器端缓存
* 使用 CDN 提供静态资源
* 优化数据库查询
* 考虑静态站点生成
// Next.js: 静态生成 export async function getStaticProps() { const data = await fetchData(); return { props: { data }, revalidate: 60 // 每 60 秒重新生成 }; }
## 性能检查清单
### 图片
* 转换为现代格式
* 实施响应式图片
* 添加懒加载
* 指定尺寸
* 压缩图片
* 使用 CDN 交付
### JavaScript
* 包大小 < 200KB
* 实施代码分割
* 懒加载非关键代码
* 移除未使用的依赖
* 最小化和压缩
* 对脚本使用 async/defer
### CSS
* 内联关键 CSS
* 延迟非关键 CSS
* 移除未使用的 CSS
* 最小化 CSS 文件
* 使用 CSS 包含
### 缓存
* 为静态资源设置缓存头
* 实施 Service Worker
* 使用 CDN 缓存
* 缓存 API 响应
* 版本化静态资源
### 核心 Web 指标
* LCP < 2.5s
* FID < 100ms
* CLS < 0.1
* TTFB < 600ms
* TTI < 3.8s
## 性能工具
### 测量工具
* **Lighthouse** - 全面的性能审计
* **WebPageTest** - 详细的瀑布图分析
* **Chrome DevTools** - 性能分析
* **PageSpeed Insights** - 真实用户指标
* **Web Vitals 扩展** - 监控核心 Web 指标
### 分析工具
* **webpack-bundle-analyzer** - 可视化包构成
* **source-map-explorer** - 分析包大小
* **Bundlephobia** - 安装前检查包大小
* **ImageOptim** - 图片压缩工具
### 监控工具
* **Google Analytics** - 跟踪核心 Web 指标
* **Sentry** - 性能监控
* **New Relic** - 应用程序性能监控
* **Datadog** - 真实用户监控
## 相关技能
* `@react-best-practices` - React 性能模式
* `@frontend-dev-guidelines` - 前端开发标准
* `@systematic-debugging` - 调试性能问题
* `@senior-architect` - 性能架构
## 额外资源
* [Web.dev 性能](https://web.dev/performance/)
* [核心 Web 指标](https://web.dev/vitals/)
* [Lighthouse 文档](https://developers.google.com/web/tools/lighthouse)
* [MDN 性能指南](https://developer.mozilla.org/en-US/docs/Web/Performance)
* [Next.js 性能](https://nextjs.org/docs/advanced-features/measuring-performance)
* [图片优化指南](https://web.dev/fast/#optimize-your-images)
---
**专业提示:** 首先专注于核心 Web 指标——它们对用户体验和 SEO 排名影响最大!
每周安装
1.3K
仓库
[sickn33/antigra…e-skills](https://github.com/sickn33/antigravity-awesome-skills "sickn33/antigravity-awesome-skills")
GitHub 星标
27.1K
首次出现
Jan 22, 2026
安全审计
[Gen Agent Trust HubPass](/sickn33/antigravity-awesome-skills/web-performance-optimization/security/agent-trust-hub)[SocketPass](/sickn33/antigravity-awesome-skills/web-performance-optimization/security/socket)[SnykWarn](/sickn33/antigravity-awesome-skills/web-performance-optimization/security/snyk)
安装于
opencode1.1K
gemini-cli1.1K
codex1.0K
github-copilot980
cursor917
claude-code826
Help developers optimize website and web application performance to improve user experience, SEO rankings, and conversion rates. This skill provides systematic approaches to measure, analyze, and improve loading speed, runtime performance, and Core Web Vitals metrics.
I'll help you establish baseline metrics:
Analyze performance problems:
Focus on high-impact improvements:
Apply performance improvements:
Measure impact of changes:
## Performance Audit Results
### Current Metrics (Before Optimization)
- **LCP (Largest Contentful Paint):** 4.2s ❌ (should be < 2.5s)
- **FID (First Input Delay):** 180ms ❌ (should be < 100ms)
- **CLS (Cumulative Layout Shift):** 0.25 ❌ (should be < 0.1)
- **Lighthouse Score:** 62/100
### Issues Identified
1. **LCP Issue:** Hero image (2.5MB) loads slowly
2. **FID Issue:** Large JavaScript bundle (850KB) blocks main thread
3. **CLS Issue:** Images without dimensions cause layout shifts
### Optimization Plan
#### Fix LCP (Largest Contentful Paint)
**Problem:** Hero image is 2.5MB and loads slowly
**Solutions:**
\`\`\`html
<!-- Before: Unoptimized image -->
<img src="/hero.jpg" alt="Hero">
<!-- After: Optimized with modern formats -->
<picture>
<source srcset="/hero.avif" type="image/avif">
<source srcset="/hero.webp" type="image/webp">
<img
src="/hero.jpg"
alt="Hero"
width="1200"
height="600"
loading="eager"
fetchpriority="high"
>
</picture>
\`\`\`
**Additional optimizations:**
- Compress image to < 200KB
- Use CDN for faster delivery
- Preload hero image: `<link rel="preload" as="image" href="/hero.avif">`
#### Fix FID (First Input Delay)
**Problem:** 850KB JavaScript bundle blocks main thread
**Solutions:**
1. **Code Splitting:**
\`\`\`javascript
// Before: Everything in one bundle
import { HeavyComponent } from './HeavyComponent';
import { Analytics } from './analytics';
import { ChatWidget } from './chat';
// After: Lazy load non-critical code
const HeavyComponent = lazy(() => import('./HeavyComponent'));
const ChatWidget = lazy(() => import('./chat'));
// Load analytics after page interactive
if (typeof window !== 'undefined') {
window.addEventListener('load', () => {
import('./analytics').then(({ Analytics }) => {
Analytics.init();
});
});
}
\`\`\`
2. **Remove Unused Dependencies:**
\`\`\`bash
# Analyze bundle
npx webpack-bundle-analyzer
# Remove unused packages
npm uninstall moment # Use date-fns instead (smaller)
npm install date-fns
\`\`\`
3. **Defer Non-Critical Scripts:**
\`\`\`html
<!-- Before: Blocks rendering -->
<script src="/analytics.js"></script>
<!-- After: Deferred -->
<script src="/analytics.js" defer></script>
\`\`\`
#### Fix CLS (Cumulative Layout Shift)
**Problem:** Images without dimensions cause layout shifts
**Solutions:**
\`\`\`html
<!-- Before: No dimensions -->
<img src="/product.jpg" alt="Product">
<!-- After: With dimensions -->
<img
src="/product.jpg"
alt="Product"
width="400"
height="300"
style="aspect-ratio: 4/3;"
>
\`\`\`
**For dynamic content:**
\`\`\`css
/* Reserve space for content that loads later */
.skeleton-loader {
min-height: 200px;
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: loading 1.5s infinite;
}
@keyframes loading {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
\`\`\`
### Results After Optimization
- **LCP:** 1.8s ✅ (improved by 57%)
- **FID:** 45ms ✅ (improved by 75%)
- **CLS:** 0.05 ✅ (improved by 80%)
- **Lighthouse Score:** 94/100 ✅
## Bundle Size Optimization
### Current State
- **Total Bundle:** 850KB (gzipped: 280KB)
- **Main Bundle:** 650KB
- **Vendor Bundle:** 200KB
- **Load Time (3G):** 8.2s
### Analysis
\`\`\`bash
# Analyze bundle composition
npx webpack-bundle-analyzer dist/stats.json
\`\`\`
**Findings:**
1. Moment.js: 67KB (can replace with date-fns: 12KB)
2. Lodash: 72KB (using entire library, only need 5 functions)
3. Unused code: ~150KB of dead code
4. No code splitting: Everything in one bundle
### Optimization Steps
#### 1. Replace Heavy Dependencies
\`\`\`bash
# Remove moment.js (67KB) → Use date-fns (12KB)
npm uninstall moment
npm install date-fns
# Before
import moment from 'moment';
const formatted = moment(date).format('YYYY-MM-DD');
# After
import { format } from 'date-fns';
const formatted = format(date, 'yyyy-MM-dd');
\`\`\`
**Savings:** 55KB
#### 2. Use Lodash Selectively
\`\`\`javascript
// Before: Import entire library (72KB)
import _ from 'lodash';
const unique = _.uniq(array);
// After: Import only what you need (5KB)
import uniq from 'lodash/uniq';
const unique = uniq(array);
// Or use native methods
const unique = [...new Set(array)];
\`\`\`
**Savings:** 67KB
#### 3. Implement Code Splitting
\`\`\`javascript
// Next.js example
import dynamic from 'next/dynamic';
// Lazy load heavy components
const Chart = dynamic(() => import('./Chart'), {
loading: () => <div>Loading chart...</div>,
ssr: false
});
const AdminPanel = dynamic(() => import('./AdminPanel'), {
loading: () => <div>Loading...</div>
});
// Route-based code splitting (automatic in Next.js)
// pages/admin.js - Only loaded when visiting /admin
// pages/dashboard.js - Only loaded when visiting /dashboard
\`\`\`
#### 4. Remove Dead Code
\`\`\`javascript
// Enable tree shaking in webpack.config.js
module.exports = {
mode: 'production',
optimization: {
usedExports: true,
sideEffects: false
}
};
// In package.json
{
"sideEffects": false
}
\`\`\`
#### 5. Optimize Third-Party Scripts
\`\`\`html
<!-- Before: Loads immediately -->
<script src="https://analytics.com/script.js"></script>
<!-- After: Load after page interactive -->
<script>
window.addEventListener('load', () => {
const script = document.createElement('script');
script.src = 'https://analytics.com/script.js';
script.async = true;
document.body.appendChild(script);
});
</script>
\`\`\`
### Results
- **Total Bundle:** 380KB ✅ (reduced by 55%)
- **Main Bundle:** 180KB ✅
- **Vendor Bundle:** 80KB ✅
- **Load Time (3G):** 3.1s ✅ (improved by 62%)
## Image Optimization
### Current Issues
- 15 images totaling 12MB
- No modern formats (WebP, AVIF)
- No responsive images
- No lazy loading
### Optimization Strategy
#### 1. Convert to Modern Formats
\`\`\`bash
# Install image optimization tools
npm install sharp
# Conversion script (optimize-images.js)
const sharp = require('sharp');
const fs = require('fs');
const path = require('path');
async function optimizeImage(inputPath, outputDir) {
const filename = path.basename(inputPath, path.extname(inputPath));
// Generate WebP
await sharp(inputPath)
.webp({ quality: 80 })
.toFile(path.join(outputDir, \`\${filename}.webp\`));
// Generate AVIF (best compression)
await sharp(inputPath)
.avif({ quality: 70 })
.toFile(path.join(outputDir, \`\${filename}.avif\`));
// Generate optimized JPEG fallback
await sharp(inputPath)
.jpeg({ quality: 80, progressive: true })
.toFile(path.join(outputDir, \`\${filename}.jpg\`));
}
// Process all images
const images = fs.readdirSync('./images');
images.forEach(img => {
optimizeImage(\`./images/\${img}\`, './images/optimized');
});
\`\`\`
#### 2. Implement Responsive Images
\`\`\`html
<!-- Responsive images with modern formats -->
<picture>
<!-- AVIF for browsers that support it (best compression) -->
<source
srcset="
/images/hero-400.avif 400w,
/images/hero-800.avif 800w,
/images/hero-1200.avif 1200w
"
type="image/avif"
sizes="(max-width: 768px) 100vw, 50vw"
>
<!-- WebP for browsers that support it -->
<source
srcset="
/images/hero-400.webp 400w,
/images/hero-800.webp 800w,
/images/hero-1200.webp 1200w
"
type="image/webp"
sizes="(max-width: 768px) 100vw, 50vw"
>
<!-- JPEG fallback -->
<img
src="/images/hero-800.jpg"
srcset="
/images/hero-400.jpg 400w,
/images/hero-800.jpg 800w,
/images/hero-1200.jpg 1200w
"
sizes="(max-width: 768px) 100vw, 50vw"
alt="Hero image"
width="1200"
height="600"
loading="lazy"
>
</picture>
\`\`\`
#### 3. Lazy Loading
\`\`\`html
<!-- Native lazy loading -->
<img
src="/image.jpg"
alt="Description"
loading="lazy"
width="800"
height="600"
>
<!-- Eager loading for above-the-fold images -->
<img
src="/hero.jpg"
alt="Hero"
loading="eager"
fetchpriority="high"
>
\`\`\`
#### 4. Next.js Image Component
\`\`\`javascript
import Image from 'next/image';
// Automatic optimization
<Image
src="/hero.jpg"
alt="Hero"
width={1200}
height={600}
priority // For above-the-fold images
quality={80}
/>
// Lazy loaded
<Image
src="/product.jpg"
alt="Product"
width={400}
height={300}
loading="lazy"
/>
\`\`\`
### Results
| Metric | Before | After | Improvement |
|--------|--------|-------|-------------|
| Total Image Size | 12MB | 1.8MB | 85% reduction |
| LCP | 4.5s | 1.6s | 64% faster |
| Page Load (3G) | 18s | 4.2s | 77% faster |
<link rel="preload"> for critical assetsSymptoms: Good Lighthouse score on desktop, poor on mobile Solution:
Test on real mobile devices
Use Chrome DevTools mobile throttling
Optimize for 3G/4G networks
Reduce JavaScript execution time
lighthouse https://yoursite.com --throttling.cpuSlowdownMultiplier=4
Symptoms: Long Time to Interactive (TTI), high FID Solution:
Analyze bundle with webpack-bundle-analyzer
Remove unused dependencies
Implement code splitting
Lazy load non-critical code
npx webpack-bundle-analyzer dist/stats.json
Symptoms: High CLS score, content jumping Solution:
Always specify width and height
Use aspect-ratio CSS property
Reserve space with skeleton loaders
img { aspect-ratio: 16 / 9; width: 100%; height: auto; }
Symptoms: High TTFB (Time to First Byte) Solution:
Implement server-side caching
Use CDN for static assets
Optimize database queries
Consider static site generation (SSG)
// Next.js: Static generation export async function getStaticProps() { const data = await fetchData(); return { props: { data }, revalidate: 60 // Regenerate every 60 seconds }; }
@react-best-practices - React performance patterns@frontend-dev-guidelines - Frontend development standards@systematic-debugging - Debug performance issues@senior-architect - Architecture for performancePro Tip: Focus on Core Web Vitals (LCP, FID, CLS) first - they have the biggest impact on user experience and SEO rankings!
Weekly Installs
1.3K
Repository
GitHub Stars
27.1K
First Seen
Jan 22, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
opencode1.1K
gemini-cli1.1K
codex1.0K
github-copilot980
cursor917
claude-code826
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
102,200 周安装