Resolviendo el error de Turbopack con MDX en NextJS 15
Publicado el 29 de septiembre, 2025 • 8 min de lectura
Si estás usando NextJS 15 con MDX para crear contenido (como documentación o un blog), probablemente te hayas encontrado con este frustrante error cuando intentas usar Turbopack:
Error: 'client-only' cannot be imported from a Server Component module.
En este artículo te explico qué está pasando, por qué ocurre y cómo solucionarlo definitivamente.
El contexto: ¿Qué es Turbopack?
Turbopack es el nuevo bundler de NextJS, diseñado para ser más rápido que Webpack. Cuando creas un proyecto nuevo con create-next-app
, NextJS 15 lo configura por defecto:
// package.json
{
"scripts": {
"dev": "next dev --turbopack",
"build": "next build --turbopack"
}
}
Turbopack en NextJS 15
Turbopack promete builds hasta 10x más rápidos que Webpack en desarrollo. Sin embargo, aún está en desarrollo activo y no todas las features están completamente soportadas.
El problema: Turbopack + MDX = Error
Cuando intentas usar MDX con Turbopack, ves este error:
Error: loader C:\...\node_modules\@next\mdx\mdx-js-loader.js
for match "#next-mdx" does not have serializable options.
Ensure that options passed are plain JavaScript objects and values.
O este otro:
Error: 'client-only' cannot be imported from a Server Component module.
It should only be used from a Client Component.
¿Por qué pasa esto?
El problema es que Turbopack aún no tiene soporte completo para el loader de MDX. MDX usa un sistema de loaders personalizado que Webpack maneja bien, pero Turbopack todavía no puede procesar correctamente.
Específicamente:
- MDX necesita transformar archivos
.mdx
a JavaScript - El loader de MDX (
@next/mdx
) usa configuraciones complejas - Turbopack no puede serializar estas configuraciones correctamente
- Resultado: el build falla
La solución: Usar Webpack (temporalmente)
La solución más simple y efectiva es desactivar Turbopack y volver a usar Webpack hasta que Turbopack tenga soporte completo para MDX.
Abre tu package.json
Busca la sección de scripts
Quita --turbopack
de los scripts
// Antes
{
"scripts": {
"dev": "next dev --turbopack",
"build": "next build --turbopack"
}
}
// Después
{
"scripts": {
"dev": "next dev",
"build": "next build"
}
}
Reinicia tu servidor de desarrollo
# Detén el servidor (Ctrl+C)
# Limpia el cache
rm -rf .next
# Reinicia
npm run dev
¡Eso es todo! Tu aplicación ahora usará Webpack en lugar de Turbopack, y MDX funcionará perfectamente.
Después de este cambio, todos tus archivos .mdx
deberían compilar sin errores.
¿Cuál es el impacto?
Probablemente te preguntes: "¿Perderé velocidad al usar Webpack?"
La respuesta corta es: depende del tamaño de tu proyecto.
Comparación de rendimiento
Para proyectos pequeños a medianos (como la mayoría de blogs y documentación), la diferencia en velocidad es mínima y no afectará tu experiencia de desarrollo.
Impacto por tamaño de proyecto:
- Proyectos pequeños (menos de 50 páginas): La diferencia es casi imperceptible
- Proyectos medianos (50-200 páginas): Diferencia perceptible pero manejable
- Proyectos grandes (más de 200 páginas): Diferencia significativa
Mi recomendación
Si tu proyecto tiene menos de 100 páginas, usar Webpack en lugar de Turbopack no será un problema. Prioriza que tu código funcione sobre que compile 2 segundos más rápido.
Alternativas avanzadas
Si realmente necesitas Turbopack (proyectos muy grandes), tienes estas opciones:
Opción 1: Usar .tsx
en lugar de .mdx
Puedes escribir tu contenido en archivos .tsx
normales importando componentes manualmente:
// app/blog/mi-post/page.tsx
import Callout from '@/components/Callout'
export default function BlogPost() {
return (
<article>
<h1>Mi Post</h1>
<p>Contenido del post...</p>
<Callout type="info">
Una nota importante
</Callout>
</article>
)
}
Pros:
- Funciona con Turbopack
- Type safety completo
- Más control sobre el código
Contras:
- Más verboso que MDX
- Tienes que importar cada componente manualmente
- No tienes la comodidad de escribir en Markdown
Opción 2: Usar un CMS headless
Puedes mover tu contenido a un CMS como:
- Sanity
- Contentful
- Strapi
Obtienes el contenido vía API y lo renderizas en componentes .tsx
.
Pros:
- Funciona con Turbopack
- Editor visual para contenido
- Colaboración más fácil
Contras:
- Configuración inicial compleja
- Posible costo adicional
- Dependencia externa
Opción 3: Esperar a soporte oficial
NextJS está trabajando activamente en mejorar el soporte de Turbopack. Puedes:
- Seguir el progreso en el repositorio oficial
- Subscribirte a las release notes
- Probar en futuras versiones
Vercel ha confirmado que el soporte completo de MDX en Turbopack está en su roadmap. Es cuestión de tiempo.
Verificando que funciona
Después de hacer el cambio, verifica que todo funciona correctamente:
Crea o abre un archivo .mdx
Por ejemplo: app/blog/test/page.mdx
Agrega contenido de prueba
# Test Post
Este es un post de prueba para verificar que MDX funciona.
## Características
- Markdown normal ✅
- Componentes React ✅
- Imports ✅
Navega a la ruta en tu navegador
http://localhost:3000/blog/test
Verifica que no hay errores
Si ves el contenido renderizado correctamente, todo está funcionando correctamente.
¿Cuándo volver a Turbopack?
Deberías considerar volver a Turbopack cuando:
- NextJS anuncie soporte oficial completo para MDX
- Tu proyecto crezca significativamente (200+ páginas)
- Los builds con Webpack se vuelvan notablemente lentos
- Hayas actualizado a una versión que lo soporte
Mientras tanto, Webpack es la opción más confiable y estable.
Conclusión
El error de Turbopack con MDX en NextJS 15 es un problema conocido causado por soporte incompleto del bundler. La solución es simple:
- Quita
--turbopack
de tus scripts - Usa Webpack (el default de NextJS)
- Espera a que Turbopack tenga soporte completo
Para la mayoría de proyectos, esta solución no tendrá impacto perceptible en velocidad de desarrollo. Prioriza código que funcione sobre velocidad de compilación marginal.
Recursos adicionales
¿Te ayudó este artículo? Compártelo con otros desarrolladores que puedan estar enfrentando el mismo problema.
Sobre el autor: Rod Alexanderson es desarrollador web especializado en NextJS y React. Crea documentación técnica en español para ayudar a la comunidad de desarrolladores en Latinoamérica.