Inicialización Perezosa de Estado (Lazy State)
Operaciones sincrónicas como leer de localStorage, parsear JSON grande o inicializar un AudioContext de la Web Audio API no deben ejecutarse en la fase inicial de carga ni en cada renderizado.
1. Antipatrón vs Patrón Recomendado
// ANTIPATRÓN: Lee y parsea localStorage en cada ciclo
const [historial, setHistorial] = useState(
JSON.parse(localStorage.getItem('ryukami-historial') || '[]')
);
// PATRÓN RECOMENDADO: Inicializador perezoso (solo se ejecuta 1 vez)
const [historial, setHistorial] = useState(() => {
try {
const raw = localStorage.getItem('ryukami-historial');
return raw ? JSON.parse(raw) : [];
} catch {
return [];
}
});2. Inicialización de AudioContext Bajo Interacción del Usuario
Los navegadores modernos bloquean la reproducción de audio hasta que el usuario interactúa con la página. Ryukami-UI inicializa el AudioContext únicamente tras el primer clic o pulsación:
let audioCtx: AudioContext | null = null;
function getAudioContext(): AudioContext {
if (!audioCtx) {
const AudioClass = window.AudioContext || (window as any).webkitAudioContext;
audioCtx = new AudioClass();
}
if (audioCtx.state === 'suspended') {
audioCtx.resume();
}
return audioCtx;
}