About react19-concurrent-patterns
A reference skill for preserving React 18 concurrent patterns during React 19 migrations and adopting new React 19 APIs afterward. It is intended for developers reviewing migration changes and planning post-migration cleanup.
Key features
- 01Preserve `useTransition` and `useDeferredValue` patterns
- 02Keep Suspense and lazy code splitting intact
- 03Explain new React 19 APIs for later adoption
- 04Check migration edits for concurrent-mode changes
Use cases
- 01Review React 19 migration diffs
- 02Protect concurrent patterns in a React 18 codebase
- 03Plan a post-migration API cleanup
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ github/ awesome-copilot --skill react19-concurrent-patternsAfter installing, type/react19-concurrent-patternsin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
references/react19-actions.mdreact19-suspense.mdreact19-use.mdDetails
From the project READMEReact 19 Concurrent Patterns
React 19 introduced new APIs that complement the migration work. This skill covers two concerns:
- Preserve existing React 18 concurrent patterns that must not be broken during migration
- Adopt new React 19 APIs worth introducing after migration stabilizes
Part 1 Preserve: React 18 Concurrent Patterns That Must Survive the Migration
These patterns exist in React 18 codebases and must not be accidentally removed or broken:
createRoot Already Migrated by the R18 Orchestra
If the R18 orchestra already ran, ReactDOM.render → createRoot is done. Verify it's correct:
// CORRECT React 19 root (same as React 18):
import { createRoot } from 'react-dom/client';
const root = createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
useTransition No Migration Needed
useTransition from React 18 works identically in React 19. Do not touch these patterns during migration:
// React 18 useTransition unchanged in React 19:
const [isPending, startTransition] = useTransition();
function handleClick() {
startTransition(() => {
setFilteredResults(computeExpensiveFilter(input));
});
}
useDeferredValue No Migration Needed
// React 18 useDeferredValue unchanged in React 19:
const deferredQuery = useDeferredValue(query);
Suspense for Code Splitting No Migration Needed
// React 18 Suspense with lazy unchanged in React 19:
const LazyComponent = React.lazy(() => import('./LazyComponent'));
function App() {
return (
<Suspense fallback={<Spinner />}>
<LazyComponent />
</Suspense>
);
}
Part 2 React 19 New APIs
These are worth adopting in a post-migration cleanup sprint. Do not introduce these DURING the migration stabilize first.
For full patterns on each new API, read:
references/react19-use.mdtheuse()hook for promises and contextreferences/react19-actions.mdActions, useActionState, useFormStatus, useOptimisticreferences/react19-suspense.mdSuspense for data fetching (the new pattern)
Migration Safety Rules
During the React 19 migration itself, these concurrent-mode patterns must be left completely untouched:
# Verify nothing touched these during migration:
grep -rn "useTransition\|useDeferredValue\|Suspense\|startTransition" \
src/ --include="*.js" --include="*.jsx" | grep -v "\.test\."
If the migrator touched any of these files, review the changes the migration should only have modified React API surface (forwardRef, defaultProps, etc.), never concurrent mode logic.