| name | redux-migration-rtk-zustand |
| description | Guía experta para refactorización incremental de Redux clásico a Redux Toolkit (RTK), y posteriormente de RTK a Zustand. Cubre patrones de migración, detección de código legacy, codemods, y verificación sin romper la aplicación. Usar cuando el usuario mencione "migrar redux", "redux toolkit", "rtk migration", "zustand migration", "refactorizar redux", "modernizar estado", o cuando se detecte código Redux legacy en el proyecto. |
Redux Migration: Redux → RTK → Zustand
Migración incremental y segura de Redux clásico a soluciones modernas de state management.
Quick Start
1. Detectar Estado Actual
./scripts/detect_redux_legacy.sh ./src
El script identifica:
- Redux Clásico (createStore, switch/case reducers)
- Redux Toolkit (createSlice, configureStore)
- Zustand (stores existentes)
2. Elegir Ruta de Migración
Redux Clásico → Redux Toolkit (RTK) → Zustand
| Paso | Tecnología | Objetivo |
|---|
| 1 | Redux Toolkit | Eliminar boilerplate, inmutabilidad gratis |
| 2 | RTK Query | Data fetching integrado (opcional) |
| 3 | Zustand | Simplicidad máxima, sin providers |
3. Migrar Incrementalmente
[!CAUTION]
NUNCA migrar todo el store de una vez. Migrar slice por slice.
Orden recomendado:
- Identificar slice menos crítico (ej: UI, preferences)
- Migrar a RTK/Zustand
- Verificar comportamiento + tests
- Repetir con siguiente slice
Fase 1: Redux → RTK (Resumen)
Ejemplo rápido de Store:
import { createStore, combineReducers, applyMiddleware } from "redux";
const store = createStore(rootReducer, applyMiddleware(thunk));
import { configureStore } from "@reduxjs/toolkit";
const store = configureStore({
reducer: { users: usersReducer, products: productsReducer },
});
Ejemplo rápido de Slice:
const usersSlice = createSlice({
name: "users",
initialState: { users: [], loading: false },
reducers: {
addUser: (state, action) => {
state.users.push(action.payload);
},
removeUser: (state, action) => {
state.users = state.users.filter((u) => u.id !== action.payload);
},
},
});
export const { addUser, removeUser } = usersSlice.actions;
📖 Guía completa: references/rtk-migration.md
Fase 2: RTK → Zustand (Resumen)
¿Por qué migrar?
| Aspecto | RTK | Zustand |
|---|
| Bundle size | ~11kb | ~1.2kb |
| Provider | Requerido | No necesario |
| Boilerplate | Reducido | Mínimo |
| TypeScript | Bueno | Excelente |
Ejemplo rápido:
const store = configureStore({ reducer: { users: usersReducer } });
<Provider store={store}><App /></Provider>
export const useUsersStore = create<UsersStore>()((set) => ({
users: [],
addUser: (user) => set((s) => ({ users: [...s.users, user] })),
removeUser: (id) => set((s) => ({ users: s.users.filter(u => u.id !== id) })),
}));
const { users, addUser } = useUsersStore();
📖 Guía completa: references/zustand-migration.md
Checklist de Migración
Fase 1: Redux → RTK
Fase 2: RTK → Zustand
Rollback Strategy
Mantener compatibilidad durante la migración:
export function useUsers() {
const USE_ZUSTAND = process.env.NEXT_PUBLIC_USE_ZUSTAND === "true";
const reduxUsers = useSelector((s) => s.users.users);
const zustandUsers = useUsersStore((s) => s.users);
return USE_ZUSTAND ? zustandUsers : reduxUsers;
}
Constraints
[!WARNING]
Reglas inquebrantables:
- NUNCA migrar más de un slice a la vez
- SIEMPRE verificar tests después de cada slice migrado
- SIEMPRE mantener ambos stores funcionando durante la transición
- NO eliminar Redux hasta verificar que Zustand funciona completamente
- DOCUMENTAR el mapeo de actions/reducers para facilitar debugging
- BACKUP del proyecto antes de cada fase de migración
Referencias
Ejemplos
Scripts
./scripts/detect_redux_legacy.sh [directorio]
Recuerda: La migración segura es incremental. Cada slice debe verificarse antes de continuar con el siguiente.