Ускорение приложений на React и Next.js
Даёт агенту 70 правил Vercel по скорости React и Next.js для написания, проверки и переделки кода.
- Что делает
- Даёт агенту 70 правил Vercel по скорости React и Next.js для написания, проверки и переделки кода.
- Когда брать
- Когда пишете или проверяете код на React или Next.js и хотите, чтобы страницы загружались быстрее, а интерфейс не тормозил.
- Когда не брать
- Если проект не на React и Next.js или нужна работа не с кодом, а с дизайном и текстами.
- Пример запроса
- Проверь наш интернет-магазин на Next.js и найди места, из-за которых страницы каталога грузятся медленно.
- Нужно подключить
- проект на React или Next.js, репозиторий с кодом
Как включить
- Скачайте архив и распакуйте его.
- Положите папку
vercel-react-best-practicesв~/.claude/skills/. - Откройте Claude Code и опишите задачу своими словами: Claude подхватит скилл по описанию.
Текст
---
name: vercel-react-best-practices
description: Рекомендации по оптимизации производительности React и Next.js от инженеров Vercel. Применяй этот скилл, когда пишешь, проверяешь или рефакторишь код на React/Next.js, чтобы использовать оптимальные по производительности приёмы. Срабатывает на задачи с компонентами React, страницами Next.js, загрузкой данных, оптимизацией размера сборки и ускорением работы.
license: MIT
metadata:
author: vercel
version: "1.0.0"
---
Лучшие практики React от Vercel
Полное руководство по оптимизации производительности приложений на React и Next.js, которое ведёт Vercel. Содержит 70 правил в 8 категориях, отсортированных по влиянию, чтобы направлять автоматический рефакторинг и генерацию кода.
Когда применять
Обращайся к этим рекомендациям, когда:
- пишешь новые компоненты React или страницы Next.js
- реализуешь загрузку данных (на клиенте или на сервере)
- проверяешь код на проблемы с производительностью
- рефакторишь существующий код на React/Next.js
- оптимизируешь размер сборки или время загрузки
Категории правил по приоритету
| Приоритет | Категория | Влияние | Префикс |
|---|---|---|---|
| 1 | Устранение «водопадов» запросов | КРИТИЧЕСКОЕ | async- |
| 2 | Оптимизация размера сборки | КРИТИЧЕСКОЕ | bundle- |
| 3 | Производительность на стороне сервера | ВЫСОКОЕ | server- |
| 4 | Загрузка данных на стороне клиента | СРЕДНЕЕ-ВЫСОКОЕ | client- |
| 5 | Оптимизация повторной отрисовки | СРЕДНЕЕ | rerender- |
| 6 | Производительность отрисовки | СРЕДНЕЕ | rendering- |
| 7 | Производительность JavaScript | НИЗКОЕ-СРЕДНЕЕ | js- |
| 8 | Продвинутые приёмы | НИЗКОЕ | advanced- |
Краткий справочник
1. Устранение «водопадов» запросов (КРИТИЧЕСКОЕ)
async-cheap-condition-before-await- Проверяй дешёвые синхронные условия до того, как ждать флаги или удалённые значенияasync-defer-await- Переноси await в те ветки, где результат реально нуженasync-parallel- Используй Promise.all() для независимых операцийasync-dependencies- Используй better-all при частичных зависимостяхasync-api-routes- В маршрутах API запускай промисы раньше, а жди их позжеasync-suspense-boundaries- Используй Suspense для потоковой отдачи содержимого
2. Оптимизация размера сборки (КРИТИЧЕСКОЕ)
bundle-barrel-imports- Импортируй напрямую, избегай «баррельных» файловbundle-analyzable-paths- Предпочитай пути импорта и файловой системы, которые можно проанализировать статически, чтобы не раздувать сборки и трассировкиbundle-dynamic-imports- Используй next/dynamic для тяжёлых компонентовbundle-defer-third-party- Загружай аналитику и логирование после гидратацииbundle-conditional- Загружай модули только тогда, когда функция включенаbundle-preload- Предзагружай при наведении или фокусе, чтобы интерфейс казался быстрее
3. Производительность на стороне сервера (ВЫСОКОЕ)
server-auth-actions- Проверяй авторизацию в серверных действиях так же, как в маршрутах APIserver-cache-react- Используй React.cache() для устранения дублей в рамках одного запросаserver-cache-lru- Используй LRU-кэш для кэширования между запросамиserver-dedup-props- Избегай повторной сериализации в свойствах (props) серверных компонентовserver-hoist-static-io- Выноси статический ввод-вывод (шрифты, логотипы) на уровень модуляserver-no-shared-module-state- Избегай изменяемого состояния запроса на уровне модуля в серверных компонентах и серверной отрисовкеserver-serialization- Своди к минимуму данные, передаваемые клиентским компонентамserver-parallel-fetching- Перестраивай компоненты так, чтобы запросы шли параллельноserver-parallel-nested-fetching- Вложенные запросы для каждого элемента объединяй цепочкой внутри Promise.allserver-after-nonblocking- Используй after() для неблокирующих операций
4. Загрузка данных на стороне клиента (СРЕДНЕЕ-ВЫСОКОЕ)
client-swr-dedup- Используй SWR для автоматического устранения дублей запросовclient-event-listeners- Устраняй дубли глобальных обработчиков событийclient-passive-event-listeners- Используй пассивные обработчики для прокруткиclient-localstorage-schema- Версионируй данные в localStorage и храни их как можно меньше
5. Оптимизация повторной отрисовки (СРЕДНЕЕ)
rerender-defer-reads- Не подписывайся на состояние, которое используется только в обратных вызовахrerender-memo- Выноси дорогую работу в мемоизированные компонентыrerender-memo-with-default-value- Выноси за компонент значения по умолчанию для непримитивных свойствrerender-dependencies- Используй в эффектах примитивные зависимостиrerender-derived-state- Подписывайся на производные булевы значения, а не на исходныеrerender-derived-state-no-effect- Вычисляй производное состояние во время отрисовки, а не в эффектахrerender-functional-setstate- Используй функциональный setState для стабильных обратных вызововrerender-lazy-state-init- Для дорогих начальных значений передавай в useState функциюrerender-simple-expression-in-memo- Не используй memo для простых примитивовrerender-split-combined-hooks- Разделяй хуки с независимыми зависимостямиrerender-move-effect-to-event- Помещай логику взаимодействия в обработчики событийrerender-transitions- Используй startTransition для несрочных обновленийrerender-use-deferred-value- Откладывай дорогую отрисовку, чтобы ввод оставался отзывчивымrerender-use-ref-transient-values- Используй ref для временных, часто меняющихся значенийrerender-no-inline-components- Не определяй компоненты внутри других компонентов
6. Производительность отрисовки (СРЕДНЕЕ)
rendering-animate-svg-wrapper- Анимируй обёртку div, а не сам элемент SVGrendering-content-visibility- Используй content-visibility для длинных списковrendering-hoist-jsx- Выноси статический JSX за пределы компонентовrendering-svg-precision- Уменьшай точность координат SVGrendering-hydration-no-flicker- Для данных, которые есть только на клиенте, используй встроенный скриптrendering-hydration-suppress-warning- Подавляй ожидаемые расхожденияrendering-activity- Используй компонент Activity для показа и скрытияrendering-conditional-render- Для условий используй тернарный оператор, а не &&rendering-usetransition-loading- Для состояния загрузки предпочитай useTransitionrendering-resource-hints- Используй подсказки ресурсов React DOM для предзагрузкиrendering-script-defer-async- Используй defer или async в тегах script
7. Производительность JavaScript (НИЗКОЕ-СРЕДНЕЕ)
js-batch-dom-css- Группируй изменения CSS через классы или cssTextjs-index-maps- Строй Map для повторяющихся поисковjs-cache-property-access- Кэшируй свойства объектов в циклахjs-cache-function-results- Кэшируй результаты функций в Map на уровне модуляjs-cache-storage- Кэшируй чтение из localStorage и sessionStoragejs-combine-iterations- Объединяй несколько filter и map в один циклjs-length-check-first- Проверяй длину массива до дорогого сравненияjs-early-exit- Возвращайся из функций раньшеjs-hoist-regexp- Выноси создание RegExp за пределы цикловjs-min-max-loop- Для минимума и максимума используй цикл, а не сортировкуjs-set-map-lookups- Используй Set и Map для поиска за O(1)js-tosorted-immutable- Используй toSorted() ради неизменяемостиjs-flatmap-filter- Используй flatMap, чтобы преобразовать и отфильтровать за один проходjs-request-idle-callback- Откладывай некритичную работу до простоя браузера
8. Продвинутые приёмы (НИЗКОЕ)
advanced-effect-event-deps- Не добавляй результатыuseEffectEventв зависимости эффектаadvanced-event-handler-refs- Храни обработчики событий в refadvanced-init-once- Инициализируй приложение один раз за загрузкуadvanced-use-latest- useLatest для стабильных ссылок на обратные вызовы
Как пользоваться
Читай отдельные файлы правил: в них подробные объяснения и примеры кода:
rules/async-parallel.md
rules/bundle-barrel-imports.md
В каждом файле правила есть:
- Краткое объяснение, почему это важно
- Пример неправильного кода с пояснением
- Пример правильного кода с пояснением
- Дополнительный контекст и ссылки
Полный собранный документ
Полное руководство со всеми развёрнутыми правилами: AGENTS.md
Перевод: iiuniversitet. Оригинал: https://github.com/vercel-labs/agent-skills/tree/main/skills/react-best-practices, лицензия MIT. Изменения: перевод на русский язык.
Оригинал на английском
--- name: vercel-react-best-practices description: React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements. license: MIT metadata: author: vercel version: "1.0.0" --- # Vercel React Best Practices Comprehensive performance optimization guide for React and Next.js applications, maintained by Vercel. Contains 70 rules across 8 categories, prioritized by impact to guide automated refactoring and code generation. ## When to Apply Reference these guidelines when: - Writing new React components or Next.js pages - Implementing data fetching (client or server-side) - Reviewing code for performance issues - Refactoring existing React/Next.js code - Optimizing bundle size or load times ## Rule Categories by Priority | Priority | Category | Impact | Prefix | |----------|----------|--------|--------| | 1 | Eliminating Waterfalls | CRITICAL | `async-` | | 2 | Bundle Size Optimization | CRITICAL | `bundle-` | | 3 | Server-Side Performance | HIGH | `server-` | | 4 | Client-Side Data Fetching | MEDIUM-HIGH | `client-` | | 5 | Re-render Optimization | MEDIUM | `rerender-` | | 6 | Rendering Performance | MEDIUM | `rendering-` | | 7 | JavaScript Performance | LOW-MEDIUM | `js-` | | 8 | Advanced Patterns | LOW | `advanced-` | ## Quick Reference ### 1. Eliminating Waterfalls (CRITICAL) - `async-cheap-condition-before-await` - Check cheap sync conditions before awaiting flags or remote values - `async-defer-await` - Move await into branches where actually used - `async-parallel` - Use Promise.all() for independent operations - `async-dependencies` - Use better-all for partial dependencies - `async-api-routes` - Start promises early, await late in API routes - `async-suspense-boundaries` - Use Suspense to stream content ### 2. Bundle Size Optimization (CRITICAL) - `bundle-barrel-imports` - Import directly, avoid barrel files - `bundle-analyzable-paths` - Prefer statically analyzable import and file-system paths to avoid broad bundles and traces - `bundle-dynamic-imports` - Use next/dynamic for heavy components - `bundle-defer-third-party` - Load analytics/logging after hydration - `bundle-conditional` - Load modules only when feature is activated - `bundle-preload` - Preload on hover/focus for perceived speed ### 3. Server-Side Performance (HIGH) - `server-auth-actions` - Authenticate server actions like API routes - `server-cache-react` - Use React.cache() for per-request deduplication - `server-cache-lru` - Use LRU cache for cross-request caching - `server-dedup-props` - Avoid duplicate serialization in RSC props - `server-hoist-static-io` - Hoist static I/O (fonts, logos) to module level - `server-no-shared-module-state` - Avoid module-level mutable request state in RSC/SSR - `server-serialization` - Minimize data passed to client components - `server-parallel-fetching` - Restructure components to parallelize fetches - `server-parallel-nested-fetching` - Chain nested fetches per item in Promise.all - `server-after-nonblocking` - Use after() for non-blocking operations ### 4. Client-Side Data Fetching (MEDIUM-HIGH) - `client-swr-dedup` - Use SWR for automatic request deduplication - `client-event-listeners` - Deduplicate global event listeners - `client-passive-event-listeners` - Use passive listeners for scroll - `client-localstorage-schema` - Version and minimize localStorage data ### 5. Re-render Optimization (MEDIUM) - `rerender-defer-reads` - Don't subscribe to state only used in callbacks - `rerender-memo` - Extract expensive work into memoized components - `rerender-memo-with-default-value` - Hoist default non-primitive props - `rerender-dependencies` - Use primitive dependencies in effects - `rerender-derived-state` - Subscribe to derived booleans, not raw values - `rerender-derived-state-no-effect` - Derive state during render, not effects - `rerender-functional-setstate` - Use functional setState for stable callbacks - `rerender-lazy-state-init` - Pass function to useState for expensive values - `rerender-simple-expression-in-memo` - Avoid memo for simple primitives - `rerender-split-combined-hooks` - Split hooks with independent dependencies - `rerender-move-effect-to-event` - Put interaction logic in event handlers - `rerender-transitions` - Use startTransition for non-urgent updates - `rerender-use-deferred-value` - Defer expensive renders to keep input responsive - `rerender-use-ref-transient-values` - Use refs for transient frequent values - `rerender-no-inline-components` - Don't define components inside components ### 6. Rendering Performance (MEDIUM) - `rendering-animate-svg-wrapper` - Animate div wrapper, not SVG element - `rendering-content-visibility` - Use content-visibility for long lists - `rendering-hoist-jsx` - Extract static JSX outside components - `rendering-svg-precision` - Reduce SVG coordinate precision - `rendering-hydration-no-flicker` - Use inline script for client-only data - `rendering-hydration-suppress-warning` - Suppress expected mismatches - `rendering-activity` - Use Activity component for show/hide - `rendering-conditional-render` - Use ternary, not && for conditionals - `rendering-usetransition-loading` - Prefer useTransition for loading state - `rendering-resource-hints` - Use React DOM resource hints for preloading - `rendering-script-defer-async` - Use defer or async on script tags ### 7. JavaScript Performance (LOW-MEDIUM) - `js-batch-dom-css` - Group CSS changes via classes or cssText - `js-index-maps` - Build Map for repeated lookups - `js-cache-property-access` - Cache object properties in loops - `js-cache-function-results` - Cache function results in module-level Map - `js-cache-storage` - Cache localStorage/sessionStorage reads - `js-combine-iterations` - Combine multiple filter/map into one loop - `js-length-check-first` - Check array length before expensive comparison - `js-early-exit` - Return early from functions - `js-hoist-regexp` - Hoist RegExp creation outside loops - `js-min-max-loop` - Use loop for min/max instead of sort - `js-set-map-lookups` - Use Set/Map for O(1) lookups - `js-tosorted-immutable` - Use toSorted() for immutability - `js-flatmap-filter` - Use flatMap to map and filter in one pass - `js-request-idle-callback` - Defer non-critical work to browser idle time ### 8. Advanced Patterns (LOW) - `advanced-effect-event-deps` - Don't put `useEffectEvent` results in effect deps - `advanced-event-handler-refs` - Store event handlers in refs - `advanced-init-once` - Initialize app once per app load - `advanced-use-latest` - useLatest for stable callback refs ## How to Use Read individual rule files for detailed explanations and code examples: ``` rules/async-parallel.md rules/bundle-barrel-imports.md ``` Each rule file contains: - Brief explanation of why it matters - Incorrect code example with explanation - Correct code example with explanation - Additional context and references ## Full Compiled Document For the complete guide with all rules expanded: `AGENTS.md`
Источник: agent-skills / vercel-react-best-practices ↗. Ссылка проверена 2026-10-11.