[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-644d24a5-5dbe-4472-9155-8abd341dcdf4":3,"$fnG4q2XQmL0VjS5DszwPGxoF_ID-Q_LcQNC3t3Fff3Ag":43},{"id":4,"title":5,"description":6,"categoryId":7,"moduleId":8,"tags":9,"prompt":10,"icon":11,"source":12,"sourceUrl":13,"authorId":14,"authorName":15,"isPublic":16,"stars":17,"runs":18,"createdAt":19,"updatedAt":19,"module":20,"category":27,"packages":34},"644d24a5-5dbe-4472-9155-8abd341dcdf4","react-best-practices","React和Next.js应用程序的综合性能优化指南，由Vercel维护。在编写新的React组件或Next.js页面、实现数据获取（客户端或服务器端）或审查代码以查找性能问题时使用。","cat_coding_frontend","mod_coding","sickn33,coding","---\nname: react-best-practices\ndescription: \"Comprehensive performance optimization guide for React and Next.js applications, maintained by Vercel. Use when writing new React components or Next.js pages, implementing data fetching (client or server-side), or reviewing code for performance issues.\"\nrisk: safe\nsource: community\ndate_added: \"2026-02-27\"\n---\n\n# Vercel React Best Practices\n\nComprehensive performance optimization guide for React and Next.js applications, maintained by Vercel. Contains 45 rules across 8 categories, prioritized by impact to guide automated refactoring and code generation.\n\n## When to Use\nReference these guidelines when:\n- Writing new React components or Next.js pages\n- Implementing data fetching (client or server-side)\n- Reviewing code for performance issues\n- Refactoring existing React\u002FNext.js code\n- Optimizing bundle size or load times\n\n## Rule Categories by Priority\n\n| Priority | Category | Impact | Prefix |\n|----------|----------|--------|--------|\n| 1 | Eliminating Waterfalls | CRITICAL | `async-` |\n| 2 | Bundle Size Optimization | CRITICAL | `bundle-` |\n| 3 | Server-Side Performance | HIGH | `server-` |\n| 4 | Client-Side Data Fetching | MEDIUM-HIGH | `client-` |\n| 5 | Re-render Optimization | MEDIUM | `rerender-` |\n| 6 | Rendering Performance | MEDIUM | `rendering-` |\n| 7 | JavaScript Performance | LOW-MEDIUM | `js-` |\n| 8 | Advanced Patterns | LOW | `advanced-` |\n\n## Quick Reference\n\n### 1. Eliminating Waterfalls (CRITICAL)\n\n- `async-defer-await` - Move await into branches where actually used\n- `async-parallel` - Use Promise.all() for independent operations\n- `async-dependencies` - Use better-all for partial dependencies\n- `async-api-routes` - Start promises early, await late in API routes\n- `async-suspense-boundaries` - Use Suspense to stream content\n\n### 2. Bundle Size Optimization (CRITICAL)\n\n- `bundle-barrel-imports` - Import directly, avoid barrel files\n- `bundle-dynamic-imports` - Use next\u002Fdynamic for heavy components\n- `bundle-defer-third-party` - Load analytics\u002Flogging after hydration\n- `bundle-conditional` - Load modules only when feature is activated\n- `bundle-preload` - Preload on hover\u002Ffocus for perceived speed\n\n### 3. Server-Side Performance (HIGH)\n\n- `server-cache-react` - Use React.cache() for per-request deduplication\n- `server-cache-lru` - Use LRU cache for cross-request caching\n- `server-serialization` - Minimize data passed to client components\n- `server-parallel-fetching` - Restructure components to parallelize fetches\n- `server-after-nonblocking` - Use after() for non-blocking operations\n\n### 4. Client-Side Data Fetching (MEDIUM-HIGH)\n\n- `client-swr-dedup` - Use SWR for automatic request deduplication\n- `client-event-listeners` - Deduplicate global event listeners\n\n### 5. Re-render Optimization (MEDIUM)\n\n- `rerender-defer-reads` - Don't subscribe to state only used in callbacks\n- `rerender-memo` - Extract expensive work into memoized components\n- `rerender-dependencies` - Use primitive dependencies in effects\n- `rerender-derived-state` - Subscribe to derived booleans, not raw values\n- `rerender-functional-setstate` - Use functional setState for stable callbacks\n- `rerender-lazy-state-init` - Pass function to useState for expensive values\n- `rerender-transitions` - Use startTransition for non-urgent updates\n\n### 6. Rendering Performance (MEDIUM)\n\n- `rendering-animate-svg-wrapper` - Animate div wrapper, not SVG element\n- `rendering-content-visibility` - Use content-visibility for long lists\n- `rendering-hoist-jsx` - Extract static JSX outside components\n- `rendering-svg-precision` - Reduce SVG coordinate precision\n- `rendering-hydration-no-flicker` - Use inline script for client-only data\n- `rendering-activity` - Use Activity component for show\u002Fhide\n- `rendering-conditional-render` - Use ternary, not && for conditionals\n\n### 7. JavaScript Performance (LOW-MEDIUM)\n\n- `js-batch-dom-css` - Group CSS changes via classes or cssText\n- `js-index-maps` - Build Map for repeated lookups\n- `js-cache-property-access` - Cache object properties in loops\n- `js-cache-function-results` - Cache function results in module-level Map\n- `js-cache-storage` - Cache localStorage\u002FsessionStorage reads\n- `js-combine-iterations` - Combine multiple filter\u002Fmap into one loop\n- `js-length-check-first` - Check array length before expensive comparison\n- `js-early-exit` - Return early from functions\n- `js-hoist-regexp` - Hoist RegExp creation outside loops\n- `js-min-max-loop` - Use loop for min\u002Fmax instead of sort\n- `js-set-map-lookups` - Use Set\u002FMap for O(1) lookups\n- `js-tosorted-immutable` - Use toSorted() for immutability\n\n### 8. Advanced Patterns (LOW)\n\n- `advanced-event-handler-refs` - Store event handlers in refs\n- `advanced-use-latest` - useLatest for stable callback refs\n\n## How to Use\n\nRead individual rule files for detailed explanations and code examples:\n\n```\nrules\u002Fasync-parallel.md\nrules\u002Fbundle-barrel-imports.md\nrules\u002F_sections.md\n```\n\nEach rule file contains:\n- Brief explanation of why it matters\n- Incorrect code example with explanation\n- Correct code example with explanation\n- Additional context and references\n\n## Full Compiled Document\n\nFor the complete guide with all rules expanded: `AGENTS.md`\n\n### When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.\n","","imported","https:\u002F\u002Fgithub.com\u002Fsickn33\u002Fantigravity-awesome-skills","user_system_seed","SkillOPIC",true,206,114,"2026-05-16 13:36:19",{"id":8,"name":21,"slug":22,"icon":23,"description":24,"sort":25,"createdAt":26},"编程开发","coding","mdi-code-braces","代码生成、调试、审查，提升开发效率",2,"2026-05-16 12:53:40",{"id":7,"name":28,"slug":29,"icon":30,"description":31,"moduleId":8,"sort":32,"skillCount":33,"createdAt":26},"前端开发","frontend","mdi-language-html5","HTML\u002FCSS\u002FJavaScript\u002F框架相关",1,96,[35],{"id":36,"skillId":4,"version":37,"fileName":38,"fileSize":39,"filePath":40,"fileHash":41,"manifest":42,"createdAt":19},"f3d0d107-d63e-4fc8-8f64-6be18ac2626a","1.0.0","react-best-practices.zip",55395,"uploads\u002Fskills\u002F644d24a5-5dbe-4472-9155-8abd341dcdf4\u002Freact-best-practices.zip","b7f1b14af08c83b35f69d05468c055d2d87e0eef59e9ef1488b7655e373a4f8a","[{\"path\":\"AGENTS.md\",\"isDirectory\":false,\"size\":60535},{\"path\":\"README.md\",\"isDirectory\":false,\"size\":3360},{\"path\":\"SKILL.md\",\"isDirectory\":false,\"size\":5649},{\"path\":\"metadata.json\",\"isDirectory\":false,\"size\":921},{\"path\":\"rules\u002F_sections.md\",\"isDirectory\":false,\"size\":1554},{\"path\":\"rules\u002F_template.md\",\"isDirectory\":false,\"size\":631},{\"path\":\"rules\u002Fadvanced-event-handler-refs.md\",\"isDirectory\":false,\"size\":1478},{\"path\":\"rules\u002Fadvanced-use-latest.md\",\"isDirectory\":false,\"size\":1191},{\"path\":\"rules\u002Fasync-api-routes.md\",\"isDirectory\":false,\"size\":1125},{\"path\":\"rules\u002Fasync-defer-await.md\",\"isDirectory\":false,\"size\":2028},{\"path\":\"rules\u002Fasync-dependencies.md\",\"isDirectory\":false,\"size\":942},{\"path\":\"rules\u002Fasync-parallel.md\",\"isDirectory\":false,\"size\":654},{\"path\":\"rules\u002Fasync-suspense-boundaries.md\",\"isDirectory\":false,\"size\":2510},{\"path\":\"rules\u002Fbundle-barrel-imports.md\",\"isDirectory\":false,\"size\":2370},{\"path\":\"rules\u002Fbundle-conditional.md\",\"isDirectory\":false,\"size\":866},{\"path\":\"rules\u002Fbundle-defer-third-party.md\",\"isDirectory\":false,\"size\":920},{\"path\":\"rules\u002Fbundle-dynamic-imports.md\",\"isDirectory\":false,\"size\":791},{\"path\":\"rules\u002Fbundle-preload.md\",\"isDirectory\":false,\"size\":1149},{\"path\":\"rules\u002Fclient-event-listeners.md\",\"isDirectory\":false,\"size\":1969},{\"path\":\"rules\u002Fclient-swr-dedup.md\",\"isDirectory\":false,\"size\":1159},{\"path\":\"rules\u002Fjs-batch-dom-css.md\",\"isDirectory\":false,\"size\":1902},{\"path\":\"rules\u002Fjs-cache-function-results.md\",\"isDirectory\":false,\"size\":1949},{\"path\":\"rules\u002Fjs-cache-property-access.md\",\"isDirectory\":false,\"size\":532},{\"path\":\"rules\u002Fjs-cache-storage.md\",\"isDirectory\":false,\"size\":1651},{\"path\":\"rules\u002Fjs-combine-iterations.md\",\"isDirectory\":false,\"size\":753},{\"path\":\"rules\u002Fjs-early-exit.md\",\"isDirectory\":false,\"size\":1133},{\"path\":\"rules\u002Fjs-hoist-regexp.md\",\"isDirectory\":false,\"size\":1028},{\"path\":\"rules\u002Fjs-index-maps.md\",\"isDirectory\":false,\"size\":837},{\"path\":\"rules\u002Fjs-length-check-first.md\",\"isDirectory\":false,\"size\":1752},{\"path\":\"rules\u002Fjs-min-max-loop.md\",\"isDirectory\":false,\"size\":2105},{\"path\":\"rules\u002Fjs-set-map-lookups.md\",\"isDirectory\":false,\"size\":532},{\"path\":\"rules\u002Fjs-tosorted-immutable.md\",\"isDirectory\":false,\"size\":1782},{\"path\":\"rules\u002Frendering-activity.md\",\"isDirectory\":false,\"size\":564},{\"path\":\"rules\u002Frendering-animate-svg-wrapper.md\",\"isDirectory\":false,\"size\":1185},{\"path\":\"rules\u002Frendering-conditional-render.md\",\"isDirectory\":false,\"size\":980},{\"path\":\"rules\u002Frendering-content-visibility.md\",\"isDirectory\":false,\"size\":815},{\"path\":\"rules\u002Frendering-hoist-jsx.md\",\"isDirectory\":false,\"size\":1039},{\"path\":\"rules\u002Frendering-hydration-no-flicker.md\",\"isDirectory\":false,\"size\":2308},{\"path\":\"rules\u002Frendering-svg-precision.md\",\"isDirectory\":false,\"size\":588},{\"path\":\"rules\u002Frerender-defer-reads.md\",\"isDirectory\":false,\"size\":973},{\"path\":\"rules\u002Frerender-dependencies.md\",\"isDirectory\":false,\"size\":824},{\"path\":\"rules\u002Frerender-derived-state.md\",\"isDirectory\":false,\"size\":724},{\"path\":\"rules\u002Frerender-functional-setstate.md\",\"isDirectory\":false,\"size\":2968},{\"path\":\"rules\u002Frerender-lazy-state-init.md\",\"isDirectory\":false,\"size\":2016},{\"path\":\"rules\u002Frerender-memo.md\",\"isDirectory\":false,\"size\":1148},{\"path\":\"rules\u002Frerender-transitions.md\",\"isDirectory\":false,\"size\":1055},{\"path\":\"rules\u002Fserver-after-nonblocking.md\",\"isDirectory\":false,\"size\":2012},{\"path\":\"rules\u002Fserver-cache-lru.md\",\"isDirectory\":false,\"size\":1353},{\"path\":\"rules\u002Fserver-cache-react.md\",\"isDirectory\":false,\"size\":681},{\"path\":\"rules\u002Fserver-parallel-fetching.md\",\"isDirectory\":false,\"size\":1515},{\"path\":\"rules\u002Fserver-serialization.md\",\"isDirectory\":false,\"size\":996}]",{"code":44,"message":45,"data":46},200,"success",{"items":47,"stats":48,"page":51},[],{"averageRating":49,"totalRatings":49,"ratingCounts":50},0,[49,49,49,49,49],{"limit":52,"offset":49,"hasMore":53,"nextOffset":52,"ratedOnly":16},15,false]