Optimiza el rendimiento, accesibilidad y experiencia de usuario de tus escenas Spline
Nota: Esta página usa 'use client' para habilitar la interactividad de los botones de copiar código.
Carga las escenas solo cuando son necesarias
import { lazy, Suspense } from 'react';const SplineScene = lazy(() => import('./SplineScene'));export default function App() {return (<Suspense fallback={<div>Cargando escena 3D...</div>}><SplineScene /></Suspense>);}
Reduce el tamaño de los archivos .splinecode
// En Spline Editor:// 1. Reduce la calidad de texturas// 2. Optimiza geometrías complejas// 3. Usa instancias para objetos repetidos// 4. Limita el número de luces// 5. Exporta solo lo necesario
Precarga recursos críticos
// En tu layout.tsx o _document.tsx<link rel="preload" href="/escena-principal.splinecode" as="fetch" /><link rel="preload" href="/texturas-principales.jpg" as="image" />
Respeta las preferencias de movimiento del usuario
@media (prefers-reduced-motion: reduce) {.spline-container {display: none;}.fallback-content {display: block;}}
Proporciona alternativas para usuarios con discapacidades
export default function AccessibleSpline() {return (<div><divclassName="spline-container"role="img"aria-label="Escena 3D interactiva mostrando un logo animado"><Spline scene="/escena.splinecode" /></div><div className="sr-only"><p>Esta escena muestra un logo animado en 3D con efectos de luz.</p></div></div>);}
Permite navegación por teclado
useEffect(() => {const handleKeyPress = (e) => {if (e.key === 'Escape') {// Pausar o cerrar escenasetSplinePaused(true);}};document.addEventListener('keydown', handleKeyPress);return () => document.removeEventListener('keydown', handleKeyPress);}, []);
Proporciona feedback visual durante la carga
export default function SplineWithLoading() {const [isLoading, setIsLoading] = useState(true);const [progress, setProgress] = useState(0);return (<div className="relative">{isLoading && (<div className="absolute inset-0 flex items-center justify-center bg-gray-100 dark:bg-gray-800"><div className="text-center"><div className="animate-spin rounded-full h-12 w-12 border-b-2 border-pink-500 mx-auto mb-4"></div><p className="text-gray-600 dark:text-gray-300">Cargando experiencia 3D... {progress}%</p></div></div>)}<Splinescene="/escena.splinecode"onLoad={() => setIsLoading(false)}/></div>);}
Maneja errores de manera elegante
export default function RobustSpline() {const [hasError, setHasError] = useState(false);const [retryCount, setRetryCount] = useState(0);const handleError = () => {setHasError(true);if (retryCount < 3) {setTimeout(() => {setRetryCount(prev => prev + 1);setHasError(false);}, 2000);}};if (hasError && retryCount >= 3) {return (<div className="flex items-center justify-center h-96 bg-gray-100 dark:bg-gray-800 rounded-lg"><div className="text-center"><p className="text-gray-600 dark:text-gray-300 mb-4">No se pudo cargar la escena 3D</p><buttononClick={() => {setRetryCount(0);setHasError(false);}}className="px-4 py-2 bg-pink-500 text-white rounded-lg hover:bg-pink-600 transition-colors">Reintentar</button></div></div>);}return (<Splinescene="/escena.splinecode"onError={handleError}/>);}
Adapta las escenas a diferentes dispositivos
export default function ResponsiveSpline() {const [isMobile, setIsMobile] = useState(false);useEffect(() => {const checkMobile = () => {setIsMobile(window.innerWidth < 768);};checkMobile();window.addEventListener('resize', checkMobile);return () => window.removeEventListener('resize', checkMobile);}, []);return (<div className={`spline-container ${isMobile ? 'mobile-optimized' : 'desktop-optimized'}`}><Splinescene={isMobile ? "/escena-mobile.splinecode" : "/escena-desktop.splinecode"}style={{width: isMobile ? '100%' : '120%',height: isMobile ? '100%' : '120%'}}/></div>);}