重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
reactive-dashboard-performance by erichowens/some_claude_skills
npx skills add https://github.com/erichowens/some_claude_skills --skill reactive-dashboard-performance专注于构建生产级响应式仪表板,实现加载时间小于100毫秒,并具备全面的测试覆盖。
* 立即渲染骨架屏(感知加载时间为0毫秒)
* 逐步流式加载数据
* 对于小于200毫秒的加载,绝不显示加载指示器
2. 积极缓存策略
* 使用 React Query,设置 `staleTime: 5min`, `cacheTime: 30min`
* 对数据变更使用乐观更新
* 在悬停/挂载时预取数据
3. 代码分割
* 基于路由分割(Next.js 自动支持)
* 对重型组件使用组件级 `lazy()`
* 预加载关键路径
4. 记忆化策略
* 对昂贵的计算使用 `useMemo`
* 对纯组件使用 `React.memo`
* 为稳定引用使用 `useCallback`
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
* 在服务边界进行模拟(如 React Query、分析服务)
* 绝不模拟 UI 组件(测试真实 DOM)
* 尽可能使用 MSW 进行 API 模拟
2. 异步处理
// 错误 - 与 React 存在竞态条件
render(<Dashboard />);
const element = screen.getByText('Welcome');
// 正确 - 等待异步解析完成
render(<Dashboard />);
const element = await screen.findByText('Welcome');
3. 超时调试
* 超时意味着:缺少模拟、查询错误或组件未渲染
* 使用 `screen.debug()` 查看实际 DOM
* 检查控制台是否有未模拟的错误
4. 测试包装器模式
const TestProviders = ({ children }) => (
<QueryClientProvider client={testQueryClient}>
<AuthProvider>
{children}
</AuthProvider>
</QueryClientProvider>
);
检查实际渲染内容
render(<Component />); screen.debug(); // 查看实际 DOM
查找未模拟的依赖项
* 检查控制台是否有"不是函数"错误
* 在测试输出中查找网络请求
* 验证是否提供了所有上下文
3. 修复异步查询
* 使用 `findBy*` 代替 `getBy*`
* 如果需要,增加超时时间:`waitFor(() => {...}, { timeout: 3000 })`
* 正确模拟 React Query
4. 简化组件树
* 首先单独测试小组件
* 最后添加完整的集成测试
* 对复杂查询使用 `data-testid`
| 阶段 | 目标 |
|---|---|
| 骨架屏渲染 | 0-16ms(1帧) |
| 首次数据绘制 | <100ms |
| 完全可交互 | <200ms |
| 延迟加载组件 | <500ms |
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 5 * 60 * 1000, // 5分钟
cacheTime: 30 * 60 * 1000, // 30分钟
refetchOnWindowFocus: false,
refetchOnMount: false,
retry: 1,
},
},
});
function Dashboard() {
const { data, isLoading } = useQuery('dashboard', fetchDashboard);
// 立即显示骨架屏,不检查加载状态
return (
<div>
{data ? <RealWidget data={data} /> : <SkeletonWidget />}
</div>
);
}
useMemo 包装调试测试超时时,务必首先使用 screen.debug() 查看实际渲染的内容。
每周安装量
65
代码仓库
GitHub 星标数
78
首次出现
2026年1月24日
安全审计
安装于
cursor58
opencode58
codex57
gemini-cli56
github-copilot53
claude-code50
Expert in building production-grade reactive dashboards that load in <100ms and have comprehensive test coverage.
Skeleton-First Loading
Aggressive Caching
Code Splitting
Memoization Strategy
Mock Strategy
Async Handling
// WRONG - races with React render(<Dashboard />); const element = screen.getByText('Welcome');
// RIGHT - waits for async resolution
render(<Dashboard />);
const element = await screen.findByText('Welcome');
3. Timeout Debugging
* Timeouts mean: missing mock, wrong query, or component not rendering
* Use screen.debug() to see actual DOM
* Check console for unmocked errors
4. Test Wrapper Pattern
const TestProviders = ({ children }) => (
<QueryClientProvider client={testQueryClient}>
<AuthProvider>
{children}
</AuthProvider>
</QueryClientProvider>
);
Check what's actually rendering
render(<Component />); screen.debug(); // See actual DOM
Find unmocked dependencies
Fix async queries
waitFor(() => {...}, { timeout: 3000 })Simplify component tree
| Phase | Target |
|---|---|
| Skeleton render | 0-16ms (1 frame) |
| First data paint | <100ms |
| Full interactive | <200ms |
| Lazy widgets | <500ms |
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 5 * 60 * 1000, // 5min
cacheTime: 30 * 60 * 1000, // 30min
refetchOnWindowFocus: false,
refetchOnMount: false,
retry: 1,
},
},
});
function Dashboard() {
const { data, isLoading } = useQuery('dashboard', fetchDashboard);
// Show skeleton immediately, no loading check
return (
<div>
{data ? <RealWidget data={data} /> : <SkeletonWidget />}
</div>
);
}
When debugging test timeouts, ALWAYS start with screen.debug() to see what actually rendered.
Weekly Installs
65
Repository
GitHub Stars
78
First Seen
Jan 24, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
cursor58
opencode58
codex57
gemini-cli56
github-copilot53
claude-code50
测试策略完整指南:单元/集成/E2E测试金字塔与自动化实践
11,200 周安装